分享

我与阿里云的一千零一夜-012-挑个趁手兵器(其四)

 偏扁豆 2021-11-28

0x0 前言

十八般兵器不必样样精通,但习武之人底子得扎实。

shell脚本或各类脚本命令就是我们云计算环境下绕不开的“底子”,我们经常看到所谓的《精通Linux课程》等等都是对于常见Linux知识、工具命令和shell脚本的运用。

今天我们要重温一下Linux“三剑客”的功夫底子,awk,sed,grep。
三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长查找功能,sed擅长取行和替换。awk擅长取列。

0x1 关于awk

awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序。它依次处理文件的每一行,并读取里面的每一个字段。


awk其实不仅仅是工具软件,还是一种编程语言。

先说它的常用功能:取列:

# 对于一行文字,默认awk会利用空格将其分割,返回分割后的字符列表echo 'this is a test' | awk '{print $3}'# print是打印命令,你将得到一个字母 a
# 对于不是采用空格分隔的一行字符echo 'root:x:0:0:root:/root:/usr/bin/zsh' | awk -F ':' '{ print $1 }'# 你将得到root字符

编程基本知识:
# 变量内置变量就是awk预定义好的、内置在awk内部的变量,而自定义变量就是用户定义的变量。用$取数 FS(Field Separator):输入字段分隔符, 默认为空白字符 OFS(Out of Field Separator):输出字段分隔符, 默认为空白字符 RS(Record Separator):输入记录分隔符(输入换行符), 指定输入时的换行符 ORS(Output Record Separate):输出记录分隔符(输出换行符),输出时用指定符号代替换行符 NF(Number for Field):当前行的字段的个数(即当前行被分割成了几列) NR(Number of Record):行号,当前处理的文本行的行号。 FNR:各文件分别计数的行号 ARGC:命令行参数的个数 ARGV:数组,保存的是命令行所给定的各参数自定义变量的方法 方法一:-v varname=value ,变量名区分字符大小写。 方法二:在program中直接定义。

输入内容

# 从文件awk '{[pattern] action}' {filenames} # 从管道cat test.log | awk '{[pattern] action}'

输出内容

# 在shell上打印print # 格式化打印printf "格式化串" , item1, item2, ... 不会自动换行,FORMAT中需要分别为后面每个item指定格式符
格式符 item表现形式%c 显示字符的ASCII码%d, %i 显示十进制整数%e, %E 显示科学计数法数值%f 显示为浮点数%g, %G 以科学计数法或浮点形式显示数值%s 显示字符串%u 无符号整数%% 显示%自身#[.#] 第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f- 左对齐(默认右对齐) %-15s+        显示数值的正负符号 %+d

正则匹配条件并执行命令:

awk '/^a/&&/nologin$/ {print}' /etc/passwd # 打印以a开头并且以nologin结尾的行

0x2 关于sed

sed也是逐行进行处理的,但是它对于范围的限定是基于行的。

先说它的常用功能:取行:

# 对日志文件里的1行进行输出cat /var/log/secure | sed -n '1,1p'# -n 是sed的参数,代表静默后台处理''里面分为两部分,最后一个字母代表操作,其它为范围5 选择第5行。2,5 选择25行,共4行。1~2 选择奇数行。2~2 选择偶数行。2,+32,5的效果是一样的,共4行。2,$ 从第二行到文件结尾。
p 对匹配内容进行打印。d 对匹配内容进行删除,并打印。w 将匹配内容写入到其他地方。sed -n '2,5 w output.txt' file

sed替换功能也十分强大。

sed 's/要被取代的字串/新的字串/g'# g参数是flag参数g 默认只匹配行中第一次出现的内容,加上g,就可以全文替换了。p 当使用了-n参数,p将仅输出匹配行内容。w 和上面的w模式类似,但是它仅仅输出有变换的行。i 这个参数比较重要,表示忽略大小写。e 表示将输出的每一行,执行一个命令。不建议使用,可以使用xargs配合完成这种功能。
要被取代的字串 可以使用 正则表达式表达^ 行首$ 行尾. 单个字符* 0个或者多个匹配+ 1个或者多个匹配? 0个或者1个匹配{m} 前面的匹配重复m次{m,n} 前面的匹配重复m到n次\ 转义字符[0-9] 匹配括号中的任何一个字符

sed参数的变化可以创建备份或在原文件上修改。

# 替换filesed -i 's/a/b/' file# 备份为file.baksed -i.bak 's/a/b/' file
0x3 关于grep

grep同样是逐行进行查找,所以一般它的输出只筛选不改变行列的属性。

先说它的常用功能:查找:

cat /var/log/secure | grep root# 搜索包含root字符串的行cat /var/log/secure | grep '.*Invalid.*root.*'# 搜索包含符合正则表达式(包含Invalid...root)字符串的行

grep还有一些常用参数。

选项 含义 功能描述-i  ignore case       忽略大小写-v invert match 不匹配匹配的,或者反向-l file-with-match 输出匹配的文件名-L  file-without-match 输出不匹配的文件名-c count 输出匹配的数目(行数)-n  number             输出匹配行的同时在前面加上文件名及在文件名中的行数-h no-filename 抑制文件名的输出
0x4 小结

一个软件的功能可以做到很强很大,利用awk和sed都能做到很复杂的工作,但是我们却仅仅使用它们一部分工作,为什么?

因为许多时候我们看似用一个东西全部做了,可是却会因此降低了整体的可读性和可维护性,为后续工作开展埋下隐患。

我想这也是微服务之所以是趋势的一大原因。

系统仍然是大系统,但要使得脉络清晰、生动可感。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多