Pipeline com grep e encontre números impressos na frente do resultado

2

Estou usando o seguinte comando "find" para extrair alguns arquivos,

find /lag/cnnf/ -maxdepth 3 -newer ./start ! -newer ./end | grep -nri abc | egrep '([^0-9]45[^0-9])' | grep -nri "db.tar.gz" >> sample.txt

Minha saída no exemplo.txt é

5:175:/lag/cnnf/abc/45/r-01.bac.db.tar.gz
20:190:/lag/cnnf/abc/45/r-01.bac.db.tar.gz

o que devo fazer para obter apenas,

/lag/cnnf/abc/45/r-01.bac.db.tar.gz
/lag/cnnf/abc/45/r-01.bac.db.tar.gz

sem os números aleatórios na frente e o que esses números realmente significam.

    
por Mano 21.12.2013 / 12:59

2 respostas

3

Os números vêm das opções -n que você está passando para grep . No entanto, o tubo que você tem é um pouco longo demais para o meu gosto.

Do seu exemplo, parece que você tem uma estrutura de diretório razoavelmente simples. Se você tem o GNU find, use -regex (não tenho certeza que isso é mandado por POSIX):

find /lag/cnnf/ \
    -maxdepth 3 \
    -regex "abc.*[^0-9]45[^0-9].*db.tar.gz" \
    -newer ./start ! -newer ./end >> sample.txt

Caso contrário, assumindo requisitos um pouco mais rigorosos na estrutura de diretórios (ainda caberia no seu exemplo):

find /lag/cnnf/ \
    -maxdepth 3 \
    -path "*abc*/45/*db.tar.gz" \
    -newer ./start ! -newer ./end >> sample.txt

Você também pode querer considerar o uso de expansão de shell - por exemplo, em bash , você precisaria definir a opção de shell globstar e, em seguida, reproduzir com correspondência usando o curinga ** .

    
por 21.12.2013 / 15:49
6

Os números são realmente produzidos por (e)grep s e sua opção -n , o que significa:

Prefix each line of output with the 1-based line number within its input file.

Se você insistir em manter essa opção, remova os dois primeiros campos separados por dois pontos com o comando cut :

find /lag/cnnf/ -maxdepth 3 -newer ./start ! -newer ./end \
    | grep -nri abc \
    | egrep '([^0-9]45[^0-9])' \
    | grep -nri "db.tar.gz" \
    | cut -d':' -f3- >> sample.txt

-d é o caractere usado como separador de campo, -f diz quais campos serão impressos, neste caso o terceiro e todos os seguintes.

    
por 21.12.2013 / 13:39

Tags