/var/log/accountpolicy.log*
나는 기본적으로 인증 시간/횟수를 얻기 위해 로그를 구문 분석하는 스크립트(아마도 다른 것은 아닐 것임)를 작성하고 있습니다 . 초기 명령은 awk 스크립트 에 파이프하여 zgrep
실행 됩니다. 명령을 실행한 후 실패한 것이 있는지, 그렇다면 어느 부분이 실패했는지 확인하는 데 사용했습니다 .sudo
awk
${PIPESTATUS[@]}
현재 상태의 awk 스크립트는 다음과 같습니다.
#! /usr/local/bin/awk -f
BEGIN {
return_code = 0
if ( length( username ) == 0 ){
return_code = 2
exit return_code
}
rows = 0
}
{
if ( $8 != sprintf("\"%s\",", username ) ) next
rows = rows+1
print $0
}
END {
if ( return_code > 0 ) exit return_code
if ( rows == 0 ) exit 3
}
awk 스크립트에는 일부 사용자 정의 값 유효성 검사 및 종료 코드가 있습니다. 반환 코드 1, 2, 3은 다음을 의미합니다.
- awk 실패(awk 관련 이유로)
- awk로 확인된 사용자 이름이 지정되지 않았습니다.
- 사용자 이름이 지정되었지만 값이 없습니다.
테스트 #1(잘 작동함)
실행 예(이 질문은 특히 반환 코드와 관련되어 있으므로 awk 스크립트의 출력을 숨깁니다):
$ sudo -n zgrep -h AuthenticationAllowed /var/log/accountpolicy.log* 2>/dev/null | awk -v username="${USER}" -f ./parse-accountpoliocy.awk &>/dev/null
$ echo ${PIPESTATUS[@]}
0 0
${PIPESTATUS[@]}
show 와 sudo
are 성공적인 것을 볼 수 있습니다 . 이는 sudo 액세스 권한이 있고 awk 변수가 설정되어 있고 로그 항목이 있다는 awk
것을 알고 있기 때문에 예상되는 결과입니다 .username
테스트 #2(잘 작동함)
이제 awk 변수를 username
계정으로 변경하면존재하지 않는다, 그러면 awk 스크립트는 반환 코드와 함께 종료되어야 합니다 3
.
$ sudo -n zgrep -h AuthenticationAllowed /var/log/accountpolicy.log* 2>/dev/null | awk -v username="fakeuser" -f ./parse-accountpoliocy.awk &>/dev/null
$ echo ${PIPESTATUS[@]}
0 3
완벽한!
테스트 #3 (질문..)
위 명령을 실행했지만 username
awk 변수 정의를 생략하면 awk 스크립트가~해야 한다반환 코드는 2 종료입니다.
$ sudo -n zgrep -h AuthenticationAllowed /var/log/accountpolicy.log* 2>/dev/null | awk -f ./parse-accountpoliocy.awk &>/dev/null
$ echo ${PIPESTATUS[@]}
141 2
보시다시피 awk 스크립트는하다return 2
이지만 지금은 명령의 해당 부분이 전혀 변경되지 않았음에도 불구하고 어떤 이유에서든 sudo
/ zgrep
return 입니다 ... 그게 제가 겪고 있는 문제입니다.141
출력을 숨기지 않고 명령을 실행해 보았습니다(둘 중 하나).표준 출력또는표준 오류 오류율), 결과는 동일하지만 오류는 보고되지 않습니다.
$ sudo -n zgrep -h AuthenticationAllowed /var/log/accountpolicy.log* | awk -f ./parse-accountpoliocy.awk
$ echo ${PIPESTATUS[@]}
141 2
질문
스크립트의 종료 코드는 그 안에 저장된 /command의 종료 코드를 어떻게 변경합니까 awk
?sudo
zgrep
${PIPESTATUS[@]}
환경정보
- OSx 버전: 10.11.6(엘 캐피탄)
- 히트 버전: 4.4.12
- AWK 버전: GNU Awk 4.1.4
답변1
$ echo $((141-128))
13
$ kill -l | grep 13
13 PIPE Broken pipe 29 INFO Information request
$
wait(2)
따라서 141은 신호를 포함하는 16비트 종료 상태 단어(참고자료 참조)를 단일 숫자로 통합하는 쉘 PIPE
의 방법입니다.exit 3
뒤쪽에파이프로 연결되는 데이터의 처리가 완료되었습니다 ( 파이프를 통해 awk
더 이상 쓸 내용이 없습니다 ). zgrep
대신, 파이프하려는 데이터가 아직 남아 있는 동안 초기에 발생하므로 awk
사라진 데이터를 쓰려고 할 때 a가 발생합니다 .exit 2
zgrep
awk
zgrep
PIPE
awk