다음은 샘플 .log 파일입니다(더 많은 줄이 있을 수 있음).
2022 User abc (iii)
2023 defaa <party> ttt
2222221 User def (bbb)
20222 defaa <accoun> ttt
2222 User dddd (aaa)
3333 defaa <hahaha> jmd
User
& 사이의 행을 선택하고 싶습니다 .ttt
이는 로그의 5~7행과 유사하며, 이 로그에는 User
&로 구성된 행이 더 있을 수 있습니다.ttt
User
ttt
그래서 파일에서 반복되더라도 & 사이의 모든 줄을 가져오는 방법을 알고 싶습니다.
텍스트 User
및 ttt
항상 연속된 줄에 있는 것은 아님
예상 출력:
abc (iii)
2023 defaa <party>
def (bbb)
20222 defaa <accoun>
중첩된 경우 다음과 같습니다.
2022 User abc (iii)
2222221 User def (bbb)
20222 defaa <accoun> ttt
2023 defaa <party> ttt
예상 출력:
def (bbb)
20222 defaa <accoun>
사용자와 ttt는 결코 같은 줄에 있지 않습니다
답변1
multi-character 에 대한 GNU awk의 약어를 사용하면 원하는 것일 수 있습니다 RS
.RT
\s
[:space:]
$ awk -v RS='\\s*ttt' 'RT && sub(/.*User\s*/,"")' file
abc (iii)
2023 defaa <party>
def (bbb)
20222 defaa <accoun>
부분 일치를 허용하지 않으려면 User
주위 ttt
에 단어 경계를 추가하십시오.
awk -v RS='\\s*\\<ttt\\>' 'RT && sub(/.*\<User\>\s*/,"")' file
답변2
를 사용하면 sed
주소 범위를 선택 User
하고 ttt
이를 예약된 공간에 수집할 수 있습니다.
sed '/User/,/ttt/!d;H;/User/h;/ttt/!d;x;s/.*User //;s/ttt.*//' yourfile
상해:
/User/,/ttt/
User
다음 범위까지 행을 선택합니다ttt
(중첩된 경우에 필요한 대로). 선택 항목이 반전!
되어d
제거됩니다. 따라서 이 단계에서는 해당 범위 밖의 모든 행을 삭제합니다. 안타깝게도User
파일 끝부터 끝까지 마지막 단락은 다음과 같습니다.아니요제거되었으므로 이를 제거할 방법이 필요합니다.H
예약된 공간에 모든 행을 추가하는 동안/User/h
복사행을User
예약된 공간에 추가하므로 예약된 공간에는User
현재 행까지의 모든 행이 포함됩니다. 이런 식으로 새User
행은 예상대로 중첩으로 이전의 모든 것을 덮어씁니다./ttt/!d
가 없는 모든 행에서 실행을 중지하므로 저장 공간에 ttt`의 모든 내용을ttt
수집할 때까지 출력이 생성되지 않습니다 .User' to
- 하지만 일단 모든 것을 다 모은 후에는
x
버퍼를 변경하여 패턴 공간의 예약된 공간에서 해당 라인을 가져올 수 있습니다. - 그럼
User
다 삭제해s/.*User //
ttt
다음으로 시작하는 모든 항목을 삭제합니다 .s/ttt.*//