|| awk ENVIRON 교체 사용 후

|| awk ENVIRON 교체 사용 후

타임스탬프를 기반으로 로그 파일을 잘라내기 위해 awk와 변수를 사용하고 있습니다.

LAST_LOG=$last_log awk 'index($0, ENVIRON["LAST_LOG"]) {y=1;next};y' $log_file ;

날짜가 로그 파일에 여전히 있으면 작동하지만 awk로그 파일이 보관되어 새 파일로 교체되면 실패합니다.

cat $log_file실패 하면 awk다음으로 대체하고 싶습니다.

LAST_LOG=$last_log awk 'index($0, ENVIRON["LAST_LOG"]) {y=1;next};y' $log_file ; \
  || cat $log_file

하지만 이 구문은 syntax error near unexpected token ||.

위 라인은 나중에 사용하거나 사용할 &&수 있는 정상적인 기능이 아닌가요 ?||

답변1

문제 ; ||

LAST_LOG=$last_log awk 'index($0, ENVIRON["LAST_LOG"]) {y=1;next};y' $log_file ; || cat $log_file

;호출을 종료하면 awk다음 명령이 로 시작하는데 ||이는 구문 오류입니다.

당신이 원하는 것은 y로그 파일 구문 분석이 끝날 때 1이 아닌지 확인하는 것입니다. 이 경우 make는 awk0이 아닌 종료 상태를 반환합니다.

LAST_LOG="$last_log" awk '
  index($0, ENVIRON["LAST_LOG"]) { y = 1; next }
  y                              { print }
  END                            { exit !y }' <"$log_file" || cat <"$log_file"

명시적이지 않으면 exit어떤 종류의 오류가 발생하면 0이 아닌 종료 상태를 얻게 됩니다.awk

답변2

의견을 보면 PO 명령을 수정/조정하는 방법이 분명합니다. 약간 다른 gnu-Awk 접근 방식을 사용합니다.

awk -v L=$last '$0 ~ L {y=1;next};y; END{if(!y) system("cat " FILENAME)}' $log
  • 어쩌면 조건이 $0 ~ L더 구체적일 수도 있습니다(예: $1 <= L또는 $1 == L).

관련 정보