这是我经常遇到的问题,这次是 的输出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
...
但这似乎有点不干净,因为你必须固定角色位置。
主要问题是,在某些行中第五列是空的
是否有真正仅选择输出的第 6 列的解决方案?
最好的解决方案是一个工具,您只需说显示第 X 行,该工具将分析第一行,并通过分析以下行自动检测每列是否右对齐、居中或左对齐,然后只需选择该内容柱子。
答案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))}'
答案2
使用awk
你可以这样做:
lsof | awk '{print $5}'
这将打印出数字 5 列。
答案3
根据行中的列数选择所需的列:
lsof | perl -ane 'printf "%s\n",(@F>9) ? $F[5] : $F[4]'
Perl 对元素进行编号,从零开始。该-a
开关自动将输入字符串(行)拆分为F
从零索引的字段。