grep regex 패턴은 모든 일치 항목만 표시되고 같은 줄에 인쇄되는 각 줄에서 일치합니다.

grep regex 패턴은 모든 일치 항목만 표시되고 같은 줄에 인쇄되는 각 줄에서 일치합니다.

로그 파일에서 한 줄에 몇 가지 패턴을 추출하려고 합니다. 첫 번째 타임스탬프와 두세 개의 다른 일치 항목을 추출하려고 하는데 모든 일치 항목이 나타나는 줄에서만 일치 항목을 인쇄할 수 있기를 원합니다. 이 작업을 수행할 수 있는 단일 grep 명령이 있습니까, 아니면 각 줄을 반복해야 합니까?

내 로그 라인은 다음과 같습니다

2018-08-07 08:55:20 ERROR[t-dispatcher-24] - Error while processing message: code:[RequestTimeout], message:[{"from_addr_type": null, "transport_name": "999_abc_999_2_1", "in_reply_to": null, "group": null, "timestamp": "2018-08-07 07:55:19.795748", "from_addr": "341231231234", "message_type": "user_message", "helper_metadata": {}, "to_addr": "ABCD", "to_addr_type": null, "session_id": "157692", "content": "0013091779", "routing_metadata": {}, "message_version": "20110921", "transport_type": "XXXX", "provider": "abc_somewhere", "transport_metadata": {"abc_somewhere_XXXX": {"clientId": "XXXX157692", "starCode": "999", "session_id": "157692", "phase": "2", "dcs": "15", "requestId": "157692"}}, "session_event": "resume", "message_id": "5d9cab5353ff449783a737e8390a690b"}]

시작 부분의 타임스탬프, "content" 및 "to_addr" 섹션과 같은 특정 그룹을 추출할 수 있기를 원합니다.

나는 이것을 생각해 냈습니다 : grep -oP '(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})|"to_addr":"\K(\d+)|"content":\K"(.+?)"' | tr -d '\n'

하지만 세 가지 패턴이 모두 일치하는 라인만 선택할 수는 없습니다. 내가 뭘 잘못하고 있는 걸까? 내가 너무 많은 것을 기대하고 있는 걸까?

답변1

|패턴 사이에 OR을 사용하고 있으며 AND가 필요합니다.

귀하의 패턴에서 귀하는 다음을 검색하고 있지만 "to_addr":"\K(\d+)귀하의 예에서는 의 값이 to_addrABCD일치하지 않고 과 사이에 공백 이 \d+있습니다 ."to_addr:"ABCD"content

to_addr항상 이전인 경우 content:

grep -P '^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.*?"to_addr": "\d+.*?"content": ".+?"' 

그렇지 않으면 미리보기를 사용하십시오.

grep -P '^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}(?=.*?"to_addr": "\d+)(?=.*?"content": "(.+?)")' 

일치하는 항목만 인쇄하려면 Perl 한 줄짜리를 제안합니다.

perl -ane 'print "$1\t$2\t$3\n" if (/^(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})(?=.*?"to_addr": "(\d+))(?=.*?"content": "(.+?)")/)' file

관련 정보