Este é um problema que encontro frequentemente, desta vez com a saída de lsof
, mas estou procurando uma solução geral para esses problemas: selecionar uma coluna.
Aqui eu tento pegar a coluna TYPE da saída delsof
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
...
eu tentei
lsof|perl -lane 'print $F[5]'
Mas isso às vezes fica na 6ª coluna, às vezes na 5ª
eu consigo com
lsof|cut -c50-54|sort|uniq -c
375 CHR
610 DIR
211 FIFO
...
Mas isso parece um pouco sujo porque você precisa corrigir a posição do personagem.
O principal problema é que em algumas linhas a 5ª coluna está vazia
Existe uma solução que realmente seleciona apenas a 6ª coluna de uma saída?
A melhor solução seria uma ferramenta onde você diga apenas mostrar a linha X, onde a ferramenta analisaria a primeira linha e detecta automaticamente analisando as linhas seguintes se cada coluna está alinhada à direita, centro ou esquerda e depois é só selecionar o conteúdo dessa coluna.
Você pode usar a
-F
opção para obter uma saída mais adequada para análise, por exemploVeja a
OUTPUT FOR OTHER PROGRAMS
seção deman lsof
De forma mais geral, a menos que seus campos sejam delimitados de forma inequívoca, você pode precisar procurar a posição do caractere na linha de cabeçalho, por exemplo
Usando
awk
você pode fazer isso:Isso imprimirá a coluna número 5.
Selecione a coluna desejada com base no número de colunas em uma linha:
Perl numera elementos começando em zero. O
-a
switch divide automaticamente a string de entrada (linha) emF
campos indexados a partir de zero.