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