Usando o Grep In For Loop

2

File1 contém:

421 RP-001
421 RP-002
421 RP-003
550 SC-001
550 SC-002
550 SC-003
550 SC-004
550 DY-001
550 DY-002
550 DY-001
550 OU-001
550 OU-002

Script:

#!/bin/bash

Elogs=/home/elogs.txt
Errors=/home/errorcodes
    for i in 'cat $Errors'; do
    #Get Error Logs
    grep "$i" /home/eximlog >> $Elogs
done

Depuração:

+ cat /home/errorcodes + for i in ' cat $ Erros ' + grep 421 /home/eximlog + for i in ' cat $ Erros ' + grep RP-001 /home/eximlog + for i in ' cat $ Erros ' + grep 421 /home/eximlog + for i in ' cat $ Erros ' + grep RP-002 /home/eximlog + for i in ' cat $ Erros ' + grep 421 /home/eximlog + for i in ' cat $ Erros ' + grep RP-003 /home/eximlog + for i in ' cat $ Erros ' + grep 550 /home/eximlog + for i in ' cat $ Erros ' + grep SC-001 /home/eximlog + for i in ' cat $ Erros ' + grep 550 /home/eximlog + for i in ' cat $ Erros ' + grep SC-002 /home/eximlog + for i in ' cat $ Erros ' + grep 550 /home/eximlog + for i in ' cat $ Erros ' + grep SC-003 /home/eximlog + for i in ' cat $ Erros ' + grep 550 /home/eximlog + for i in ' cat $ Erros ' + grep SC-004 /home/eximlog + for i in ' cat $ Erros ' + grep 550 /home/eximlog + for i in ' cat $ Errors ' + grep DY-001 /home/eximlog + for i in ' cat $ Erros ' + grep 550 /home/eximlog + for i in ' cat $ Erros ' + grep DY-002 /home/eximlog + for i in ' cat $ Erros ' + grep 550 /home/eximlog + for i in ' cat $ Erros ' + grep DY-001 /home/eximlog + for i in ' cat $ Erros ' + grep 550 /home/eximlog + for i in ' cat $ Erros ' + grep OU-001 /home/eximlog + for i in ' cat $ Erros ' + grep 550 /home/eximlog + for i in ' cat $ Erros ' + grep OU-002 /home/eximlog

Por que o loop leu todos os códigos como "421" e "RP-001" separadamente. E traga resultados duplicados. O Grep deve considerar os códigos como uma única string: "421 RP-001" E a depuração deve gostar disso:

+ for i in 'cat $Errors' + grep 421 RP-001 /home/eximlog

    
por blaCkninJa 08.06.2016 / 08:10

1 resposta

3

O shell executará divisão de palavras em $(cat $Errors) . É por isso que você recebe uma palavra de cada vez, em vez de uma linha de cada vez.

Você deseja um loop while read... :

while read -r line; do
    #Get Error Logs
    grep "$line" /home/eximlog >> $Elogs
done <"$Errors"

read é orientado a linha: lê uma linha por vez.

Ou, isso pode funcionar para você e não precisa de nenhum loop:

 grep -f "$Errors" /home/eximlog

As opções -f informam grep para ler padrões de um arquivo, um padrão por linha.

Além disso, parece-me que seus padrões de código de erro são sequências fixas e não expressões regulares. Nesse caso, para evitar surpresas desagradáveis, adicione a opção -F a grep :

 grep -Ff "$Errors" /home/eximlog
    
por 08.06.2016 / 08:18