我正在嘗試使用包含方括號的 awk 匹配模式。我試圖匹配的模式是:
[senderProcess:$PROCESS_ID:val:$ID]
其中PROCESS_ID和ID是現有的 shell 變數。我嘗試在我的 awk 陳述句中定義一個模式變數:
awk -v pattern="[senderProcess:$PROCESS_ID:val:$ID]" '$0 ~ pattern && /GCLInbox run FINE/' $innerfile
當我運行它時,我收到以下錯誤:
awk: cmd. line:1: (FILENAME=logset1/teach-node-06.40490.log FNR=1) fatal: invalid regexp: Invalid range end: /[senderProcess:teach-node-06:40190:val:67]/
我將此作為 awk shell 將方括號解釋為正則運算式特殊字符,因此我嘗試轉義括號:
... pattern="\[senderProcess...$ID\]" ...
除了以下兩個錯誤之外,這給出了相同的錯誤:
awk: warning: escape sequence `\[' treated as plain `['
awk: warning: escape sequence `\]' treated as plain `]'
我也嘗試過雙重轉義括號,結果相同。
我在宣告模式時嘗試使用單引號而不是雙引號,但是我得到了相同的錯誤,無論如何,我的 shell 變數需要擴展,這不會發生在這里。
我只想匹配給定的模式,包括它的方括號,無論是通過繞過正則運算式特殊字符還是其他方式。非常感謝任何幫助。
uj5u.com熱心網友回復:
您應該使用嘗試以下代碼的index功能。awk將一些測驗值設定為命名的 shell 變數ID,PROCESS_ID盡管它建議在小情況下使用 shell 變數名稱,只是在此處與您的示例一起使用。然后創建一個名為的shell變數var,它連接了上述2個shell變數,然后傳遞var給awk程式。
ID="test1"
PROCESS_ID="test"
var="[senderProcess:${PROCESS_ID}:val:${ID}]"
awk -v pattern="$var" 'index($0,pattern) && /GCLInbox run FINE/' Input_file
uj5u.com熱心網友回復:
創建動態正則運算式,您可以在串列中包含'['和,并將每個標識為字符而不是串列的開始/結束。']'[...]
我會嘗試類似的東西:
awk -v pattern="[[]senderProcess:$PROCESS_ID:val:$ID[]]" 'pattern && /GCLInbox run FINE/' $innerfile
uj5u.com熱心網友回復:
不知何故,當我直接將它設定FS為時,沒有轉義,它起作用了,但只是因為awk只是將它視為單個字符類,因此里面的所有字母都是有效的:
echo '[senderProcess:$PROCESS_ID:val:$ID]' |
mawk -v FS='[senderProcess:$PROCESS_ID:val:$ID]' '!_<NF' gawk -v FS='[senderProcess:$PROCESS_ID:val:$ID]' '!_<NF' nawk -v FS='[senderProcess:$PROCESS_ID:val:$ID]' '!_<NF'
[senderProcess:$PROCESS_ID:val:$ID]
正確地做到這一點:
gawk 'index($-_,__)' __='[senderProcess:$PROCESS_ID:val:$ID]'
[senderProcess:$PROCESS_ID:val:$ID]
逃避你需要的一切:
mawk -v __='[senderProcess:$PROCESS_ID:val:$ID]' ' BEGIN { ___=__ gsub("[[-_!-/:-@{-~]", "[&]",__) gsub("["(_="\\\\")"^]",_ "&",__) printf("%s original pattern :\f%s\n after escaping :\f%s%s", ORS = "\n\n",___,__,ORS)>("/dev/stderr") } ($-_)~__'
original pattern :
[senderProcess:$PROCESS_ID:val:$ID]
after escaping :
[[]senderProcess[:][$]PROCESS[_]ID[:]val[:][$]ID[]]
[senderProcess:$PROCESS_ID:val:$ID
uj5u.com熱心網友回復:
我也嘗試過雙重轉義括號,結果相同。
你很接近,你可能會通過使用得到想要的結果\\\,考慮下面這個簡單的例子讓file.txt內容成為
[]
[1]
[12]
然后
awk -v pattern="\\\[.\\\]" '$0 ~ pattern' file.txt
給出輸出
[1]
(在 gawk 4.2.1 中測驗)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/516882.html
標籤:壳awk
