2016-07-23 58 views
1

我有一種情況,我試圖使用awk來查找模式並在找到模式後添加10行內容。我試着用下面的工作,但在輸入不起作用如何使用awk在模式後添加多行

內容iptable.txt文件:

-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT 
-A INPUT -j REJECT --reject-with icmp-host-prohibited 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited 

iptables.txt的輸出應該像執行

-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT 
-A INPUT -j REJECT --reject-with icmp-host-prohibited 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited 

awk的功能:

awk '/--dport 22 -j ACCEPT/{print $0 RS 
"-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT" 
"-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT" 
"-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT" 
} 1' > tmp && mv tmp /home/user/iptables.txt 

簡而言之,我試圖完成的是當我執行awk命令時,它將肩膀d追加與線DPORT 20,21和23

回答

1

由於重複性質的輸入,你可以這樣做:

awk '/--dport 22 -j ACCEPT/ {n=$12; for(i=0; i<=10; i++) {$12=n++; print} next}1' input 

另一方面,如果你的輸入不是那麼重複的話,sed更適合這個。如果您要添加的10線命名爲new文件中,只是做:

sed '/--dport 22 -j ACCEPT/rnew' input 

命令r原因的sed的模式匹配的行之後在指定的文件中讀取。如果由於某種原因,你不希望從一個不同的文件中讀入行,你可以使用:

sed '/--dport 22 -j ACCEPT/a\ 
first line of new content\ 
2nd line of new content 
' input 
+0

感謝威廉 - 我嘗試awk之前試過sed。 sed抱怨' - '(破折號),當我試圖逃避\,然後它抱怨'\'。 – AmigoSe

+0

@GanSe你能準確地展示你試圖對sed抱怨嗎?和哪個版本的sed。 –

2

的iptable.txt文件這可能是你在找什麼:

$ awk ' 
{ print } 
/--dport 22 -j ACCEPT/ { print \ 
"-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT" ORS\ 
"-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT" ORS\ 
"-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT" 
} 
' file 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT 
-A INPUT -j REJECT --reject-with icmp-host-prohibited 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited 

或:

$ awk -v block='-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT' ' 
{ print } 
/--dport 22 -j ACCEPT/ { print block } 
' file 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT 
-A INPUT -j REJECT --reject-with icmp-host-prohibited 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited 
+0

很抱歉的困惑 - 尋找不應該是一個命令(anubhava是這麼認爲的,所以他編輯它作爲命令)!我的意思是找到一個匹配-dport 22的模式,並在其下面添加其餘的行塊 - 它應該使用行塊對iptables.txt進行永久性編輯。 – AmigoSe

+0

謝謝埃德 - 欣賞它,它只打印在命令外殼上,但它不會在實際的iptable.txt文件中追加這三行。我需要追加到該特定文件的原因是即時計劃運行一個shell腳本來更新其他不同的設置,並更新這個特定的文件。它甚至可以在shell腳本上使用awk函數嗎? – AmigoSe

+0

@GanSe - 您的術語令人困惑。我上面發佈的不是awk函數,它是一個awk腳本。當你執行它時,它是一個在shell腳本中使用的awk腳本。使用任何UNIX命令「cmd」,只要執行'cmd file> tmp && mv tmp file'就可以回寫原始文件。使用GNU awk 4.0和更新版本,您可以改爲保存鍵入幾個字符,執行'awk -i inplace'腳本文件,並使用GNU sed執行'sed -i'腳本'文件'。希望這是有道理的,如果不願意提出更多問題。 –