임의 문자열의 첫 번째 인스턴스부터 마지막 ​​인스턴스까지 파일 내용을 가져옵니다.

임의 문자열의 첫 번째 인스턴스부터 마지막 ​​인스턴스까지 파일 내용을 가져옵니다.

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.

  1. /foo/ka-- 첫 번째 일치 항목에서 foo 패턴을 검색하고(파일 시작 부분에서) 이름이 지정된 태그를 설정합니다 a.
  2. ??-- 검색을 파일 끝 부분에서 거꾸로 반복합니다. 여기서 중요한 부산물은 현재 줄을 해당 (마지막) 일치 항목으로 설정한다는 것입니다.
  3. 'a,.w !lessa- 현재 줄( )에 의해 명명된 태그에서 .다음 줄을 쉘 명령( !) 에 씁니다 less.
  4. q——편집을 종료합니다.

less종료하려면 정상적으로( q) 종료 해야 합니다 ed. 이 솔루션은 패턴이 파일에 적어도 한 번 존재한다고 가정합니다. 그렇지 않으면 검색이 실패하고 ?종료하기 전에 3을 얻게 됩니다.ed

답변3

일치하는 줄을 포함하는 대신 grep을 사용하여 제외하시겠습니까? 그렇다면 다음을 시도해 보세요.grep -v "Don't care about"

관련 정보