lsof出力を列で区切る

lsof出力を列で区切る

以下のコマンドを使用して列を分離しようとしていますが、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-Flsof

これはlsofPOSIX仕様の一部であり、歴史的な理由により、次のような奇妙な動作が発生します。https://www.unix.com/man-page/posix/8/lsof/

関連情報