我正在尝试过滤掉包含特定单词的行。正则表达式是脚本的命令行输入。
$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