ポート0の0を1000に置き換え、次の行に+1を追加します。

ポート0の0を1000に置き換え、次の行に+1を追加します。

ポート番号を1000から増やしたいです。このコマンドを使用してポートに番号を割り当てるときに、すべてのポートを0に設定する方法を知っています。

sed 's/port [0-9]\{1,5\}/port 0/g'

しかし、逆にする方法がわかりません。複数のスクリプトファイルで2k行を変更する必要があります。

  • これは私が持っているものです。
    local-ip 155.165.170.10 port 0 remote-ip 155.16.241.11 port 3869 
    local-ip 155.165.170.10 port 0 remote-ip 155.16.241.11 port 3869
    local-ip 155.165.170.10 port 0 remote-ip 155.16.241.11 port 3869
    local-ip 155.165.170.10 port 0 remote-ip 155.16.241.11 port 3869
    
  • 希望の出力は次のとおりです。
    local-ip 155.165.170.10 port 1000 remote-ip 155.16.241.11 port 3869
    local-ip 155.165.170.10 port 1001 remote-ip 155.16.241.11 port 3869
    local-ip 155.165.170.10 port 1002 remote-ip 155.16.241.11 port 3869
    local-ip 155.165.170.10 port 1003 remote-ip 155.16.241.11 port 3869
    

答え1

次の場所でこれを実行できる必要がありますawk

awk 'BEGIN{p=1000} $1=="local-ip"{$4=p++} 1' input.cfg > output.cfg

これにより、空白行またはコメント行の小さな安全対策で始まるすべての行が解析され、local-ip4番目のフィールド(現在のポート番号)が1000から始まり、連続して増加する数字に置き換えられます。

修正する

コメントに複数のファイルに対してこれを行うことを指定したので、次のシェルループを使用できます。

for f in input{1..16}.cfg; do n=${f/input/output}; awk 'BEGIN{p=1000} $1=="local-ip"{$4=p++} 1' "$f" > "$n"; done

これは、一致するすべてのファイルを繰り返しinput{1..16}.cfg、置換inputしてoutput出力ファイル名を生成しnawk各入力/出力ペアに上記の手順を適用します。ポート番号はファイル内でローカルに再番号付けされます。つまり、各ファイルはポート1000で再起動されます。

答え2

awkを使うのはとても簡単です。たとえば、

awk 'BEGIN { portno=1000 }
           { print $1, $2, $3, portno++, $5, $6, $7, $8 }' inputfile

これは、すべての行が例に示すようにフォーマットされていると仮定します。

答え3

k=1000
m=$(echo "$k\\";printf '%s' {0..9})

sed -En "
  1{x;s/.*/$m/;x;}

  /local-ip/!{p;d;}
  G
  s/(port )0( .*)\n(.*)\n.*/\1\3\2/
  p;g;trst;:rst

  # port+1
  s/([0-8])(\n.*\1(.))/\3\2/;h;t
  s/(9+)\n/_&/
  :a;s/(_9*)9(0*\n)/\10\2/;ta
  s/^_/0&/
  s/(.)_(0+\n.*\1(.))/\3\2/
  h
"  file

出力:

local-ip 155.165.170.10 port 1000 remote-ip 155.16.241.11 port 3869 
local-ip 155.165.170.10 port 1001 remote-ip 155.16.241.11 port 3869
local-ip 155.165.170.10 port 1002 remote-ip 155.16.241.11 port 3869
local-ip 155.165.170.10 port 1003 remote-ip 155.16.241.11 port 3869

1ずつ増やすには、2つに注意する必要があります。 lsdは9以外の数値ですか、それとも連続した9ですか?前者の場合は、lsdを次に高い数字に置き換えます。後者の場合は、すべてのlsd 9を0に変更し、隣人を次に高い数字に置き換えます。次に、次の繰り返しのために再保存します。

答え4

デフォルトでは2つのオプションがあります。

オプション1:各入力ファイルに対してawkを実行します。

# Loop over the input file numbers and run awk for each
for ((i=0; i<10; i++)); do awk '$1=="local-ip"{$4=1000+p++;}1' input$i.txt > output$i.txt; done

オプション2: awk を使用した直接出力ファイルの生成

awk 'FNR==1{p=1000; sub("input", "output", FILENAME)} $1=="local-ip"{$4=p++} {print >> FILENAME}' input*.txt

各入力ファイルに対して再起動したくない場合は、port 0awkを1回実行するだけです(現在のグローバル値がわかるように)。あるいは、NR==1{p=1000}より単純なロジックを使用することもできます。オプション1:

awk 'FNR==1{sub("input", "output", FILENAME)} $1=="local-ip"{$4=1000+p++} {print >> FILENAME}' input*.txt

関連情報