Cut

獲取輸出的某一列,其內容右對齊,並且某些列並不總是填充

  • January 1, 2019

這是我經常遇到的問題,這次是 的輸出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 列的解決方案?

最好的解決方案是一個工具,您只需說顯示第 X 行,該工具將分析第一行並通過分析以下行自動檢測每列是否右對齊、居中或左對齊,然後只需選擇該內容柱子。

您可以使用該-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))}'

使用awk你可以這樣做:

lsof | awk '{print $5}'

這將列印出第 5 列。

引用自:https://unix.stackexchange.com/questions/491763