以下のコマンドを使用して列を分離しようとしていますが、PythonスクリプトでPIDを使用するようにしたいと思います。
この行を簡単に取得できますが、ハッキングされていない方法で列に分割する方法は?
スペースに簡単に分けることができますが、現実的には恐ろしい考えです。どんな提案がありますか?
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)
答え1
このlsof
コマンドは非常に多様で、さまざまな検索基準を指定できます。特に、この-i
オプションを使用すると、インターネットアドレス(プロトコルを含む)で検索できるため、grep
検索する必要はありません。だからあなたは交換することができます
lsof | grep TCP
そして
lsof -i TCP
lsof
また、このオプションを使用すると、目的のフィールドを指定し、その-F
フィールドのみ(1行に1つずつ)出力できます。だから私たちはできます
lsof -i TCP -F 'p'
TCPを使用するプロセスのPIDリストを印刷します。
ただし、各PIDには「p」プレフィックスが付いているため(たとえば「p156」)、最終的にこれを使用してcut
数値IDを取得できます。これは私たちに最後のコマンドを与えます
lsof -i TCP -F 'p' | cut -c 2-
もちろん、@RobertLの答えもとても良いですが、私はAWKを使用せずにすべてのテキスト処理の問題を解決するように挑戦したいと思います。
答え2
awk
私はこれがあなたのためにフィールドを分割するので利点があると思います。
lsof | awk '$8 == "TCP" { print $2 }'
フィールド8が「TCP」の場合、フィールド2が印刷される。
答え3
存在する:
lsof -iTCP -Fp
出て:
p1135
p6326
p16841
p18130
p37908
p41768
p51944
p71882
p74759
p79636
p82203
答え4
実際に安全な唯一のオプションは、egを使用してlsof -F0pn
から別のプログラミング言語を使用して出力を解析することです。この場合、lsofはnullバイトで区切られたフィールドをエクスポートし、各フィールドはフィールドタイプを指定する文字で始まります。たとえば、p123<NULL>n/var/log/syslog<NULL>
PID 123で開かれたファイルの名前はです/var/log/syslog
。プロセスに複数のファイルが開いている場合は、p
(PID) フィールドが一度だけリストされ、n
ファイルを記述する複数の (name) フィールドが表示されます.
また、フラグp
付きのフィールドを要求しても他のフィールドが放出される可能性があるため、興味のないフィールドは無視する準備をしてください。n
-F
lsof
これはlsof
POSIX仕様の一部であり、歴史的な理由により、次のような奇妙な動作が発生します。https://www.unix.com/man-page/posix/8/lsof/