Eu quero grep alguma linha de um arquivo de log com uma entrada de outro arquivo. Estou usando este pequeno comando para fazer isso:
while read line; do
grep "$line" service.log;
done < input_strings.txt > result.txt
input_strings.txt
tem cerca de 50.000 strings (uma por linha). Para cada uma dessas strings, estou pesquisando o service.log
arquivo enorme (com cerca de 2.000.000 de linhas).
Então, digamos que a primeira string de input_strings.txt
seja encontrada na service.log
linha 10 000, esta linha é gravada no meu arquivo result.txt
. Depois disso, a 2ª string de input_strings.txt
será pesquisada em service.log
, MAS iniciando na linha 1 de service.log
.
Como posso me lembrar da última linha em que encontrei a primeira entrada service.log
? Para que eu possa iniciar a 2ª busca por lá?
Se você deseja obter as correspondências, não precisa usar um loop. Seria muito mais rápido usar apenas um único
grep
comando:Dito isso, se você quiser fazer literalmente o que afirmou em sua pergunta, poderá usar uma variável para acompanhar a linha na qual a última correspondência foi encontrada:
Percebi que você deseja pesquisar a primeira palavra-chave e, em seguida, continuar na linha após essa correspondência para pesquisar a próxima palavra-chave etc., imprimindo as correspondências à medida que avança.
Dado
keywords
:E
data
:O
awk
script aqui deve fazer exatamente isso (testado com GNU awk):i
ej
comece em 0, e durante o primeiro arquivo (NR==FNR
compara o número de registro/linha do arquivo atual com o número total de linhas vistas), coletamos as palavras-chave para um array. Depois disso, tente corresponder àj
palavra-chave :th e imprima e aumentej
em uma correspondência. Sair depois que todas as palavras-chave forem encontradas.Assim como
grep
, as palavras-chave aqui são, na verdade, padrões regex, embora obviamente sejamawk
regexes aqui. Se você deseja pesquisar strings fixas, useindex($0, key)
em vez de$0 ~ key
.Como alternativa, sem carregar as palavras-chave no início:
Isso deve ser direto.