다음 내용이 포함된 test.txt 파일이 있습니다.
line random text 1
line random text 2
line random text 3
line particular exception
line except detail 1
line except detail 2
line except detail 3
....
line random text 14
line random text 15
line random text 16
line particular exception
line except detail 1
line except detail 2
line except detail 3
.....
"특정 예외"가 발생하는 파일 콘텐츠를 필터링하고 그 뒤에 나타나는 "특정 예외" 세부 정보(항상 3줄)를 필터링하기 위한 출력(추가 grep용)을 원합니다.
내가 생각해낸 논리적 명령은 다음과 같습니다.
cat test.txt | grep -v -A 3 "particular exception"
하지만 예상대로 작동하지 않습니다.
이를 수행하는 올바른 방법은 무엇입니까?
어떤 상황에서는 계속 반복되는 특정 예외를 제외하고 로그 파일에서 예외를 찾는 것이므로 먼저 해당 예외를 지우고 싶습니다.
답변1
grep
대신 다음을 사용하여 GNU를 사용할 수 있습니다 sed
.
sed -e '/particular exception/,+3d' test.txt
그러면 일치하는 줄을 찾아 해당 줄 particular exception
과 그 뒤의 세 줄을 삭제합니다.
답변2
사용 awk
:
$ awk -v n=3 -v p='particular exception' 'match($0,p) { skip=n+1 } --skip < 0' test.txt
line random text 1
line random text 2
line random text 3
....
line random text 14
line random text 15
line random text 16
.....
건너뛸 후행 컨텍스트의 줄 수는 명령줄에 eg 로 지정되고 -v n=3
, 일치시킬 정규식도 명령줄에 로 지정됩니다 -v p='expression'
.
한 줄을 읽을 때마다 변수는 skip
1씩 감소하고, 변수가 0보다 작으면 skip
스크립트는 현재 줄을 인쇄합니다. 관심 있는 패턴이 발견되면 skip
변수는 해당 값을 가져오며, n + 1
이는 n
현재 행과 추가 행을 건너뛰게 됨을 의미합니다.
match($0,p)
로 쓸 수도 있습니다 $0 ~ p
.