다음과 같은 방식으로 정보를 출력하는 로그 파일이 있습니다.
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 -n
p
패턴 끝에 있는 옵션 과 함께 사용됩니다. 일치하는 줄만 인쇄합니다.'\''
'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\'
'
구분자 로 사용