天天看点

linux中awk学习小结

awk与sed本身都是一个完整的编程语言,可以用来方便的处理文本,awk处理列。

awk正常的结构: cat tmp.txt | awk 'BEGIN{}{}END{}'   --带有表头,带有中间的处理过程,带有结尾--

常用用法:cat tmp.txt|awk '{print $1}'  --tmp.txt中字段已空格分隔,$0显示整行,$1表示第一个域,$NF最后一个,$NF-1倒数第二个域,默认的分隔符是空格--  

1、域分隔符是:

cat /etc/passwd|awk -F':' '{print $1,$NF}'   --命令行模式下,-F参数可修改输入的分隔符,即处理文件时的分隔符,该命令为以:分隔passwd文件,打印第一个域和最后一个域,输出字符默认已空格分隔--

cat /etc/passwd|awk -F':' '{print $1$NF}' --输出第一个域和最后一个域,之间无空格,--

cat /etc/passwd|awk -F':' '{print $1“____”$NF}'--输出第一个域和最后一个域,之间分隔为____,-- 

2、匹配行打印域

例文件tmp.txt:

11 aa 666

22 bb 777

33 cc 888

命令:

cat tmp.txt|awk '/bb/{print $0}'  结果:22 bb 777  --内容匹配到bb的行打印--

cat tmp.txt|awk '/bb/{print $3}'  结果:777   --内容匹配到bb的行,打印第三个域,默认分隔符为空格--

cat tmp.txt|awk '$2~/b/' {print $3}结果:777   --第二个域可以匹配b的行,打印第三个域,注意有空格--

可以减少一次grep对文件的查找

3、判断打印

cat /etc/passwd|awk -F':' '{if($1=="bill")print}'  --第一个域等于字符串bill,打印--

4、数组

例文件

search 111

search 222

cm 333

search 444

cat tmp.txt |awk '{a[$1]++}END{for(i in a)print i,a[i]}'

结果:

cm 1

search 3

a[$1]为一个数据,a[$1]++记录不同数据出现次数

5、awk匹配到指定的字符串并打印该字符串所在的域(列数)

格式:

awk '/行匹配串/ {for(i=1;i<=NF;i++) if($i ~ /字符串/)  print $i i}'  $filename

awk '/行匹配串/ {for(i=1;i<=NF;i++) if($i ~ /(字符串1|…|字符串n)/)  print $i i}'    $filename

例:

awk '/is/{for(i=1;i<=NF;i++) if($i ~ /is/) print $i i}' try.pl

本文转自 00_yatou 51CTO博客,原文链接:http://blog.51cto.com/ql0722/1614752,如需转载请自行联系原作者

继续阅读