Awk

如何在有AWK的特定字元串之前的括號之間提取值

  • September 2, 2021

我能夠使用 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)。

考慮到要提取語句括號的內容if ($remote_addr ~ ( ... ) ),以下awk程序應該:

awk 'index($0,"$remote_addr"){sub(/^.*\(/,"");sub(/\).+$/,"");print}' inputfile

這將匹配包含字元串的行$remote_addr。在該行中,它將刪除從 start-of-line 到 last 的(所有內容,以及從 first)到 end-of-line 的所有內容。然後它在行上列印剩餘的值。

由於它是單行的簡單替換,因此我只使用 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

引用自:https://unix.stackexchange.com/questions/667147