ファイルがありますが、その内容の一部を変更したいと思います。変わりやすいシェルスクリプトのデータ。
-A INPUT -i lo -s @LOCAL_IP@ -j ACCEPT
ここでは@LOCAL_IP@をIPアドレスに置き換えたいと思います。以下を使用します。
... | sed -e 's/@LOCAL_IP@/192.168.1.1/' | ...
おそらく、シェルスクリプトの変数に192.168.1.1があります。しかし、これは単なる基本的なアイデアを提供することです。
今、次のような別のルールがあります。
-A INPUT -i @PUBLIC_INTERFACE@ -p tcp -m tcp --dport 22
-d @PUBLIC_IP@ -s @ADMIN_IPS@ --syn -j ACCEPT
(これは長い行であり、読みやすくするためにここでは壊れています。)
実際の入力ファイルには、入力ファイルの内容に似た行がたくさん含まれていますが、ほとんどはそうではありません@ADMIN_IPS@
。たとえば、次のようになります。
-A INPUT -i @PUBLIC_INTERFACE@ -p tcp -m tcp --dport 80 -d @PUBLIC_IP@ --syn -j ACCEPT
-A INPUT -i @PUBLIC_INTERFACE@ -p tcp -m tcp --dport 22 -d @PUBLIC_IP@ -s @ADMIN_IPS@ --syn -j ACCEPT
-A INPUT -i @PUBLIC_INTERFACE@ -p tcp -m tcp --dport 443 -d @PUBLIC_IP@ --syn -j ACCEPT
この場合、@PUBLIC_INTERFACE@と@PUBLIC_IP@を簡単に置き換えることができます。これは前の行とまったく同じです。ただし、@ADMIN_IPS@は2〜3個のIPアドレスのリストです。結果は次のようになります。
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -d 8.8.8.8 --syn -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -d 8.8.8.8 -s 8.8.10.1 --syn -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -d 8.8.8.8 -s 8.8.10.2 --syn -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -d 8.8.8.8 -s 8.8.10.3 --syn -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -d 8.8.8.8 --syn -j ACCEPT
Linuxなどのツールを使用して1行を複数行に変換する比較的簡単な方法はありますかsed
? (Ubuntu 16.04)この場合、これら3つのADMIN_IPS
アドレスは次のように変数で定義されます。
ADMIN_IPS=8.8.10.1,8.8.10.2,8.8.10.3
スペースで区切ったり、配列にすることもできます。
ベストアンサー1
これは醜いawkソリューションです。他の人はこれを行うより賢い方法を持つことができます。
awk -v pi=1.2.3.4 -v pint=eth0 -v pip=8.8.8 -vaips="8.8.10.1 8.8.10.2 8.8.10.3" \
'BEGIN{
split(aips, array)
}
{
gsub(/@PUBLIC_INTERFACE@/, pint);
gsub(/@PUBLIC_IP@/, pi);
if (/@ADMIN_IPS@/) {
copy=$0
for (i in array) {
gsub(/@ADMIN_IPS@/, array[i], copy)
print copy
copy=$0
}
} else {
print;
}
}' input
これは変数をawkに渡します(管理IPのスペース区切りを使用)。 awkは、入力を読み取る前に着信「配列」を名前付きの実際のawk配列に分割しますarray
。各入力行に対して、awk はさまざまなシングルトン変数をグローバルに検索して置き換えます。その後、@ADMIN_IPS@が行にある場合は、管理IPを繰り返し、対応する管理IPの置き換えで入力行のコピーを印刷します。 。