Awk

如何使用萬用字元在 2 個模式之間列印文本?

  • January 7, 2020

我需要擷取兩個模式之間的文本,但這些模式可能包含變化的數字。此外,我只關心以該字母序列開頭的具有這​​種結構的行,任何其他序列或結構都應該被忽略。它們可以是我要擷取的左側的兩位數,但在右側,位數將保持不變

前任:

ab-cd-1.1.1.11-CAPTURE-11111111.xyz

或者

ab-cd-22.1.11.1-CAPTURE-11111112.xyz

使用下面的命令,如果我假設數字沒有改變,我可以獲得我需要的東西,但我不確定如何計算隨機數。任何幫助,將不勝感激。

echo "ab-cd-1.1.1.11-CAPTURE-11111111.xyz" | sed "s/.*ab-cd-1.1.1.11-//;s/-.*//"

您可以嘗試awk使用-來分隔標記:

awk -F\- '{print $4}' input_file

如果您想應用其他過濾器,這是一種可能的方法:

<exec some filter based on other fields> input_file|awk -F\- '{print $4}'

根據您編輯的答案,如果您希望以ab-cd腳本開頭的字元串將是

awk -F\- '$1=="ab" && $2=="cd" {print $4}' input_file

根據最後的要求,這是腳本:

awk -F\- '$1=="ab" && $2=="cd" {split($5,a,"."); if (int(a[1])==a[1] && length(a[1])==8) print $4}' input_file

我的文件測試:

cat qq
ab-cd-1.1.1.11-CAPTURE-11111111.xyz
ab-cd-1.1.1.11-CAPTURa-1111111a.xyz
ab-cd-1.1.1.11-CAPTURb-1111111.xyz
ab-cd-1.1.1.11-aAPTURE-a1111112.xyz


awk -F\- '$1=="ab" && $2=="cd" {split($5,a,"."); if (int(a[1])==a[1] && length(a[1])==8) print $4}' qq
CAPTURE

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