字符串处理的另外一个强大的工具是AWK, 与SED不同的是AWK更加擅长对字符串进行切分, 进行列处理。
awk [ -F re] [parameter…] [‘prog’] [-f progfile]
参数说明:
-F re:允许awk更改其字段分隔符,默认是空格。
parameter: 该参数帮助为不同的变量赋值。
‘prog’: awk的程序语句段。这个语句段必须用单拓号:’和’括起,以防被shell解释。 这个程序语句段的标准形式为:’pattern {action}’
-f progfile: 满足AWK语法的程序文件;
以空格分隔的字段宽度,如果指定此变量,awk将会用指定的宽度替换变量FS指定的分隔符。
echo "abcdefghijkl" | awk 'BEGIN {FIELDWIDTHS="2 3 4"}'
输出: ab cde fghi
当前记录中的字段个数。
已经读出的记录数。
输出字段分隔符, 默认也是空格,可以改为制表符等
输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
gsub(r,s) | 在整个$0中用s代替r |
gsub(r,s,t) | 在整个t中用s替代r |
index(s,t) | 返回s中字符串t的第一位置 |
length(s) | 返回s长度 |
match(s,r) | 测试s是否包含匹配r的字符串 |
split(s,a,fs) | 在fs上将s分成序列a |
sprint(fmt,exp) | 经fmt格式化后的exp |
sub(r,s) | 用$0中最左边最长的子串代替s |
substr(s,p) | 返回字符串s中从p开始的后缀部分 |
substr(s,p,n) | 返回字符串s中从p开始长度为n的后缀部分 |
awk -F: '{print $1,$3,$6}' OFS="\t" file_name
以:为分隔符, 输出字段1,3,6,以制表符作为分隔符
awk -F: 'NR==4 || NR==8{print}' file_name
显示第5行和第6行
//纯字符匹配 !//纯字符不匹配 ~//字段值匹配 !~//字段值不匹配 ~/a1|a2/字段值匹配a1或a2
awk '/mysql/{print $0}' file_name
显示匹配“mysql”的整行输出
awk '!/mysql/{print $0}' file_name
显示匹配“mysql”的整行输出
awk -F: '$1!~/mail|mysql/{print $1}' file_name
awk -F: '{if($1!~/mail|mysql/)print $1}' file_name
字段1匹配mail或者mysql才显示字段1.
awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}' file_name
先执行BEGIN,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域, 0则表示所有域, 0 则 表 示 所 有 域 , 1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。
打印输出时,可能需要指定字段间的空格数,从而把列排整齐。在print函数中使用制表符并不能保证得到想要的输出,因此,可以用printf函数来格式化特别的输出。
格式说明符 | 功能 |
%c | 打印单个ASCII 字符 |
%d | 打印一个十进制数 |
%e | 打印数字的e 记数法形式 |
%f | 打印一个浮点数 |
%o | 打印数字的八进制 |
%s | 打印一个字符串 |
%x | 打印数字的十六进制值 |
- | 左对齐修饰符 |
# | 显示8 进制整数时在前面加个0,显示16 进制整数时在前面加0x |
+ | 显示使用d 、e 、f 和g 转换的整数时,加上正负号+或- |
0 | 用0而不是空白符来填充所显示的值 |
awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' file_name