Execute greps independentes em um único shell script

4

Eu tenho vários filtros grep que eu costumo usar para analisar informações específicas.

1o grep: grep "pattern1\|pattern2\|pattern3\|" file.txt

2º grep: grep "patternA\|patternB\|patternC\|" file.txt

etc.

Eu aplico cada grep normalmente ao mesmo file.txt para obter uma saída independente.

Eu gostaria de saber como posso agrupar este grupo de greps em um único script bash para obter saídas independentes baseadas em cada tipo de grep.

Por exemplo: a entrada file.txt é a seguinte:

This line1 is the first line in here1
This line2 is the second line in here2
This line3 is the third line in here3
This line4 is the fourth line in here4

Eu geralmente aplico greps separados aqui para obter padrões específicos.

grep -h -r --color=always "line1\|here1" file.txt >>pattern1.txt

ou

grep -h -r --color=always "line2\|here2" file.txt >>pattern2.txt

Isso destacará apenas as informações necessárias e me fornecerá arquivos pattern*.txt separados para trabalhar. O objetivo aqui é executar todos esses greps em uma única vez para avaliar o mesmo arquivo e imprimir em shell da seguinte maneira:

  • Pattern1
  • Pattern2
  • Pattern3

etc.

Cada grep deve avaliar o arquivo completo de forma independente.

    
por raver83 05.04.2017 / 18:29

1 resposta

2

Se eu entendi a pergunta corretamente, é sobre como fazer o mesmo comando ( grep ), com as mesmas opções e a mesma entrada, mas várias vezes, com diferentes argumentos de regex e diferentes saídas. E eu acho que você quer evitar repetições / duplicações desnecessárias.

Parece que você deseja uma matriz de expressões regulares (strings de pesquisa):

declare -A regex
regex[1]="line1\|here1"
regex[2]="line2\|here2"
regex[3]="line3\|here3"
regex[4]="line4\|here4"

for i in "${!regex[@]}"
do
        grep -h -r --color=always "${regex["$i"]}" file.txt >> "pattern$i.txt"
done

A primeira linha ( declare -A regex ) declara uma matriz associativa chamado regex ; isso significa que ele cria a matriz como um espaço reservado, mas não insere nenhuma informação (elementos) nela. As próximas quatro linhas preenchem a matriz com quatro elementos, quais são as expressões regulares, indexados pelos números 1 , 2 , 3 e 4 . (Eu estou usando esses índices porque é isso que você parece querer, mas você pode usar quaisquer strings distintas como índices: por exemplo, uno , dos , tres e cuatro , ou ant , bat , cat e dog . ) A instrução for , for i in "${!regex[@]}" , faz com que a variável i faça uma iteração os valores de índice 1 , 2 , 3 e 4 . (Se eu tivesse deixado de fora o ! e disse for i in "${regex[@]}" , teria iterado através dos valores dos elementos, line1\|here1 , line2\|here2 , line3\|here3 e line4\|here4 .) Quando $i é 1 , ${regex["$i"]} reduz a ${regex[1]} , que se expande para line1\|here1 . Então, o loop itera (executa) quatro vezes, executando os quatro comandos grep que você deseja.

Se você deseja executar os processos grep em paralelo, faça:

for i in "${!regex[@]}"
do
        grep -h -r --color=always "${regex["$i"]}" file.txt >> "pattern$i.txt" &
done
wait

por 06.04.2017 / 09:40