shell的内容也挺多的,虽然云原生课程主要是讲grep、sed、awk三剑客,但是还有结合循环结构,判断语句,以及函数等内容。还是有点复杂的,并且我对shell的掌握并不多,所以写的可能并不全。当然,如果后面遇到了新内容,这个shell系列还是会持续更新的。
本来是打算云原生暑期培训就完结这个云原生俱乐部专栏的,但是现在看来,里面的知识点也很庞大,或许以后还会有新的内容需要添加或者补充。当然,我并不能预测,所以能写多少算多少。不过我的更新速度还是很快的,每天都能写几千字。
这一篇的主要内容是三剑客,最后会做一个补充内容,也就是讲一讲shell中的变量、数组和函数。反正如果要用linux的话,是离不开这三剑客的,因为功能强大且好用,能够省很多事,至于脚本的话,那更不用说了。
grep命令总结
1. -v反向查找(verbose)
2. -i不区分大小写(默认区分)
3. -n查看并显示行号
4. -w精确匹配模式,而不是包含
5. -l显示文件中包含模式的文件名(不显示具体内容)
6. -r递归查找目录下的文件有该模式的行
7. -c查看有多少匹配的项(相当于wc -l)
8. ^$表示空行
9. a|b属于查找两个中的一个,其实相当于[ab],但属于扩展正则。(但是对于ab|bc这种,使用[]就无法做到了)
10. ()表示分组,后面可以加匹配次数,如:?匹配1次或0次,+匹配1到多次,*匹配0到多次,{1,4}精确匹配1到4次,{1,}匹配1次到无数次。
11. -q表示静默模式,不在标准输出显示,但是可以通过状态码来查看执行情况,使用$?。
12. ||表示前者失败后者才运行,&&表示前者成功后者才运行,使用;则不管成不成功都运行。
13. echo -e表示使用转义字符(如\n),否则不使用。
sed命令总结
1. s命令表示替换
2. a命令表示追加
3. c命令表示替换(整行)
4. i命令表示插入
5. d表示删除
6. p表示打印行
7. 直接用数字6表示第六行,如6d
8. 6,9其中表示6到9行,如6,9d
9. /laste/,9(d,s)表示从匹配的到laste行到第九行
10. 用数字表示范围可以直接跟命令,但是用模式需要用分隔符
11. g表示全部范围
12. i表示不缺分大小写(注意i和g这两个选项都只能用于s)
13.n表示匹配的第几个才执行,与g相对(但同样,只能作为末尾给s使用)
awk命令总结
1. 都使用单引号,因为有$0等awk命令的特殊符号。
2. awk默认使用扩展正则表达式
3. $0表示整行,$1表示第一列,然后awk会每行每行匹配
4. 使用$2,$4表示的是第二列和第四列,不是连续的。
5. 使用OFS作为输出字段分隔符,默认是空格。
6. NF表示行的列数,每行每行匹配,使用$NF表示取最后一列
7. NR则记录行号,从1开始计数,并且是全局行号,跨文件累增
8. 使用print动作,结果是每行每行输出
9. 可以使用-F ","指定输入分隔符(其实也可以不用引号引起来,但是使用集合的话要用引号),默认也是空格,并且支持使用[]匹配多个分隔符。
10. 可以在动作print之前使用模式匹配,'/pattern/ {print}',共同放在单引号内,
11. ~表示匹配操作符,一般用于$n ~ 模式(正则表达式) 来匹配,命中的列则可以使用print打印。
12. 也可以使用NR>=或者NR<=或者NR==符号来匹配行号,然后可以使用&&表示与
13. $NF值同样适用,或者说是$n也一样,不建议使用$NR,因为这匹配的还是列而不是对应的行。
14. 使用比较符既可以比较数字,也可以匹配单词,如$3 == "Engineer"(注意这与~模式不太一样)。
15. 可以使用prinft来格式化输出,当然也可以用print配合OFS来控制输出分隔字符。
16. FS是输入分隔符,可以用-F来指定。
17. BEGIN表示在执行之前应用,可以不给awk设置输入文件。
18. {}默认是每行每行的执行,但是前面加上END,表示后面的则是只在输入处理完毕的时候执行一次
19. 可以使用if-else结构,也可以使用for循环结构,也可以使用while循环,可以省略结构的大括号,句子之间通过;相隔。
21. 注意if-else语句,可以用if{}else{},这样做中间不需要加分号隔开,除非if语句不使用{},这样需要用分号隔开。
22. 注意使用while循环的时候,需要将print count和count++放在一个语句块内,只用分号相隔不正确,必须用{}。
23. next用于跳过当前行的处理,直接下一行,可以结合匹配来使用。(NR==FNR,处理第一个文件的时候为真,因为NR是跨文件的)
24. sort用于按字母排序,使用sort -n则是按数值排序;sort -nr则是按数值反向排序
25. uniq则是进行去重,由于它只会在相邻的进行去重,所以需要先排序,使用-c选项则是在去重结果中显示重复次数。
shell补充内容
本来想自己写写shel三剑客的内容的,但是看了看我之前的笔记,发现我要写的内容和它大差不差。而且这东西只靠记忆是不行的,关键在于运用,死记规则并没有什么用。
所以我把重点放在了这里介绍,主要是shell函数和变量。services=("mysql" "redis" "nginx")可用于声明数组,echo ${services[0]}则输出元素。echo ${services[@]} 用于输出所有元素:mysql redis nginx。
echo ${!services[@]} 用于输出索引:0 1 2 配合变量一起使用,一般将索引赋给变量,然后取索引值获取数组元素。local可用于声明本地变量,如果不用local的话则是全局变量。containers+=("${container_name:-$service}")用于给数组添加元素。
local arr=("$@")可以将函数的所有参数转化为数组,如果是$#,则也是所有的参数,但不会有空格间隔,$0则是脚本名。${var:-default}如果var未设置或为空,返回default,上面的例子就是用了。
${var:=default}如果var未设置或为空,设置var为default并返回;${var:?Error}如果var未设置,打印Error并退出。测试语句和算术语句的使用也很多,[[ -z "$str" ]]判断为空, [[ -n "$str" ]]判断非空。((count++))用于自增,(( )) 是 Bash 的算术运算复合命令,里面的变量可以不用加$取值。