![For 루프에서 Grep 사용](https://linux55.com/image/8532/For%20%EB%A3%A8%ED%94%84%EC%97%90%EC%84%9C%20Grep%20%EC%82%AC%EC%9A%A9.png)
/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