나는 "error"라는 단어가 포함된 어제와 오늘 사이의 로그 파일만 보고 존재하는 경우 간단한 Y/N을 반환하기 위해 다음 sed 줄을 작성했습니다.
나는 실제로 나에게 필요한 적절한 수익을 제공하지 않았습니다. 누군가 내가 무엇이 잘못되었는지 지적하도록 도와줄 수 있습니까?
today="$(date +%Y-%m-%d)"
yesterday="$(date -d '24 hour ago' +%Y-%m-%d)"
iserror="$(if [ sed -n "/"$yesterday"/,/"$today"/p" /mnt/data/systemlogs/logstash/logs/pipeline.log | grep "ERROR" ] = "" ; then
echo "No"
else
echo "Yes"
fi;
)"
답변1
여기서 구문이 잘못되었습니다.
iserror="$(if [ sed -n "/"$yesterday"/,/"$today"/p" pipeline.log | grep "ERROR" ] = "" ; then
echo "No"
else
echo "Yes"
fi;
)"
이 구문의 구문은 if [ ]
입니다 if [ condition ]
. 외부에 if [ command ] condition
있으므로 = ""
이미 가 있습니다 [ ]
. 이 코드를 실행하면 일부 구문 오류가 발생합니다.
$ iserror="$(if [ sed -n "/"$yesterday"/,/"$today"/p" pipeline.log | grep "ERROR" ] = "" ; then
echo "No"
else
echo "Yes"
fi;
)"
bash: [: missing `]'
grep: ]: No such file or directory
grep: =: No such file or directory
grep: : No such file or directory
당신이 시도하는 것은 다음과 같습니다
iserror="$(if [ $(sed -n "/"$yesterday"/,/"$today"/p" pipeline.log | grep "ERROR") = "" ] ; then
echo "No"
else
echo "Yes"
fi;
)"
하지만 그것도 좋지 않습니다. grep
아무것도 반환되지 않으면 매개변수가 손실되고 다른 오류가 발생하기 때문입니다.
$ iserror="$(if [ $(sed -n "/"$yesterday"/,/"$today"/p" pipeline.log | grep "bERROR") = "" ] ; then
echo "No"
else
echo "Yes"
fi;
)"
bash: [: =: unary operator expected
대신, grep -c
이를 사용하여 항상 숫자를 반환하고, 일치하는 항목이 없으면 0을 반환하고, 일치하는 항목이 있으면 일치하는 항목 수를 반환할 수 있습니다.
iserror="$(if [ $(sed -n "/"$yesterday"/,/"$today"/p" pipeline.log | grep -c "ERROR") -eq 0 ] ; then
echo "No"
else
echo "Yes"
fi;
)"
또는 더 간단하게 사용하면 grep -q
출력이 생성되지 않지만 무언가가 발견되면 성공적으로 종료되고 아무것도 발견되지 않으면 실패합니다.
iserror="$(sed -n "/"$yesterday"/,/"$today"/p" pipeline.log |
grep -q "ERROR" &&
echo Yes ||
echo No)"
그건 그렇고, 이것을 더 많이 활용하고 sed
관련 행에 일치하는 항목만 인쇄할 수도 있습니다.ERROR
iserror="$(if [ $(sed -n '/2022-10-26/,/2022-10-27/{ /ERROR/p }' pipeline.log | wc -l) -gt 0 ]; then
echo Yes;
else
echo No;
fi) "