Como fazer um grep na máquina remota e imprimir a linha que contém essas palavras?

2

Eu tenho alguns arquivos de registros no meu machineB sob este diretório /opt/ptd/Logs/ como mostrado abaixo - Meus arquivos de registros são muito grandes.

david@machineB:/opt/ptd/Logs$ ls -lt
-rw-r--r-- 1 david david  49651720 Oct 11 16:23 ptd.log
-rw-r--r-- 1 david david 104857728 Oct 10 07:55 ptd.log.1
-rw-r--r-- 1 david david 104857726 Oct 10 07:50 ptd.log.2

Eu estou tentando escrever um script de shell genérico que deve tentar analisar todo o meu arquivo de log em machineB para um padrão específico e imprimir a linha que possui esses padrões. Eu vou estar executando o meu script de shell abaixo de machineA que tem todas as chaves ssh configurado tudo o que significa que eu preciso remotamente grep nos arquivos de logs no machineB de machineA.

#!/bin/bash

wordsToInclude="hello,animal,atttribute,metadata"
wordsToExclude="timeout,runner"

# now grep on the various log file for above words and print out the lines accordingly

Ou seja, terei palavras separadas por vírgula em wordsToInclude variable - Se meus logs contiverem hello word, imprima essa linha, e também imprima a linha que contém animal word. Da mesma forma com attribute e metadata palavras.

E também terei palavras separadas por vírgula em wordsToExclude variable - Se alguma das linhas contiver essas palavras, não imprima essas linhas.

Eu estou indo com o formato acima para agora para armazenar as palavras, mas qualquer formato melhor é bom para mim. Eu posso ter uma longa lista de palavras na variável wordsToInclude e wordsToExclude , então é por isso que eu vou armazená-las nessas variáveis.

Eu sei fazer um grep em um pequeno conjunto de variáveis. Se eu precisar fazer grep da linha de comando diretamente no machineB, então eu farei assim -

grep -E 'hello|animal|atttribute|metadata' ptd.log | grep -v 'timeout'

Mas eu não sei como combinar isso no meu shell script para que eu possa fazer um ssh grep remoto no machineB a partir de machineA.

    
por david 12.10.2014 / 02:03

3 respostas

4

Se você estiver aberto a outros formatos, considere:

inc="hello|animal|atttribute|metadata"
exc="timeout|runner" 
ssh machineB "grep -E '$inc' path/ptd.log | grep -vE '$exc'"

Alternativa mais rápida

Se os seus arquivos de log forem grandes e você estiver procurando por palavras fixas, ao contrário de expressões regulares sofisticadas, convém considerar essa abordagem:

inc='hello
animal
atttribute
metadata'

exc='timeout
runner'

ssh office "grep -F '$inc' ptd.log | grep -vF '$exc'"

Ao colocar cada palavra em uma linha separada, podemos usar o recurso -F do grep para cadeias de caracteres fixas. Isso desativa o processamento de regex, tornando o processo mais rápido.

    
por 12.10.2014 / 03:05
0

Pode não parecer possível, mas você pode usar a opção grep -f para fazer uso dessa lista de palavras, mesmo que elas estejam em uma variável de ambiente e não em um arquivo adequado. O truque é enganar grep em pensar que eles são de um arquivo assim:

$ ssh machineB 'grep -f <(echo $wordsToInclude|tr , "\n") file1 file2 file3'

Isso executará o comando grep ... remotamente via ssh na máquinaB. Ele levará sua variável, $wordsToInclude , e alternará as vírgulas para os caracteres de fim de linha, ( , - > \n ). Esta lista de palavras é então alimentada em grep através de sua opção -f .

Para executar isso através da lista de exclusões, basta adicionar isso como um segundo grep após o inicial por meio de um pipe.

$ ssh machineB 'grep -f <(echo $wordsToInclude|tr , "\n") \
    file1 file2 file3 | grep -vf <(echo $wordsToExclude)'
    
por 12.10.2014 / 02:53
0

O SSH é executado com um comando assim:

ssh host command

Ou no seu caso:

ssh -t machineB "grep -E \"$wordsToInclude\" ptd.log | grep -v \"$wordsToExclude\""

O -t impede um "erro ioctl". Eu também recomendo usar as palavras fixas do grep para aumentar a velocidade, conforme especificado por esta resposta por @ John1024. Basta colocar cada palavra em sua própria linha, como:

wordsToInclude='hello
animal
atttribute
metadata'

wordsToExclude='timeout
runner'

E adicione -F às opções do grep.

    
por 19.08.2018 / 06:23