2016-07-23 6 views
1

私はawkを使ってパターンを見つけ、パターンが見つかった直後に10行のコンテンツを追加するという状況があります。 iptables.txtのawkを使用してパターンの後に複数の行を追加する方法

-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 

出力が実行

-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の機能のようになります:

を私は以下で動作するようにしようとしましたが、ファイルiptable.txt入力に

内容は動作しません。

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ラインとiptable.txtファイルを追加。これは、あなたが探しているものはおそらくである20、21および23

答えて

1

あなたの入力はそう繰り返しでない場合、一方、を

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

:あなたの入力を、あなたのような何かを行うことができますがこれに適しています。追加する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

をDPORT:

$ 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

ありがとうございましたEd - ありがとう、それはコマンドシェルでのみ表示されますが、実際のiptable.txtファイルにこれらの3行は追加されません。その特定のファイルに追加する必要があるのは、シェルスクリプトを実行して別の設定を更新し、この特定のファイルを更新する予定があるからです。シェルスクリプトでawk関数を使用することも可能ですか? – AmigoSe

+0

@GanSe - 用語が混乱しています。上に掲げたのはawk関数ではなく、awkスクリプトです。あなたがそれを実行すると、awkスクリプトはシェルスクリプトで使用されています。どのUNIXコマンドでも、 'cmd'は元のファイルに書き戻すために' cmd file> tmp && mv tmp file'を実行します。 GNU awk 4.0以降では、2文字の入力を省くために 'awk -i inplace 'スクリプト' file'を実行し、GNU sedでは' sed -i 'スクリプト' file'を実行できます。希望があれば意味があります。 –

関連する問題