在awk命令中使用组合正则表达式变量

时间:2017-09-24 08:16:25

标签: bash awk gawk

我试图在awk命令中使用正则表达式,其中这个正则表达式应该是一个变量,我可以在调用awk命令之前更改它

实施例: gawk 'BEGIN{RS=ORS="\n\n" {s=tolower($0)} s~/word1|word2/' file1.log

这对我有用,这个命令打印所有行包含来自last" new line"中的words1或word2;到下一个"新线"

我想要做的是,将word1和word2放在变量中并在gawk中使用

例如:

正则表达式=" WORD1 | WORD2" gawk 'BEGIN{RS=ORS="\n\n" {s=tolower($0)} s~/$regex/' file1.log

可以更改正则表达式取决于我的程序 我搜索并尝试了许多解决方案,但没有任何方法可以帮助我

我试过的解决方案:

1)regex =" word1 | word2&#34 ;; gawk 'BEGIN{RS=ORS="\n\n" {s=tolower($0)} s~/$regex/' file1.log

2)regex =" word1 | word2" gawk -v pat="$regex" 'BEGIN{RS=ORS="\n\n" {s=tolower($0)} s~/pat/' file1.log

3)regex =" word1 | word2" gawk 'BEGIN{RS=ORS="\n\n" {s=tolower($0)} {pat=$regex} s~/pat/' file1.log

4)regex =" word1 | word2" echo $regex | gawk 'BEGIN{RS=ORS="\n\n" {s=tolower($0)} s~/$1/' file1.log

提前致谢!

2 个答案:

答案 0 :(得分:3)

请您试着跟随并告诉我这是否对您有帮助。

如果你想将两个字符串保存在一个变量中,并希望在awk中用作正则表达式,那么下面的内容也可以帮助你。

regex='word1|word2'
awk -v reg="$regex" 'tolower($0) ~ reg' Input_file

这里也有几点:

I-因为你没有提供任何数据Input_file样本所以无法测试它,但我的直觉是它应该工作。

II-然后你在RS的BEGIN部分提到ORS\nawk,这是多余的,因为默认情况下它们被设置为新行所以你可以从代码中删除那部分。

答案 1 :(得分:0)

如果你想把它作为复合表达式输入,我猜你也可以这样做:

awk -v pat="$regex" '{split(regex, a, "|")}tolower($0) ~ a[1] || tolower($0) ~ a[2]'

假设您的正则表达式输入为:regex="word1|word2"