Linux命令之awk

awk中使用shell命令

1
> awk '{cmd="rm "$0;system(cmd)}' filename.txt

awk 中输出双引号和单引号

1
2
> awk '{print "\""}'
> awk '{print "'\''"}'

统计每行字符分割后特定字符出现的次数

1
> awk -F "," '{if($(NF-1)=="2"){print $0}}' | wc -l

统计次数

1
> awk -F "," ' BEGIN { count1=0;count2=0;count3=0} { if((NF-1)==1){count1+=1} else if((NF-1)==2){count2+=1} else{count3+=1} } END {print NR,count1,count2,count3} ' 20151120.txt

awk中取对应的列:取整行$0,取第一列$1,取最后一列$NF,取倒数第二列$(NF-1)


使用awk处理文件中上下关联的两行,例如文件foo.txt有如下内容

1
2
3
4
abc
portals: 192.168.5.41:3260
def
portals: 192.168.5.43:3260

如何把文件foo.txt内容变为如下内容

1
2
abc 192.168.5.41:3260
def 192.168.5.43:3260

方法: awk '/port/{print a" "$2}{a=$1}' foo.txt

解释:

处理第一行的时候,以port开头吗?很明显,不以port开头,所以那个pattern不匹配,action不执行。但执行了后面的a=$1
处理第二行的时候,以port开头,打印出来a和本行$2,再处理就是个循环过程。

由于第一行没有匹配以port开头的,所以print a" "$2不执行,执行a=$1, a=abc
由于第二行有匹配以port开头的,所以print a" "$2行执行,由于a=abc,所以输出 abc 192.168.5.41:3260
由于第三行没有匹配以port开头的,所以print a" "$2不执行,执行a=$1,a=def
由于第四行有匹配以port开头的,所以print a" "$2行执行,由于a=def,所以输出 def 192.168.5.43:3260

由此得到结果:

1
2
abc 192.168.5.41:3260
def 192.168.5.43:3260


JouyPub wechat
欢迎订阅「K叔区块链」 - 专注于区块链技术学习