Como usar o grep para extrair nomes de arquivos no final das linhas?

0

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?

    
por Pooja 01.12.2015 / 17:44

5 respostas

1

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}'
    
por 01.12.2015 / 18:11
1

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
    
por 01.12.2015 / 17:53
0

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$'
    
por 01.12.2015 / 17:48
0

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
    
por 01.12.2015 / 20:19
0

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/ -> .*//'
    
por 02.12.2015 / 10:21

Tags