로그 파일에서 작은따옴표 안의 문자열을 필터링하는 방법은 무엇입니까?

로그 파일에서 작은따옴표 안의 문자열을 필터링하는 방법은 무엇입니까?

다음과 같은 방식으로 정보를 출력하는 로그 파일이 있습니다.

2016-01-01: foo bar fnord
2016-01-01: this is static 'this is of interest' some blob bar
2016-01-01: this is static 'this is of interest' some hurz poit
2016-01-01: foo bar fnord
2016-01-01: this is static 'this is of interest as well' some blob bar

작은따옴표 안의 문자열만 인쇄하고 싶습니다. 중복된 항목은 다음과 같이 제거해야 합니다.

this is of interest
this is of interest as well

따옴표 사이에 무엇이 있는지 찾기 위해 정규 표현식을 사용해 보았지만 제대로 작동하지 못했습니다. 예를 들면 다음과 같습니다.

grep -io "static.*" |  sed -e '\w+'|'\w+(\s\w+)*'

답변1

cut정규 표현식을 작성하는 것보다 사용하기 쉽습니다.

grep -io "static.*" logfile.txt | cut  -d "'" -f2 | sort -u

이렇게 해보세요. 다음과 같이 인쇄됩니다.

this is of interest
this is of interest as well

답변2

"sed 전용" 솔루션은 다음과 같습니다.

sed -n 's/^.*'\''\([^'\'']*\)'\''.*$/\1/p' file

이는 다음과 같이 분류됩니다.

  • sed -np패턴 끝에 있는 옵션 과 함께 사용됩니다. 일치하는 줄만 인쇄합니다.
  • '\'''s/…/…/p'작은따옴표로 묶인 문자열(매개변수) 안에 작은따옴표를 지정하기 위한 쉘 표기법입니다.
  • 따라서 패턴은 ^.*'\''\([^'\'']*\)'\''.*$임의의 문자 시퀀스( )로 시작하고 ^.*그 뒤에 작은따옴표 ', [^'\'']*작은따옴표( )가 아닌 문자 시퀀스, 그 뒤에 작은따옴표 ', 나머지 문자가 오는 행과 일치합니다. 끝. 철사( .*$).
  • ([^'\'']*\)sed일치 항목의 일부가 변수에 저장되도록 괄호로 묶습니다.\1
  • 마지막으로 일치하는 줄 전체를 s/pattern_explained_above/\1/p변수의 내용 \1(즉, 작은따옴표 안의 문자열 부분)으로 바꾸고 인쇄( p옵션)합니다. 이 옵션으로 인해 -n패턴과 일치하지 않는 다른 모든 줄은 억제됩니다.

답변3

노력하다

awk -F\' '/static/ { if (!seen[$2]++) print $2 ;}' 

그리고

  • static정적 문자열입니다
  • !seen[$2]++처음에는 참, 다음에는 거짓
  • -F\''구분자 로 사용

관련 정보