Bash, 배열을 파일과 비교하면 출력 줄이 일치하지 않습니다.

Bash, 배열을 파일과 비교하면 출력 줄이 일치하지 않습니다.

RHEL 시스템의 로그 파일 목록에서 문자열 배열을 수집했으며 파일에서 일치하는 행이 동일하지 않은 배열의 고유 행을 식별하고 싶지만 Google에서 검색할 수 없습니다.

이 배열 컬렉션 비트는 잘 작동합니다.

IFS=$'\n'

Z=( $(/usr/bin/grep -ir --exclude="*_audit.log" ' error' /var/log/*.log | grep "$(date +"%b %_d")" | grep -sv "$non_issue") )

Z를 반복하고 로그 파일에서 일치하는 줄을 확인하는 방법을 알 수 없습니다.

 if line in Z does not match any line in /report.log #repeat for each line in Z
  then
      echo this unique line 
fi

텍스트 줄은 로그 파일 출력이므로 , 등의 특수 문자가 많이 포함 /되어 있습니다 ".:

답변1

어때요?

IFS=$'\n'
## avoid using CAPS for shell variable names since global env vars are
## capitalized by convention and if yours are also caps, you can have naming collisions
z=( $(/usr/bin/grep -ir --exclude="*_audit.log" ' error' /var/log/*.log | 
      grep "$(date +"%b %_d")" | grep -sv "$non_issue") )

for line in "${z[@]}"; do
   grep -qF "$line" /report.log &&
     printf '%s\n' "$line"
done

비결은 다음 -F과 같이 사용하는 것입니다 grep.

       -F, --fixed-strings
              Interpret PATTERNS as fixed strings, not regular expressions.

따라서 해당 입력 -Fgrep특수 문자를 무시하고 =를 찾기 위한 일반 문자열로 처리됩니다. 다음으로 이는 -q"아무것도 인쇄하지 않음"을 의미하지만 해당 행이 발견된 경우에만 전체 작업이 성공합니다. 이는 &&"이전 명령이 성공한 경우에만 다음 명령을 실행한다"는 의미이므로 해당 행이 발견되면 인쇄합니다.

답변2

일부는comm명령은 다른 파일에 존재하지 않는 한 파일의 행을 표시할 수 있습니다. 로그 파일에서 수집된 문자열이 실제로 다음과 같다고 가정합니다.정확히 똑같다(즉, 일치합니다모두line /report.log)을 확인 중인 기본 파일에 추가하면 다음과 같이 할 수 있습니다.

comm -23 <(/usr/bin/grep -ir --exclude="*_audit.log" ' error' /var/log/*.log | 
           grep "$(date +"%b %_d")" | grep -sv "$non_issue" | sort | uniq)   \
         <(sort /regions.log | uniq)

기본적으로 이 명령은 세 가지 정보(첫 번째 파일의 행만, 두 번째 파일의 행만, 두 파일 모두의 행)를 출력합니다. 이 -23스위치는 마지막 두 파일의 출력을 억제하고 첫 번째 파일에 줄만 남겨 둡니다. 이 명령에는 정렬된 파일이 필요합니다.


구문에 익숙하지 않은 <( <some-command-pipeline> )경우프로세스 대체bash. bash의 출력을 임시 파일로 파이프 <some-command-pipeline>한 다음 해당 파일 이름을 comm.

다음은 문제를 설명하는 간단한 예입니다 comm. 두 번째 파일(편의를 위해 프로세스 대체를 통해 다시 생성됨)에 존재하지 않는 첫 번째 파일의 줄을 찾으려고 합니다. 이 경우에는 1, 25:

§ comm -23 <(echo 1 2 3 5 5 | tr ' ' '\n') <(echo 3 4 | tr ' ' '\n')
1
2
5

관련 정보