awk -v 변수 확장

awk -v 변수 확장

실행하면 awk '/2017-12-05T12:07:33.941Z/{y=1;next}y' file.json예상대로 작동하여 타임스탬프 이후의 모든 내용이 인쇄됩니다.

이 구문을 따르려고 노력 중입니다.Q&A하지만 내 구문이 올바르게 확장되지 않습니다.

awk -v last_log="$last_log" '/{print last_log}/{y=1;next}y' file.txt

또한 시도해 보십시오:

awk -v last_log="$last_log" '/$0 ~ last_log/{y=1;next}y' file.txt

예를 들어, 다음 입력이 주어지면 마지막으로 처리된 모든 로그( 2017-12-05T12:07:33.941Z)를 반환합니다.

{ "name": "PeriodicWork", "hostname": "myHost", "pid": 12189, "level": 20, "msg": "Executing [CheckFailedTask NodeId=8]", "time": "2017-12-05T10:07:33.941Z", "v": 0 }

{ "name": "PeriodicWork", "hostname": "myHost", "pid": 12188, "level": 50, "msg": "Executing [CheckFailedTask NodeId=8]", "time": "2017-12-05T12:07:33.941Z", "v": 0 }

{ "name": "PeriodicWork", "hostname": "myHost", "pid": 12187, "level": 40, "msg": "Executing [CheckFailedTask NodeId=8]", "time": "2017-12-05T12:57:33.941Z", "v": 0 }

답변1

2017-12-05T12:07:33.941Z여기서는 정규식( .뿐만 아니라 모든 문자와 일치함 .) 을 의도한 것이 아니라고 생각합니다 .

정규식 일치와 달리 하위 문자열 일치의 경우 다음을 사용할 수 있습니다 index().

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

나는 변수 에 백슬래시가 포함된 경우 변수의 내용을 파기하는 ENVIRON것을 선호합니다 (-v-vQ&A에서 이미 지적하셨듯이).

실패 이유에 대해:

/{print last_log}/

로서상황, {print last_log}정규식과 일치하는 레코드와 일치하지만 유효한 정규식이 아닙니다( or ... {로 사용해야 하는 정규식 연산자 입니다).{2}{1,5}

존재하다:

/$0 ~ last_log/

이번에도 정규식으로 일치를 시도합니다 $0 ~ last_log. 이는 다음을 포함하는 행을 의미합니다.0 ~ last_log 뒤쪽에줄 끝( $)이므로 절대 일치하지 않습니다. 아마도 다음과 같은 의미일 것입니다.

awk -v last_log="$last_log" '$0 ~ last_log {y=1;next};y' file.txt

그건상황$0 ~ last_log정규 표현식이 아닌 표현식 입니다 /foo/. 전체 레코드에 대해 정규식을 일치시키는 것의 /foo/약어입니다 .$0 ~ /foo/foo

당신은 그것을 할 수 있지만 정규식 일치가 아니기 때문에 그 자체로는 $0 ~ var불가능 하지만 0 이외의 숫자 또는 비어 있지 않은 숫자가 아닌 문자열 (귀하의 것과 같은 ) 이 포함 된 경우varvary

답변2

awk 간격 사용

last_log에서 eof까지는 "," 연산자를 통해 얻을 수도 있습니다.

 awk  '$0 ~ last, 0'  last="$last_log" file.txt

제시된 것처럼 last_log 값을 사용하십시오.

 awk "/$last_log/,0" file.txt

어쩌면 우리는 추가해야 할 수도 있습니다| tail -n +1

Sed 사용:

sed  "1,/$last_log/d"  file.txt

관련 정보