우리는 XML 메시지를 로그에 다운스트림 시스템에 기록합니다.
로그 항목에서 XML을 추출 하려고 하는데 sed
사용 방법을 잘 모르겠습니다.
다음은 일반적인 로그 항목입니다.
2018-02-20T10:02:51.395Z|hostname1|user1||Application Name||10062|DEBUG|o.s.i.channel.DirectChannel||postSend (sent=true) on channel 'logger', message: GenericMessage [payload=<?xml version="1.0" encoding="UTF-8" standalone="yes"?><canonMessage xmlns="somenamespace">...the message body...</canonMessage>, headers={quote_format=FpML, id=f572ea65-91dd-a610-7976-5a1e97c16524, quote_message_id=b640bd90-1624-11e8-a904-bd3c0f5af83b_1519120971176, quote_data=Quote Rep, quote_transaction_originator=user1, timestamp=1519120971394}]
XML에서 로그 항목의 앞부분과 끝 부분을 제거하는 방법은 무엇입니까?
sed
위 줄의 출력은 다음과 같아야 합니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><canonMessage xmlns="somenamespace">...the message body...</canonMessage>
답변1
grep -o '<?xml.*</canonMessage>' /path/to/log
그러면 문제가 해결될 것입니다.
-o
옵션이 말해 grep
준다오직제공된 정규식과 일치하는 데이터를 출력합니다. 운 좋게도 당신은 단지 이야기를 나누기 위해 여기에 왔습니다발췌(일부) XML이 아닌분석하다그것.
답변2
아래에 언급된 sed 명령을 사용하여 위에서 언급한 출력을 얻었습니다.
sed "s/.*payload=//g" input.xml | sed "s/,.*//g"
산출
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><canonMessage xmlns="somenamespace">...the message body...</canonMessage>
답변3
만약 너라면진짜대신 sed를 사용하고 싶습니다grep, 검색 및 교체를 수행하고 일치하는 항목만 인쇄하도록 할 수 있습니다.
sed -n 's%.*\(<?xml .*</canonMessage>\).*%\1%p' < input
여기서는 -n
기본적으로 해당 행을 인쇄한 다음 <?xml ...</canonMessage>
해당 텍스트 주위의 이스케이프 괄호를 사용하여 텍스트를 검색하여 번호가 매겨진 슬롯에 "캡처"합니다. 필요한 XML 텍스트 앞뒤에 그리 .*
디 정규식 캡처를 추가하면 전체 줄을 저장된 텍스트로 바꾼 \1
다음 결과 줄을 인쇄할 수 있습니다.
저는 일반적인 슬래시 구분 기호 %
때문에 검색 텍스트와 대체 텍스트를 구분 하곤 했습니다 . </canonMessage>
슬래시 구분 기호를 선호하는 경우 일치시키려는 구분 기호를 이스케이프 처리하세요.
sed -n 's/.*\(<?xml .*<\/canonMessage>\).*/\1/p' < input