云原生俱乐部-shell知识点归纳(1)

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循环,可以省略结构的大括号,句子之间通过;相隔。

  20. 注意if-else语句,可以用if{}else{},这样做中间不需要加分号隔开,除非if语句不使用{},这样需要用分号隔开。

  21. 注意使用while循环的时候,需要将print count和count++放在一个语句块内,只用分号相隔不正确,必须用{}。

  22. next用于跳过当前行的处理,直接下一行,可以结合匹配来使用。(NR==FNR,处理第一个文件的时候为真,因为NR是跨文件的)

  23. sort用于按字母排序,使用sort -n则是按数值排序;sort -nr则是按数值反向排序

  24. 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 的算术运算复合命令​​,里面的变量可以不用加$取值。

相关推荐
飞雪20074 小时前
Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
linux·macos·阿里云·vmware·虚拟机·aliyun·alibaba cloud
路溪非溪4 小时前
关于Linux内核中头文件问题相关总结
linux
Lovyk6 小时前
Linux 正则表达式
linux·运维
Fireworkitte7 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil9008 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char8 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
晴天彩虹雨8 小时前
存算分离与云原生:数据平台的新基石
大数据·hadoop·云原生·spark
淮北也生橘129 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
春人.12 小时前
PortainerCE 跨云管理:cpolar 内网穿透服务实现多环境统一控制
云原生·eureka