这是我经常遇到的问题,这次是 的输出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
选项来获得更适合解析的输出,例如见
OUTPUT FOR OTHER PROGRAMS
部分man lsof
更一般地,除非您的字段被明确分隔,否则您可能需要求助于搜索标题行中的字符位置,例如
使用
awk
你可以这样做:这将打印出第 5 列。
根据一行中的列数选择所需的列:
Perl 从零开始编号元素。该
-a
开关自动将输入字符串(行)拆分F
为从零开始索引的字段。