Cut
獲取輸出的某一列,其內容右對齊,並且某些列並不總是填充
這是我經常遇到的問題,這次是 的輸出
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 列。