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.
따라서 해당 입력 -F
은 grep
특수 문자를 무시하고 =를 찾기 위한 일반 문자열로 처리됩니다. 다음으로 이는 -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
, 2
및 5
:
§ comm -23 <(echo 1 2 3 5 5 | tr ' ' '\n') <(echo 3 4 | tr ' ' '\n')
1
2
5