![awk 또는 sed를 사용하여 처음 4줄을 인쇄하시겠습니까? [폐쇄]](https://linux55.com/image/185182/awk%20%EB%98%90%EB%8A%94%20sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%B2%98%EC%9D%8C%204%EC%A4%84%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%98%EC%8B%9C%EA%B2%A0%EC%8A%B5%EB%8B%88%EA%B9%8C%3F%20%5B%ED%8F%90%EC%87%84%5D.png)
INVITE 메시지(CSeq:1 INVIte)가 있을 때마다 인라인으로 나타나기 때문에 첫 번째 네 번째 줄(Calling_party_IP)과 두 번째 줄(통화 번호)을 인쇄하고 싶습니다.
입력 예:
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP calling_party_IP:58929;branch=z9hG4bK93464974;received=calling_party_IP;rport=34653
From: <sip:98745@ip>;tag=123456
To: <sip:called number@ip>;tag=as4463463edc
Call-ID: some string
CSeq: 1 INVITE
Server:
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, PRACK, MESSAGE
Supported: replaces, timer
Content-Length: 0000
샘플 출력:
calling_party_IP
called number
답변1
질문의 의미에 대한 내 추측을 바탕으로 나는 이것을 가지고 있습니다. (편집: 질문이 개선되었으며 내 추측이 맞는 것 같습니다.)
기본 아이디어는 각 줄을 4개의 긴 배열로 저장하고 일치하는 항목이 있으면 이전 두 번째와 네 번째 줄을 인쇄하는 것입니다. 그러니 들어가세요
ant
bee
cat
dog
eel
fun
Find는 및 를 fun
인쇄합니다 .bee
dog
awk '/fun/{ print saved[(NR-4)%4],saved[(NR-2)%4]} {saved[NR%4]=$0}' file
이를 통해 패턴으로 끝나는 5줄의 블록이 겹쳐질 수 있습니다.