获取输出的某一列,其内容右对齐,并且某些列并不总是填充

获取输出的某一列,其内容右对齐,并且某些列并不总是填充

这是我经常遇到的问题,这次是 的输出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从零索引的字段。

相关内容