테이블에서 데이터 세트를 가져와서 result.txt
. 이제 해당 파일에서 각 줄을 선택하고 로그 파일에서 검색하여 해당 줄이 있는지 확인하겠습니다. 로그 파일에 없으면 별도의 파일(예: notfound.txt
AIX 서버에서 작업 중이고 다음 명령 error )에 기록하려고 합니다 grep
. 누군가 문제를 파악하는 데 도움을 줄 수 있나요?
이것은 내 스크립트입니다.
while read -r LINE; do
grep -q "$LINE" log.log
if [ $? -eq 0 ]
then
echo "$LINE" >> /home/notfound.txt
fi
done < result.txt
이로 인해 다음과 같은 결과가 나왔습니다.
grep: 인식되지 않는 플래그: - 사용법: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [ - p[parasep]] -e 패턴 목록... [-f 패턴 파일...] [파일...]
사용법: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] [-e 패턴 목록...] -f 패턴 파일... [파일...]
사용법: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] 패턴_목록 [파일 ...]
답변1
$LINE
대시로 시작하는 값이 포함된 것 같습니다 .
다음과 같은 방법으로 이런 일이 발생하는 것을 방지할 수 있습니다.
grep -q -e "$LINE"
보다 일반적으로 대부분의 Unix 명령에서는 --
옵션 끝 표시를 허용하므로 이 "옵션 끝" 옵션 이후의 모든 인수는 옵션이 아닌 문자 그대로의 인수로 처리됩니다.
echo
또한 문제가 있을 수 있습니다. 이식 가능한 솔루션은 printf
첫 번째 인수(형식 문자열)가 아닌 한 대시로 시작하는 인수를 잘 처리하는 로 전환하는 것입니다.
또한 대문자 변수 이름은 사용하지 말아야 합니다. 이는 시스템용으로 예약되어 있습니다.
마지막으로 스크립트에서는 명시적인 검사가 거의 필요하지 않습니다 $?
. 이는 이미 if
및 while
기타 제어 구조에 의해 수행됩니다.
if grep -q -e "$line" log.log; then
printf '%s\n' "$line"
fi
최적화로서 루프 외부에 리디렉션을 배치하면 작업이 더 빨라집니다.
while read -r line; do
grep -q -e "$line" log.log && printf '%s\n' "$line"
done <results.txt >notfound.txt