
Podemos imprimir a última coluna de cada linha em um arquivo $NF
se não soubermos o número da última coluna.
Mas estou enfrentando dificuldade é que a última coluna tem um valor vazio.
Por exemplo,who
Comando de análise
$ who
root tty1 2018-01-25 09:36
root pts/0 2018-05-30 07:39 (192.168.1.134)
root pts/1 2018-05-28 23:12 (192.168.1.134)
root pts/2 2018-06-01 10:01 (192.168.1.188)
Obtendo resultado:
$ who | awk '{print $NF}'
09:36
(192.168.1.134)
(192.168.1.134)
(192.168.1.188)
resultado esperado
(192.168.1.134) (192.168.1.134) (192.168.1.188)
Deixe-me saber as possibilidades de obter o resultado esperado em uma linha.
EDITAR 1:O cenário acima é apenas um exemplo. Não gosto de alterar o delimitador para obter o resultado.
EDITAR 2:nada (uma linha de saída vazia) das linhas que possuem menos campos que o máximo
Responder1
Para gerar apenas a última coluna de linhas que possui o número máximo de colunas, você poderia fazer algo como:
who | awk '
NF > max {max = NF; output = ""}
NF == max {output = output $NF ORS}
END {printf "%s", output}'
Para gerar uma linha para cada linha de entrada, mas vazia para linhas que não possuem o número máximo de colunas:
who | awk '
NF > max {max = NF}
{n[NR] = NF}
NF == max {last[NR] = $NF}
END {for (i = 1; i <= NR; i++) print n[i] == max ? last[i] : ""}'
Responder2
Se você quiser o último campo apenas das linhas que possuem mais campos, você precisará ler os dados duas vezes: uma vez para descobrir o maior número de campos e outra para imprimir os campos. Ler apenas uma vez não resolve: qualquer linha pode ter mais campos do que as anteriores, e não há como saber.
Com awk
(observe que o nome do arquivo é fornecido duas vezes):
awk -vfields=0 'FNR==NR {if (NF > fields) fields=NF; next}
NF >= fields { print $NF } NF < fields {print ""}' file file
Se file
contém
foo bar
one two three four
1 2 3
a b c d
isso imprime o quarto campo ou fica vazio para linhas que não o possuem:
quatro d
Isso, claro, não funciona com um pipe, você terá que usar um arquivo temporário.
Uma solução alternativa poderia armazenar em cache os campos a serem impressos até que uma linha com mais campos apareça, como emA resposta de Stéphane.
Responder3
Verifique se o quinto campo corresponde \(.*\)
e imprima-o se corresponder.
who | awk '$5 ~ /\(.*\)/{print $5}'
Se você estiver interessado apenas em ip
endereços, altere o regex:
who | awk '$5 ~ /\((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\)/{print $5}'
Responder4
Se você deseja obter apenas a última coluna se esta coluna estiver disponível, use o fato de que as linhas que vocênãoquero ter apenas quatro colunas:
who | awk 'NF > 4 { print $NF }'
ou, para obter dados semelhantes,
w -hi | awk '{ print $3 }'