Imprimir a última coluna:
awk '{print $NF}' /var/tmp/k.log
ou
grep .CCD /var/tmp/k.log | grep bv90 | grep "Nov 18" | awk '{print $NF}'
Eu tenho um arquivo de log que contém informações como saída usando
ls *.CCD
do diretório /var/tmp/Person
:
-rwxr-xr-x 1 bv90 dkas 153698 Nov 18 13:08 WE994002.CCD
Eu tenho muitas dessas linhas.
Se eu faço grep .CCD /var/tmp/k.log | grep bv90 | grep "Nov 18"
, eu sou
recebendo toda a linha de volta, mas eu só preciso de WE994002.CCD
. Como posso
alterar meu comando para imprimir apenas o nome do arquivo?
Imprimir a última coluna:
awk '{print $NF}' /var/tmp/k.log
ou
grep .CCD /var/tmp/k.log | grep bv90 | grep "Nov 18" | awk '{print $NF}'
Adicione uma instrução awk para analisar a lista, assim:
grep .CCD /var/tmp/k.log | grep bv90 | grep "Nov 18"| awk '{print $9}'
Este espaço de instrução awk delimita a saída e imprime o nono campo.
em cujo caso você pode pular o grep por completo, e ele pode ser reduzido para
awk '/.CCD$/ && /bv90/ && /Nov 18/ {print $9}' /var/tmp/k.log
Se estiver usando o grep, então a opção -o
pode ser relevante:
$ echo '-rwxr-xr-x 1 bv90 dkas 153698 Nov 18 13:08 WE994002.CCD' | grep -o '[^ ]*\.CCD$'
WE994002.CCD
Isso pressupõe que o nome do arquivo que você deseja filtrar não contém
espaço; a chamada para grep -o
pede para imprimir apenas a parte da linha
que corresponde a uma sequência de caracteres não espaciais que terminam em .CCD
em
O fim da linha. Todo o comando se tornaria:
</var/tmp/k.log grep bv90 | grep "Nov 18" | grep -o '[^ ]*\.CCD$'
com sed:
sed -n '/bv90.*Nov 18.*\.CCD$/ s/^.*Nov 18 ..:.. //p' logfile
Em vez de extrair um campo específico, esse script sed exclui tudo na linha correspondente até e incluindo a cadeia de data e hora (e o caractere de espaço imediatamente após). Isso deixará apenas o nome do arquivo, assumindo que não haja nenhum link simbólico na listagem de saída ... se houver algum link simbólico, ele poderá ser removido com:
sed -n '/bv90.*Nov 18.*\.CCD$/ { s/^.*Nov 18 ..:.. // ; s/ ->.*//; p}' logfile
Se não houver espaços no nome do arquivo e nenhum link, eu usaria o AWK, como descrito por Cyrus.
Se houver espaços no nome do arquivo, podemos usar espaços para descrever todos os campos anteriores e capturar todos os tokens a seguir:
sed 's/\(\S\+\s\+\)\{8\}\(.*\)//' logfile
O primeiro conjunto de parênteses descreve uma coluna, seguida de espaço em branco. Isso é repetido 8 vezes. O segundo conjunto de parênteses captura o restante da linha, que a referência de retorno \ 2 captura.
Se você precisar remover os soft links, tenho certeza que precisaremos de outro comando sed, como descrito por cas:
sed 's/\(\S\+\s\+\)\{8\}\(.*\)// ; s/ -> .*//'