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)
该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 来解决我所有的文本处理挑战。
我认为awk
这有好处,因为它为您分割字段:
lsof | awk '$8 == "TCP" { print $2 }'
Run Code Online (Sandbox Code Playgroud)
如果字段 8 是“TCP”,则打印字段 2。