Linux
如何在從文件 1 到文件 2 的關鍵字第 n 次出現後添加一行
# Nexae Linux servers ## subparent Nexas Nexae_NIX Linux title Nexae Linux servers group-eorted NFe zluetere 10.48.37.67 zintxzpanae01 # teetip NOzOLUMNe:info,trende 10.59.31.67 etrtxzpanae01 # teetip NOzOLUMNe:info,trende group-sorted ZBTS 10.48.37.11 zinpl001z3a01 #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.12 zinpl001z3a02 #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.13 zinpl001z3a03 #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.14 zinpl001z3a04 #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.41 zinpl001z3b01 #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.42 zinpl001z3b02 #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.31 zinvl201a3001 #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.32 zinvl201a3002 #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.33 zinvl201a3003 #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.150 zinvl201a3004 #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.151 zinvl201a3005 #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.152 zinvl201a3006 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.20 zinvl201a3007 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.39 zinvl201a3008 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.65 zinvl201a3009 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.66 zinvl201a3010 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.70 zinvl201a3011 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.158 zinvl201a3012 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.48.37.34 zinvl201a3013 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" group-sorted NTTA 10.59.31.11 etrpl001z1a01 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.12 etrpl001z1a02 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.13 etrpl001z1a03 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.14 etrpl001z1a04 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.31 etrvl201a1001 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.32 etrvl201a1002 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.33 etrvl201a1003 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.150 etrvl201a1004 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.151 etrvl201a1005 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.152 etrvl201a1006 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.44 etrvl201a1008 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.47 etrvl201a1009 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.39 etrvl201a1010 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.65 etrvl201a1011 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.66 etrvl201a1012 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 10.59.31.70 etrvl201a1013 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" 170.252.208.216 etrvl201a1007 # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3" ####################################################### ##
以上是
HO
文件的例子。我正在使用下面sed
的程式碼來匹配文件中的關鍵字group-sorted NTTA
,ho
然後將文件中的所有條目插入t4
到ho
.sed -i.bak '/^group-sorted NTTA$/!b;N;N;r t4' ho
但是關鍵字
group-sorted NTTA
在文件中出現了 15 次,所以如果我想在中間關鍵字之後插入條目。我可以這樣做sed
嗎?
要在文件 H0 中的
n
-th 出現後兩行插入文件 t4 的內容,請嘗試:^group-sorted NTTA$
awk -v n=2 'FNR==NR{t=t"\n"$0;next} /^group-sorted NTTA$/ && n==++cnt {x=NR+3} NR==x{print substr(t,2)} 1' t4 H0
雖然毫無疑問有一個
sed
解決這個問題的方法,但awk
這裡是一個更自然的選擇,因為awk
了解算術。例如,這使得程式在第-次出現 where is a variableawk
之後執行某些操作變得更容易。n``n
這個怎麼運作
-v n=2
這設置了 的值
n
。
FNR==NR{t=t"\n"$0;next}
當讀取第一個命名的文件時
t4
,這會將其內容保存在變數中t
。
/^group-sorted NTTA$/ && n==++cnt {x=NR+3}
在讀取第二個文件時
H0
, 的出現次數^group-sorted NTTA$
保存在變數 中cnt
。如果cnt
等於n
,那麼我們將變數分配給x
目前行號的值,NR
,加上 3。
NR==x{print substr(t,2)}
當我們到達行號
x
時,我們列印變數的內容t
。(該substr
命令刪除了多餘的前導換行符。)
1
這是 awk 對 print-the-current-line 的簡寫。
例子
考慮這些輸入文件:
$ cat H0 blah, blah group-sorted ZBTS 10.48.37.11 zinpl001z3a01 #"TRENDe 10.48.37.12 zinpl001z3a02 #"TRENDe group-sorted NTTA 10.59.31.11 etrpl001z1a01 # "TRENDe 10.59.31.12 etrpl001z1a02 # "TRENDe 10.59.31.13 etrpl001z1a03 # "TRENDe group-sorted NTTA 10.59.31.14 etrpl001z1a04 # "TRENDe 10.59.31.31 etrvl201a1001 # "TRENDe 10.59.31.32 etrvl201a1002 # "TRENDe group-sorted NTTA 10.59.31.33 etrvl201a1003 # "TRENDe 10.59.31.150 etrvl201a1004 # "TRENDe 10.59.31.151 etrvl201a1005 # "TRENDe
和:
$ cat t4 line 1 of t4 line 2 of t4
我們命令的輸出是:
$ awk -v n=2 'FNR==NR{t=t"\n"$0;next} /^group-sorted NTTA$/ && n==++cnt {x=NR+3} NR==x{print substr(t,2)} 1' t4 H0 blah, blah group-sorted ZBTS 10.48.37.11 zinpl001z3a01 #"TRENDe 10.48.37.12 zinpl001z3a02 #"TRENDe group-sorted NTTA 10.59.31.11 etrpl001z1a01 # "TRENDe 10.59.31.12 etrpl001z1a02 # "TRENDe 10.59.31.13 etrpl001z1a03 # "TRENDe group-sorted NTTA 10.59.31.14 etrpl001z1a04 # "TRENDe line 1 of t4 line 2 of t4 10.59.31.31 etrvl201a1001 # "TRENDe 10.59.31.32 etrvl201a1002 # "TRENDe group-sorted NTTA 10.59.31.33 etrvl201a1003 # "TRENDe 10.59.31.150 etrvl201a1004 # "TRENDe 10.59.31.151 etrvl201a1005 # "TRENDe