특정 단어가 포함된 줄을 필터링하려고 합니다. 정규식은 스크립트에 대한 명령줄 입력입니다.
$0 ~ regex {
//Do something.
}
입력 예는 다음과 같습니다.
**String** **number**
domain 1
domain 2
bla 3
따라서 위의 입력에서 사용자는 "domain"이라는 단어가 포함된 행을 필터링한다고 말할 수 있습니다.
내가 시도한 것:
regex = "\?\\!domain"
(부정적 예측).
하지만 이 정규식은 모든 줄을 필터링합니다. "도메인"이라는 단어가 포함된 줄만이 아닙니다.
답변1
input
다음을 포함하는 특정 입력 파일의 경우:
domain
demesne
다음을 포함하는 필터 라인 domain
:
$ awk '/domain/ { print }' input
domain
행 필터링아니요포함하다 domain
:
$ awk '!/domain/ {print }' input
demesne
필터링 기준대지전체 줄 대신 새로운 주어진 파일로 다음을 시도해 볼 수 있습니다 input
.
example www.example.com
exemplar www.example.net
첫 번째 필드가 있는 행 필터링포함하다 example
:
$ awk '$1 !~ /example/ { print }' input
exemplar www.example.net
귀하의 질문에서는 $0
첫 번째 필드 대신 전체 행을 사용하고 있습니다.
답변2
행을 필터링하는 더욱 유연하고 강력한 또 다른 방법은 다음과 같습니다 {next}
.
- 모든 줄을 인쇄하려면원하지 않는다주어진 와 일치하고
regex
다음을 수행하십시오.awk '/regex/ {next} {print}' inputfile
이 방법을 사용하여 다음과 같이 특정 두 행 사이의 모든 행을 필터링할 수도 있습니다.
모든 줄을 인쇄아니요줄 일치
regex1
와 첫 번째 다음 줄 일치 사이에서regex2
다음을 수행합니다.awk '/regex1/,/regex2/ {next} {print}' inputfile
(제 기억이 맞다면) 이건 절대 아닙니다
awk '!/regex/'
.
예를 들어 inputfile
콘텐츠가 다음과 같은 경우:
hello, here is my confidential information
SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END
This is the end of my message
그러면 명령은 다음 awk '/SECRET INFO BEGIN/,/SECRET INFO END/ {next} {print}' inputfile
을 인쇄합니다.
hello, here is my confidential information
This is the end of my message
답변3
echo 'hello, here is my confidential information
SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END
This is the end of my message' |
mawk 'BEGIN { _^= FS = RS } ! /SECRET INFO/ ? _ : _ * (_=!_)'
gawk 'BEGIN { _^= FS = "SECRET INFO" } _*(NF <= _^_ || _=!_)'
hello, here is my confidential information
This is the end of my message