나도 비슷한 문제가 있는 것 같아이것하지만 불명확성으로 인해 폐쇄된 것으로 확인되어 새로운 질문을 작성하겠습니다.
여러 세부 정보가 포함된 한 줄 항목이 포함된 로그 파일이 있습니다.
예를 들어:
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=
:
foo3=
이전에 포함된 모든 항목(.*foo3=
)을 아무것도 없는 항목(//
)으로 바꿉니다.*
공백이 아닌 some( ) 기호로\S
시작하는 모든 항목을 제거합니다=
.- 두 번의 치환( ) 후 나머지를 인쇄합니다
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