awk是个非常强大的一个工具,在我看来位列三剑客之首,下面记录一些非常好的用法
一 比较常用的是统计tcp的状态
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
二 awk调用外部命令
awk '{cmd="useradd " $2 " -d"$1;system(cmd)}' tt.txt //将文件里面的第二列作为用户,第一列作为主目录,此命令调用了useradd命令,可以批量建用户和指定主目录,awk里面最后用双引号
*awk调用shell命令的两种方式
awk 'BEGIN{system("echo abc")}'
awk 'BEGIN{v1="echo";v2="abc";system(v1" "v2)}'
awk 'BEGIN{print "echo","abc"| "/bin/bash"}'
三 awk统计某一列的和
下面的命令统计第二列的和
[root@centos7 html]# cat tt.txt
1 aa
10 bb
5 cc
3 dd
2 bb
1 dd
8 cc
[root@centos7 html]# awk '{a[$2]+=$1}END{for(i in a) printf "%s %d\n",i,a[i]}' tt.txt|sort -n -k2
aa 1
dd 4
bb 12
cc 13
四 awk 修改原文件
awk '{$1="";print $0 >"chpass.sh"}' chpass.sh //这种方式是改变某一列然后导入文件
五 打印九九乘法表
[root@centos7 html]# seq 9|awk '{a=$0;for (i=1;i<=a;i++)printf i<a?i"X"a"="a*i"\t":i"X"a"="a*i"\n"}'
1X1=1
1X2=2 2X2=4
1X3=3 2X3=6 3X3=9
1X4=4 2X4=8 3X4=12 4X4=16
1X5=5 2X5=10 3X5=15 4X5=20 5X5=25
1X6=6 2X6=12 3X6=18 4X6=24 5X6=30 6X6=36
1X7=7 2X7=14 3X7=21 4X7=28 5X7=35 6X7=42 7X7=49
1X8=8 2X8=16 3X8=24 4X8=32 5X8=40 6X8=48 7X8=56 8X8=64
1X9=9 2X9=18 3X9=27 4X9=36 5X9=45 6X9=54 7X9=63 8X9=72 9X9=81
方法二
[root@centos7 ~]# echo 1|awk '{for (i=1;i<=9;i++){for (j=1;j<=i;j++)printf (i"*"j"="i*j"\t");print ""}}'
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
六 使文件的行列反转
awk '{for(i=1;i<=NF;i++){s[i,NR]=$i}}END{for(i=1;i<=NF;i++){for(j=1;j<=NR;j++){printf s[i,j]" "}print " "}}' erwei.txt
七 awk将指定的内容放入一行
[root@centos7 tmp]# cat ttt.txt
the result of 11:
pp:ok
qq:ok
ss:ok
the result of 22:
pp:ok
qq:ok
the result of 33:
pp:ok
显示为
[root@centos7 tmp]# awk '/the result/{if(NR!=1)print "" ;printf $0;next}!/the result/{printf "\t"$0}' ttt.txt;echo " "
the result of 11: pp:ok qq:ok ss:ok
the result of 22: pp:ok qq:ok
the result of 33: pp:ok
next:提前结束对本行文本的处理,并接着处理下一行;上面的next不加也行,但是会接着判断,时间浪费
八 将文件的内容分成一列一列,然后将符合的一项打印
awk -F '[ ,]+' '{for(i=1;i<=NF;i++)if( $i ~ "phone")print $i}' test.txt
九 匹配多个符合条件的行
[root@centos7 ~]# awk '$3~/400|401|402|403|203/' time.txt
ni ta 400
ni ta 401
ni wo 402
ni wo 403
ni tt 203
[root@centos7 ~]# cat time.txt
ni wo 111
ni ta 125
ni ta 400
ni ta 258
ni ta 401
ni wo 402
ni wo 403
ni hh 500
ni tt 203
十 打印第一行到倒数第四行
我们知道最后一行可以根据awk的END部分打印出来,也就是倒数第一行NR,倒数第二行:NR-1
那么倒数第四行怎么表示:NR-3
[root@centos7 ~]# cat awk4.txt
0 aababb
1
2bdff
3aabbc
4cvc
5
6
7cd
8
9
10asfdafdsf
aac
[root@centos7 ~]# awk '{L[NR]=$0}END{for (i=1;i<=NR-3;i++)print L[i]}' awk4.txt
0 aababb
1
2bdff
3aabbc
4cvc
5
6
7cd
8
方法二,可以使用NR和FNR的概念,不过较复杂就不使用了 例如: awk '...................' awk4.txt awk4.txt
十一:清除最后的字段,取出路径的目录
一个路径可以使用dirname path 取出它的目录
在一个文件里面可以使用,以替换的方式解决
awk -F / '{$NF=""}{OFS="/";print $0}' /root/awk1.txt