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结尾的行 sed也是逐行进行处理的,但是它对于范围的限定是基于行的。 先说它的常用功能:取行: # 对日志文件里的1行进行输出 cat /var/log/secure | sed -n '1,1p' # -n 是sed的参数,代表静默后台处理 # ''里面分为两部分,最后一个字母代表操作,其它为范围 5 选择第5行。 2,5 选择2到5行,共4行。 1~2 选择奇数行。 2~2 选择偶数行。 2,+3 和2,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参数的变化可以创建备份或在原文件上修改。 # 替换file sed -i 's/a/b/' file # 备份为file.bak sed -i.bak 's/a/b/' file 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 抑制文件名的输出 一个软件的功能可以做到很强很大,利用awk和sed都能做到很复杂的工作,但是我们却仅仅使用它们一部分工作,为什么? 因为许多时候我们看似用一个东西全部做了,可是却会因此降低了整体的可读性和可维护性,为后续工作开展埋下隐患。 我想这也是微服务之所以是趋势的一大原因。 系统仍然是大系统,但要使得脉络清晰、生动可感。 |
|