이것은 내 코드입니다.
if grep -x $idle | grep -x $dead | grep -x $busy ./Event.log
then
echo " Events are running Successfully" >> ./Event.log
else
echo "One or more Events are down. Check the log and restart the Events." >> ./Event.log
fi
다음 오류가 발생합니다.
grep: 0652-033 Cannot open 1.
grep: 0652-033 Cannot open 0.
grep: 0652-033 Cannot open 0.
if
조건이 충족 되더라도 else
블록에 진입하게 됩니다.
누가 나를 도와줄 수 있나요?
답변1
이 명령 grep
에는 두 가지 매개변수가 있습니다.무늬그리고문서. 입력이 파이프나 리디렉션을 통해 표준 입력에 연결된 경우 |
이 파일을 생략할 수 있습니다 <
. 귀하의 예에서는 그렇지 않으므로 첫 번째 사람은 grep
패턴을 찾을 위치를 모릅니다. 다음과 같이 작성해야 합니다.
grep -x $idle Event.log | grep -x $dead | grep -x $busy
두 번째와 세 번째 grep
s는 파이프에서 읽기 때문에 파일 인수가 필요하지 않습니다.
그러나 귀하의 경우에는 세 가지 대체 문자열을 찾는 것이 더 나을 것 같습니다. 따라서 를 |
사용하거나 사용하지 않고 대체 연산자를 사용할 수 있습니다 . 예를 들면 다음과 같습니다.grep -E
\|
-E
if grep -x "$idle\|$dead\|$busy" ./Event.log >/dev/null
then
echo " Events are running Successfully" >> ./Event.log
else
echo "One or more Events are down. Check the log and restart the Events." >> ./Event.log
fi
답변2
정규식을 인용하고(셸 단어 분리 규칙을 피하기 위해) 옵션을 비활성화하고(정규식의 선행 하이픈이 options 로 처리되는 것을 피하기 위해 grep
), 표준 입력이 grep되고 있음을 공식적으로 표시해야 할 수도 있습니다.
$ x="hi there"; (echo hi there; echo bye there) | grep -- "$x" -
hi there
테스트 조건의 결과만 필요한 경우에도 -q
옵션이 grep
관련될 수 있습니다 .