需求:
截取netstat信息的服务和端口信息。 群里大佬提供:
netstat -tnpl|awk 'NF==7{sub(/.*:/,"",$4);sub(/[0-9]*\//,"",$NF);print $4,$NF}'
netstat -tnpl|awk '/^tcp/{sub(/.*:/,"",$4);sub(/[0-9]*\//,"",$7);print $4,$7}'
netstat -tnpl|awk '/^tcp/{sub(/.*:/,"",$4);sub(/[0-9]*\//,"",$7);if(NF==7)print $4,$7;else print $4,$7,$NF}'
分析:就是做了个替换,第四列的:前面的替换成空,第七列的pid/ 替换成空,之后判断每行多少列(因为有些行有>7列的),分开输出就行。
这个 sub 是切 :号之前的东西,替换为空。
第7列 切 /号前的数字内容,换成空。
群大佬推荐的书籍: Linux Shell脚本攻略(第3版) 图灵版、 Linux Shell 实例精解、 UNIX.shell范例精解(第4版)
另个大佬给个代码:
netstat -tnpl|awk 'BEGIN{FS="[ ]+|:|/"}NR>2{if(/^tcp[^6]/&&NF=10){print 5,$NF}else{print $7,$(NF-1)}}'
和 (用数组可以去重)
netstat -tnpl|awk 'BEGIN{FS="[ ]+|:|/"}NR>2{if(/^tcp[^6]/&&NF=10)arr[$5]=$NF;else arr[$7]=$(NF-1)}END{for(i in arr)print i,arr[i]}'
Perl的写法:
netstat -tnpl| perl -nE 'printf "$1 $2\n" if /^tcp.*(?<=:)(\d+)(?=\s).*(?<=\/)(\w+)/'
END