로그 파일의 두 문자열 사이에 있는 텍스트를 추출하는 방법은 무엇입니까?

로그 파일의 두 문자열 사이에 있는 텍스트를 추출하는 방법은 무엇입니까?

나도 비슷한 문제가 있는 것 같아이것하지만 불명확성으로 인해 폐쇄된 것으로 확인되어 새로운 질문을 작성하겠습니다.

여러 세부 정보가 포함된 한 줄 항목이 포함된 로그 파일이 있습니다.

예를 들어:

Mon Jan 22 12:12:12 2012 foo=blah   foo2=blah2  foo3=Some longer sentence that can contain spaces and numbers   somethingelse=blarg   foo5=abcdefg
Mon Jan 22 12:13:12 2012 foo=blah   foo2=blah3  foo3=another long sentence that could be the same or different that the prior log entry   somethingelse=blarg   foo5=112345abcdefg
Mon Jan 22 12:14:12 2012 foo=blah   foo2=blah2  foo3=Foo923847923874Some longer sentence that can contain spaces and numbers   somethingelse=blarg   foo5=abcdefg
Mon Jan 22 12:15:12 2012 foo=blah   foo2=blah2  foo3=Fooo02394802398402384Some longer sentence that can contain spaces and numbers   somethingelse=blarg   foo5=abcdefg

foo3의 콘텐츠 값을 추출하고 싶습니다. 즉, foo3=이후는 다 보고 싶은데 이전은 다 보고 싶다.somethingelse=

비슷한 일을 할 수 있을 거라 생각했는데 grep -oP 'foo3=[\s\S]*somethingelse='정규 표현식이 너무 탐욕스러워서 "중단(코어 덤프) 오류가 발생했습니다. 이 작업을 수행하는 더 효율적인 방법이 있나요?"

추가 참고 사항:

  • 로그 파일은 40,000줄이 넘을 정도로 대용량입니다.

답변1

foo3한 사람만 줄을 서 있으면

sed -n '/foo3=/{s/.*foo3=//;s/\S*=.*//;p}' file.txt

-n(옵션)에 의해 푸시된 라인을 제외한 모든 라인 의 인쇄를 비활성화합니다 p. 다음을 포함하는 행의 경우 foo3=:

  1. foo3=이전에 포함된 모든 항목( .*foo3=)을 아무것도 없는 항목( //)으로 바꿉니다.
  2. *공백이 아닌 some( ) 기호로 \S시작하는 모든 항목을 제거합니다 =.
  3. 두 번의 치환( ) 후 나머지를 인쇄합니다 p.

다른

sed -n 's/.*foo3=\([^=]*\)\s\+\S*=.*/\1/p' file.txt

전체 행을 ( ) 전후의 일부 ( ) 공백과 공백이 아닌 일부를 제외한 모든 기호를 포함하는 괄호 ( ) \1안의 패턴 ( ) 으로 바꾸고 해당 대체 문자만 사용하여 행의 나머지 부분을 인쇄합니다.\(...\)=foo3=*\s=

답변2

sed '/^foo3=/P;/\n/!s/[^ ]\{1,\}=/\n&/g;D' <infile >outfile

위 의 내용 대신 리터럴 개행 문자를 사용해야 할 수도 있지만 n이렇게 하면 foo3과 foo4 사이에 있는 내용만 인쇄됩니다.

더 빠른 처리를 위해 더 명시적으로 명시하세요.

sed '/\n/s/ [^ ]*=.*//p;/\n/!s/foo3=/\n\n&/;D' | grep .

또는 추가 grep상단을 사용하는 것도 더 빠릅니다.

sed 's/[^ ]\{1,\}=/\n&/g' | grep '^foo3='

답변3

이 시도:

$ grep -Po "(?<=foo3\=).*(?=\s*foo4)" file.txt

관련 정보