如何从(\ s \ d +)\ s为每个lsof输出行

时间:2016-10-06 10:23:14

标签: regex bash

我正在使用lsof -i | grep -E "(LISTEN|ESTABLISHED)"获得有效联系,我希望得到第一个数字:
实施例

Coda\x202   551 username   46u  IPv4 0x8c39e71075d65ab7      0t0  TCP 192.168.0.35:62283->192.168.0.187:6942 (ESTABLISHED)
Coda\x202   551 username   47u  IPv4 0x8c39e710759c6c57      0t0  TCP 192.168.0.35:6942->192.168.0.37:59833 (ESTABLISHED)
Coda\x202   551 username   50u  IPv4 0x8c39e710759c6c57      0t0  TCP 192.168.0.35:6942->192.168.0.37:59833 (ESTABLISHED)
firefox     981 username   70u  IPv4 0x8c39e71070895867      0t0  TCP 192.168.0.35:61753->ec2-52-35-204-251.us-west-2.compute.amazonaws.com:https ESTABLISHED)
Google    16045 username   83u  IPv4 0x8c39e71078aba387      0t0  TCP 192.168.0.35:62596->109.239.193.10:https (ESTABLISHED)
Google    16045 username   84u  IPv4 0x8c39e71075f52df7      0t0  TCP 192.168.0.35:63819->ham02s15-in-f195.1e100.net:https (ESTABLISHED)

551,981和16045

因此,我可以根据ID对所有连接进行分组,并将它们打印到单独的文件中。

在摆弄正则表达式后,我得到了这个表达式 (\s\d+)\s符合我想要的数字,但我无法将其添加到我的bash脚本中 我不确定sed,awk或grep等是否更合适。

3 个答案:

答案 0 :(得分:1)

如果你想保留你的grep ......

lsof -i | grep -E "(LISTEN|ESTABLISHED)" | awk '{print $2}'

您正在使用awkprint第二列($2

答案 1 :(得分:0)

您可以将grep替换为awk,仅打印第二列:

lsof -i | awk '/(LISTEN|ESTABLISHED)/{print $2}'

这假设第一列和第二列在lsof的输出中没有任何空格。

答案 2 :(得分:0)

lsof -i | awk '/LISTEN|ESTABLISHED/&&!a[$2]++{print $2}'