less
임의 문자열 "foo"의 첫 번째 인스턴스부터 마지막 인스턴스까지 어떻게 볼 수 있나요?
이 임의의 문자열은 로그의 거의 모든 줄에 나타납니다. grep "foo" bar.log | less
모든 관련 행에 표시되지 않기 때문에 이 작업을 수행하고 싶지 않습니다 .
파일이 다음과 같다고 가정합니다.
1 Random junk I don't want to see
2 Care about (foo)
3 Care about (foo)
4 Care about
5 Care about (foo)
6 Other random junk I don't want to see
불행히도 무시하고 싶은 줄은 좋은 패턴을 따르지 않습니다. 그렇지 않으면 그냥 grep -v 'insert pattern here'
.
less
어떻게든 다음 내용을 통합하는 방법을 알고 싶습니다 .
2 Care about (foo)
3 Care about (foo)
4 Care about
5 Care about (foo)
grep "foo" bar.log | less
내가 관심을 갖는 4행을 무시하기 때문에 작동하지 않습니다.
답변1
있다면 awk
다음과 같이 할 수 있습니다:
awk '/foo/{print b$0;b="";x=1;next} x{b=b$0"\n"}' bar.log | less
a가 foo
나타나면 버퍼( b
변수)와 현재 줄을 인쇄하고 버퍼를 지웁니다.
foo
그렇지 않으면 ( 변수)가 이미 존재하는 경우에만 x
현재 행을 버퍼링합니다.
답변2
이를 위해서는 신중한 쉘 인용이 필요하지만할 수 있다ed
이렇게 하려면 스크립트 가능한 편집기를 사용하세요.
printf '%s\n' "/foo/ka" "??" "'a,.w "'!less' q | ed -s file
그러면 다음 주소로 네 가지 명령이 전송됩니다 ed
.
/foo/ka
-- 첫 번째 일치 항목에서 foo 패턴을 검색하고(파일 시작 부분에서) 이름이 지정된 태그를 설정합니다a
.??
-- 검색을 파일 끝 부분에서 거꾸로 반복합니다. 여기서 중요한 부산물은 현재 줄을 해당 (마지막) 일치 항목으로 설정한다는 것입니다.'a,.w !less
a
- 현재 줄( )에 의해 명명된 태그에서.
다음 줄을 쉘 명령(!
) 에 씁니다less
.q
——편집을 종료합니다.
less
종료하려면 정상적으로( q
) 종료 해야 합니다 ed
. 이 솔루션은 패턴이 파일에 적어도 한 번 존재한다고 가정합니다. 그렇지 않으면 검색이 실패하고 ?
종료하기 전에 3을 얻게 됩니다.ed
답변3
일치하는 줄을 포함하는 대신 grep을 사용하여 제외하시겠습니까? 그렇다면 다음을 시도해 보세요.grep -v "Don't care about"