For 루프에서 Grep 사용

For 루프에서 Grep 사용

/home/errorcodes포함하다:

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 $Errors`'
+ 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 $Errors`'
+ 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 $Errors`'
+ grep DY-002 /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 $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

답변1

쉘이 실행됩니다분사존재하다 $(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

관련 정보