Suponha dois arquivos com o seguinte conteúdo:
$ cat ttest1.txt
x = 1
x = 3
y = 5
$ cat ttest2.txt
x = 4
x = 10
y = 3
Gostaria de grep recursivamente os arquivos x
e imprimir a última instância em cada arquivo. Assim, a saída desejada é
ttest1.txt:x = 3
ttest2.txt:x = 10
A seguinte combinação de grep
e tail
funciona para um arquivo, mas não para vários arquivos.
$ grep x ttest1.txt
x = 1
x = 3
$ grep x ttest1.txt | tail -n 1
x = 3
$ grep -r x ttest* | tail -n 1
ttest2.txt:x = 10
Como posso consertar isso?
Quando você faz
você obtém um único fluxo com
Se você
tail -1
isso, você obtém o arquivottest2.txt:x = 10
. Isso é o esperado.Mas você deseja que a
grep | tail
combinação seja feita em cada arquivo separado, não no fluxo consolidado. Então: faça isso em cada arquivo separado.Usando
awk
, você pode usar uma string regexp (consulte Dynamic Regexps ), lembre-se da última correspondência de cada arquivo de entrada e imprima-a:Recursivamente em combinação com
find
:Com GNU sed:
Saída:
Passe isso
paste -d: - -
se quiser os resultados em uma linha. Caso você não queira a saída de arquivos que não contenham,x
inclua uma verificação após ox
comando -change, por exemplo:{ x; /./ { F; p; z; }; }
Aqui está uma maneira de fazer isso:
tac inverte os resultados do grep em preparação para a operação awk, que por sua vez imprime apenas a primeira ocorrência em cada arquivo