실행하면 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
-v
Q&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 이외의 숫자 또는 비어 있지 않은 숫자가 아닌 문자열 (귀하의 것과 같은 ) 이 포함 된 경우var
var
y
답변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