按列分隔 lsof 输出

The*_*den 3 text-processing lsof

我在下面使用此命令并尝试分隔列我只想让 PID 在我的 python 脚本中使用它。

我可以轻松地逐行获取此行,但是如何以非 hacky 的方式将其分成几列?

我可以很容易地按空间分割,但让我们面对这是一个糟糕的主意,有什么建议吗?

root@python-VirtualBox:/var/python# lsof | grep TCP
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    3449 root    3u  IPv4  24248      0t0  TCP *:22 (LISTEN)
sshd    3449 root    4u  IPv6  24257      0t0  TCP *:22 (LISTEN)
Run Code Online (Sandbox Code Playgroud)

gar*_*ead 7

lsof命令功能齐全,允许您指定许多不同的搜索条件。特别是,该-i选项可让您按 Internet 地址(包括协议)进行搜索,从而变得grep不必要。所以你可以更换

lsof | grep TCP
Run Code Online (Sandbox Code Playgroud)

lsof -i TCP
Run Code Online (Sandbox Code Playgroud)

lsof还允许您使用-F选项指定您感兴趣的字段,并只输出那些(每行一个)。所以我们可以做

lsof -i TCP -F 'p'
Run Code Online (Sandbox Code Playgroud)

输出使用 TCP 的进程的 PID 列表。

但是,这些PID中的每一个都以“p”为前缀(例如“p156”),因此最后我们可以使用它cut来获取数字ID。这给了我们最后的命令

lsof -i TCP -F 'p' | cut -c 2-
Run Code Online (Sandbox Code Playgroud)

当然@RobertL 的回答也很好,但我喜欢挑战自己不要使用 AWK 来解决我所有的文本处理挑战。


Rob*_*rtL 3

我认为awk这有好处,因为它为您分割字段:

lsof | awk '$8 == "TCP" { print $2 }'
Run Code Online (Sandbox Code Playgroud)

如果字段 8 是“TCP”,则打印字段 2。

  • …除非某些列为空,因为 awk 无法检测到这一点,并且会将剩余的列向左移动:/ (3认同)