awk的一些用法

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 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值