ポート番号を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-ip
4番目のフィールド(現在のポート番号)が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
出力ファイル名を生成しn
、awk
各入力/出力ペアに上記の手順を適用します。ポート番号はファイル内でローカルに再番号付けされます。つまり、各ファイルはポート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 0
awkを1回実行するだけです(現在のグローバル値がわかるように)。あるいは、NR==1{p=1000}
より単純なロジックを使用することもできます。オプション1:
awk 'FNR==1{sub("input", "output", FILENAME)} $1=="local-ip"{$4=1000+p++} {print >> FILENAME}' input*.txt