awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序。它依次处理文件的每一行,并读取里面的每一个字段。
# 对于一行文字,默认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都能做到很复杂的工作,但是我们却仅仅使用它们一部分工作,为什么?
因为许多时候我们看似用一个东西全部做了,可是却会因此降低了整体的可读性和可维护性,为后续工作开展埋下隐患。
我想这也是微服务之所以是趋势的一大原因。
系统仍然是大系统,但要使得脉络清晰、生动可感。
联系客服