grep: AIX에서 인식되는 플래그가 아닙니다.

grep: AIX에서 인식되는 플래그가 아닙니다.

테이블에서 데이터 세트를 가져와서 result.txt. 이제 해당 파일에서 각 줄을 선택하고 로그 파일에서 검색하여 해당 줄이 있는지 확인하겠습니다. 로그 파일에 없으면 별도의 파일(예: notfound.txtAIX 서버에서 작업 중이고 다음 명령 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첫 번째 인수(형식 문자열)가 아닌 한 대시로 시작하는 인수를 잘 처리하는 로 전환하는 것입니다.

또한 대문자 변수 이름은 사용하지 말아야 합니다. 이는 시스템용으로 예약되어 있습니다.

마지막으로 스크립트에서는 명시적인 검사가 거의 필요하지 않습니다 $?. 이는 이미 ifwhile기타 제어 구조에 의해 수행됩니다.

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

관련 정보