同じ行を複数の値に置き換えるために「sed ...」と同じことを行う簡単な方法はありますか?

同じ行を複数の値に置き換えるために「sed ...」と同じことを行う簡単な方法はありますか?

ファイルがありますが、その内容の一部を変更したいと思います。変わりやすいシェルスクリプトのデータ。

-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の置き換えで入力行のコピーを印刷します。 。

おすすめ記事