鍍金池/ 問答/Linux  網(wǎng)絡(luò)安全  HTML/ Linux下使用awk如何獲取關(guān)鍵字所在字段號(hào),第幾列,以及打印這個(gè)字段之后的所

Linux下使用awk如何獲取關(guān)鍵字所在字段號(hào),第幾列,以及打印這個(gè)字段之后的所有字段?

netstat 的原始結(jié)果如下:

[root@Test tmp]# netstat -tunp| grep 'ESTABLISHED'
tcp        0      0 10.251.101.163:6379         10.251.101.163:51602        ESTABLISHED 2115/redis-server 1
tcp        0      0 127.0.0.1:58657             127.0.0.1:3306              ESTABLISHED 13354/rpc_time_serv
tcp        0      0 10.251.101.163:52409        10.251.101.163:6379         ESTABLISHED 611/./SendMsgServer
tcp        0      0 127.0.0.1:54957             127.0.0.1:12000             ESTABLISHED 19186/php-fpm
tcp        0      0 10.251.101.163:6379         10.251.101.163:49821        ESTABLISHED 2115/redis-server 1
tcp        0      0 127.0.0.1:12000             127.0.0.1:45060             ESTABLISHED 1810/memcached

我想用awk處理輸出結(jié)果為:

10.251.101.163:6379     ESTABLISHED    2115/redis-server 1
127.0.0.1:58657         ESTABLISHED    13354/rpc_time_serv
10.251.101.163:52409    ESTABLISHED    611/./SendMsgServer
127.0.0.1:54957         ESTABLISHED    19186/php-fpm
10.251.101.163:6379     ESTABLISHED    2115/redis-server 1
127.0.0.1:12000         ESTABLISHED    1810/memcached

以空格符為分隔符,因?yàn)槊恳恍械淖侄螖?shù)(列數(shù))不一致,'ESTABLISHED'之后需要打印的字段數(shù)就不一樣了。請(qǐng)問應(yīng)該如何實(shí)現(xiàn)呢?
另外如果用固定字符位數(shù)的方式來輸出應(yīng)該是可以簡(jiǎn)單達(dá)到效果,但是為了泛用,不想以這種方式處理。
目前的想法是,獲取'ESTABLISHED'所在的字段數(shù),然后把該字段之后的字段打印,但是對(duì)awk不是很熟悉,不知道代碼具體怎么寫。
望高人指點(diǎn)...

回答
編輯回答
不討喜
netstat -tunp| grep 'ESTABLISHED'| awk '{printf $4"    ";for(i=5;i<=NF;i++)if($i ~ /ESTABLISHED/)num=i;for(i=num;i<=NF;i++)printf $i"    ";printf"\n" }'

問了以前的同事,得到了在 awk 中 if 判斷和 for 循環(huán)的簡(jiǎn)單寫法,已經(jīng)解決我的問題,前來自答。
其中涉及到的 awk 用法有:if 判斷一個(gè)關(guān)鍵字所在列為第幾列,用變量 num 保存字段號(hào)(列號(hào));awk 中 for 循環(huán)的寫法。

2017年8月25日 22:00