Использование Grep In For Loop

Файл1 содержит:

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 

Автор сценария:

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

Отлаживать:

+ cat /home/errorcodes + for i in ' cat $ Errors ' + grep 421 /home/eximlog + for i in ' cat $ Errors ' + grep RP-001 /home/eximlog + for i in ' cat $ Errors ' + grep 421 /home/eximlog + for i in ' cat $ Errors ' + grep RP-002 /home/eximlog + for i in ' cat $ Errors ' + grep 421 /home/eximlog + for i in ' cat $ Errors ' + grep RP-003 /home/eximlog + for i in ' cat $ Errors ' + grep 550 /home/eximlog + for i in ' cat $ Errors ' + grep SC-001 /home/eximlog + for i in ' cat $ Ошибки ' + grep 550 /home/eximlog + for i in ' cat $ Errors ' + grep SC-002 /home/eximlog + for i in ' cat $ Errors ' + grep 550 /home/eximlog + for i in ' cat $ Ошибки ' + grep SC-003 /home/eximlog + for i in ' cat $ Errors ' + grep 550 /home/eximlog + for i in ' cat $ Errors ' + grep SC-004 /home/eximlog + for i in ' cat $ Errors ' + grep 550 /home/eximlog + for i in ' cat $ Errors ' + grep DY-001 /home/eximlog + for i in ' cat $ Errors ' + grep 550 /home/eximlog + for i in ' cat $ Ошибки ' + grep DY-002 /home/eximlog + for i in ' c at $ Errors ' + grep 550 /home/eximlog + for i in ' cat $ Errors ' + grep DY-001 /home/eximlog + for i in ' cat $ Errors ' + grep 550 /home/eximlog + for i in ' cat $ Errors ' + grep OU-001 /home/eximlog + for i in ' cat $ Errors ' + grep 550 /home/eximlog + for i in ' cat $ Errors ' + grep OU-002 /home/eximlog

Почему цикл считывает все коды типа «421» и «RP-001» отдельно. И принесите дублирующий результат. Grep должен рассматривать коды как одну строку, такую ​​как: "421 RP-001" И отладке должно понравиться следующее:

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

Оболочка будет выполнять разбиение слов на $(cat $Errors) . Вот почему вы получаете одно слово за раз, а не одну строку за раз.

Вы хотите while read... цикл:

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

read является ориентированным по строкам: он считывает по одной строке за раз.

Или это может сработать для вас, и он вообще не нуждается в петле:

  grep -f "$Errors" /home/eximlog 

Параметры -f grep читать шаблоны из файла, по одному шаблону на строку.

Кроме того, мне кажется, что ваши шаблоны кода ошибок являются фиксированными строками, а не регулярными выражениями. В этом случае, чтобы избежать неприятных сюрпризов, добавьте параметр -F в grep :

  grep -Ff "$Errors" /home/eximlog