shell脚本学习指南(笔记持续更新)

作为运维,shell脚本编程语言是门必修课,基础好可以大大增加平时的工作效率.从上个公司到现在公司我都接触了一些非常专业的DBA和高级运维,认识到了自己基础的薄弱.所以我准备在6月底之前系统的学习完<shell脚本学习指南这本书>,下面是我平时看书练习做的笔记,会不定期更新,当然我也推荐大家购买这本书来学习.转载请注明出处,谢谢!https://www.llq.fun/?p=899&preview=true

第一章UNIX简介
UNIX诞生于贝尔实验室的计算机科学研究中心,最受欢迎的功能就是将设备视为文件。
1、脚本编程(解释性)语言与编译型语言的差异
许多中大型程序都是编译型语言(C、C++、Java...)写的,这类程序只要从源代码转换成目标代码,便能通过计算机来执行。优点是高效,但是缺点是一些简单的操作难以实现。
备注:java的编译器先将其编译为class文件,也就是字节码;然后将字节码交由jvm(java虚拟机)解释执行。一次编译,到处执行
编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。
脚本编程语言(Shell、Perl、Python、Ruby)也可以称为解释性语言,这类程序的执行是由解释器读入程序代码再转换执行。这样解释性语言每执行一次就要翻译一次,效率比较低。
2、为什么使用shell脚本
优点:运行在编译型语言更高的层级,脚本执行速度快,能够轻易处理文件与目录之类的对象。
各unix系之间通用,经过posix标准化。具有简单些、可移植性(跨平台性)、开发容易的特点
缺点:效率不如编译型语言
3、脚本开头的#!内核会扫描该部分并确认解释器的完整路径,内核会以指定的选项来引用解释器。
第二章入门
1、cat > test 后面接测试过的命令,然后把命令输入到文件中,加上x权限就可以执行了。
2、cd /llq ; touch 111分号可以隔开,命令会依次执行。如果后面接&符合,则shell会在后台执行命令(在此命令结束前,可以继续执行下一个命令)。
3、shell识别三种命令:内建命令,shell函数,外部命令
内建命令是shell本身所执行的命令;
shell函数是功能健全的一系列shell语言写出的程序代码,他们可以像一般命令一样引用;
外部命令是由shell副本所执行的命令;
(1)建立进程,此进程为shell的一个副本。
(2)在新进程里,通过PATH变量来寻找命令:/bin:/usr/bin:/usr/local/bin.....
4、变量(variable)就是为某个信息片段所起的名字。所有程序语言都有变量,shell也一样,变量值可以为空。
当赋予变量的值有空格是需要加上“”,例如test="hello word"。
如果需要同时将几个变量连接起来,也需要加上引号,例如fullname="$first $second $third"
5、简单的echo输出
echo任务就是产生输出,可以用来提示用户,或者将输出保存到某个文件,echo后面接空格,以换行符结尾。
6、基本的IO重定向
标准输出/输出是软件设计原则重要的概念:
程序应该有数据的来源端,数据的目的端,以及报告问题的地方
分别称为:标准输入、标准输出、标准错误输出
7、重定向与管道
>重定向符,在目的文件不存在是会新建一个文件,如果目标文件存在 ,那么会覆盖掉,原数据会丢失
>>将输出结果附加到文件的结尾处,如果目标文件不存在会新建,如果存在,它不会直接覆盖掉,而是将产生的数据附加到文件结尾处
|建立管道,
管道
netstat -tulpn | grep nginx,将前者的标准输出修改为 grep nginx的标准输入。
8、基本命令查找(配置环境变量)
shell会根据$PATH来查找命令,bin是binary的缩写。
因为系统开机会加载.profile文件,所有要让新增命令有效必须把你的bin目录加入到.profile文件中,例如
PATH=$PATH:$HOMEN/bin,然后使用echo $PATH来验证是否生效。
9、简单的执行跟踪
当编写脚本是难免出错,那么可以通过set -x参数打开执行跟踪功能,set +x可以关闭功能。例如vim test:
#!/bin/bash 执行结果./test: + echo nihao
set -x nihao
echo nihao + set +x
set +x dajiahao
echo dajiahao
第三章查找与替换
1、特殊字符
. 匹配任意单个字符
“” '' 其中双引号可以引用变量,而单引号不行。它们的作用是组织特殊字符
\ 转译字符
/ 文件名分隔符
` 后置引用,命令替换
: 空命令, 等价于 “NOP”。 也可被认为是 shell 内建命令 true 作用相同, 例如: 死循环
: > data.log 等同于
cat /dev/null > data.log
! 取反操作,不等于
? 正则表达式中, ? 匹配任意单个字符
[] 字符范围。在正则表达式中使用
^ 在方括号表达式里表示取反。其他情况表示限定匹配字符的起始处,比如有一串要匹配的字为abcABC, ^ABC就不能匹配。
$ 限制匹配字符的结尾处。如 上个示例匹配abc$就不行,因为abc$表示匹配以abc结尾的字符
示例:^abcd|efgh$匹配以abcd开始efgh结尾或者结尾处师傅有efgh
^(abcd|efgh)$匹配abcd或者efgh的字符串
2、sed命令
语法
sed ‘s;匹配的字符串;替换的字符串;g’ g起的作用是全局匹配,如果不加只匹配一 次,或者直接跟数字表示匹配第几个。
示例:
grep -r 'http' ./* | sed 's;http;https;g'
将当前目录下所有文件代码中的http替换成https
其中;号可以用其他字符代替,如/等。当需要匹配的字符还有特殊字符时需要\转译。
grep -r 'f23nnfweiofno' ./* | sed 's;f23;oooo;g' | sed -e 's;no;yes;g'
将f23nnfweiofno当中f23替换成oooo,no改成yes。
要处理的字符包含单引号
sed "s/原字符串包含'/替换字符串包含'/"
awk的基本操作
示例:
sed -i -e 's/agz\.pigeonfan\.com/agz1\.pigeonfan\.com\:88/g' -e 's/https/http/g' ./A*.html
sed -i 's;https:\/\/www\.pigeonfan\.com;http:\/\/www\.pigeonfan\.com:88;' filename
替换脚本示例:
for modfile in $(find /data/pc -name *.html);do echo -e "$modfile/n" && sed -i -e 's/agz\.pigeonfan\.com/agz1\.pigeonfan\.com\:88/g' -e 's/https/http/g' $modfile;done
3、AWK语法 {awk属于编程语言,一般应用于显示选定的字段}
awk设计的重点就在字段和记录上,awk读取输入记录(通常是一些行),然后自动将各个记录切分为字段。awk将每条记录内的字段数目,存储到内建变量NF中。
示例:
awk '{print $1}' apim.access.log | sort | uniq -c | sort -n -k 1 -r | head -n 10
统计nginx访问前10 IP地址。!!!
第四章文本处理工具
1.sort options file(s)
-b忽略开头的空白
-n整数类型比较字段
-r倒数排序(比如统计前十访问IP数量等)
-k定义排序健值字段
-t以某个字符作为分割字符
2.uniq 常用语管道中,用来删除已使用sort排序重复的记录
-c在每个输出行之前加上该行重复的次数
-d仅显示重复的行
-u仅显示未重复的行
示例
awk '{print $1}' apim.access.log | sort | uniq -c | sort -n -k 1 -r | head -n 10
3.fmt命令
-w <每列字符数>或--width=<每列字符数>或-<每列字符数> 设置每列的最大字符数。

您还未添加分享代码,请到主题选项中,添加百度分享代码!

您可以选择一种方式赞助本站

支付宝转账赞助

支付宝扫一扫赞助

微信钱包扫描赞助

┊. 恋小布 。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

图片 表情