内容が右揃えで、一部の列が常に入力されない特定の出力列を取得します。

内容が右揃えで、一部の列が常に入力されない特定の出力列を取得します。

これは私がよく直面する問題です。今回は出力から発生しますlsofが、私はこの種の問題に対する一般的な解決策を探しています:列の選択。

ここでは、出力のTYPE列を取得しようとしています。lsof

COMMAND     PID   TID                USER   FD      TYPE             DEVICE     SIZE/OFF       NODE NAME
lsof      16113                      root  cwd       DIR               0,58        40960    7602184 /home/rubo77
lsof      16113                      root  rtd       DIR              259,7         4096          2 /
lsof      16113                      root    4r     FIFO               0,12          0t0     294763 pipe
lsof      16113                      root    7w     FIFO               0,12          0t0     294764 pipe
lsof      16648                      root  rtd       DIR              259,7         4096          2 /
riot-web   4399  4424               ruben   25u     unix 0xffff9543f9ad7000          0t0      53133 type=STREAM
thunderbi  4650  5835               ruben  DEL       REG              259,7                 2752546 /usr/share/icons/hicolor/icon-theme.cache
...

頑張った

lsof|perl -lane 'print $F[5]'

しかし、これは時々列6を取得し、時には列5を取得します。

わかりました。

lsof|cut -c50-54|sort|uniq -c

375  CHR 
610  DIR 
211 FIFO 
...

しかし、キャラクターの位置を修正しなければならないので少し汚れて見えます。

主な問題は、一部の行で5番目の列が空であることです。

実際に出力の6番目の列だけを選択するソリューションはありますか?

最良の解決策はshow row Pillarと言うツールです。

ベストアンサー1

この-Fオプションを使用すると、解析に適した出力を得ることができます。

lsof -F t | awk '/^t/ {print substr($0,2)}'

次のOUTPUT FOR OTHER PROGRAMSセクションを参照してください。man lsof


より一般的には、フィールドが明確に区別されない限り、ヘッダー行から文字位置を検索する必要があるかもしれません。

awk -v field="TYPE" 'NR==1 {c = index($0,field)} {print substr($0,c,length(field))}'

おすすめ記事