![如何使用 AWK 提取括号之间的值,其中前面有特定字符串](https://linux22.com/image/195121/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20AWK%20%E6%8F%90%E5%8F%96%E6%8B%AC%E5%8F%B7%E4%B9%8B%E9%97%B4%E7%9A%84%E5%80%BC%EF%BC%8C%E5%85%B6%E4%B8%AD%E5%89%8D%E9%9D%A2%E6%9C%89%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我能够使用 awk 表达式捕获括号之间的所有值
'NR>1{print $1}' RS='(' FS=')'
但我很难具体匹配一个,我不想按行号匹配,而是按字符串匹配。不确定 awk 是否可以做到这一点。
原始文件内容为
if ($remote_addr ~ ^(1.2.3.4|5.6.7.8)$) {
set $maintenance off;
}
if ($maintenance = on) {
return 503;
}
其中有多个不同顺序的括号。
我需要1.2.3.4|5.6.7.8
从该行中提取内容
if ($remote_addr ~ ^
(或者只是在包含 的行中$remote_addr
)。
答案1
因为它是单行上的简单替换,所以我只使用 sed 来实现:
$ sed -n 's/.*$remote_addr[^(]*(\([^)]*\).*/\1/p' file
1.2.3.4|5.6.7.8
如果您确实想使用 awk,那么您可以使用任何 awk 来执行此操作:
$ awk 'sub(/.*\$remote_addr[^(]*\(/,"") && sub(/).*/,"")' file
1.2.3.4|5.6.7.8
答案2
考虑到您要提取的内容内括号内的语句if ($remote_addr ~ ( ... ) )
,下面的awk
程序应该:
awk 'index($0,"$remote_addr"){sub(/^.*\(/,"");sub(/\).+$/,"");print}' inputfile
这将匹配包含字符串的行$remote_addr
。在该行中,它将删除从行首到最后一行的所有内容(
,以及从第一行)
到行尾的所有内容。然后它会打印该行的剩余值。
答案3
你也可以尝试这个sed
sed -En '/\$remote_addr/ s/.*\(([0-9.]*\|[0-9.]*)\).*/\1/p' $file
它将匹配任何行,$remote_addr
然后提取匹配项。
代码应该能够在不事先显式匹配的情况下匹配模式$remote_addr
。
sed -En 's/.*\(([0-9.]*\|[0-9.]*)\).*/\1/p' $file
输出
1.2.3.4|5.6.7.8
答案4
awk '/\$remote_addr/{for(i=1;i<=NF;i++){if($i ~ /\([0-9].*|[0-9].*\)/){print $i}}}' filename|awk -F "(" '{gsub(/\).*/,"",$2);print $2}
输出
1.2.3.4|5.6.7.8