0

私は次のような内容のファイル f1.txt を持っています:

192.168.100.253:34611  69.171.228.46:80   5   2426   7    901      12      3327
192.168.100.253:34610  69.171.228.46:80   5   1068   6    626      11      1694
192.168.100.253:46808  69.171.224.24:80   4    470   5    563       9      1033

次に、次のように gawk ステートメントを使用しています。

gawk 'NR==1 {node1 = $1;node2 = $2}' f1.txt
echo "node" $node1

node1 = 192.168.100.253:34611 および node2 = 69.171.228.46:80 と予想しています。そして、FS 値が : の gawk ステートメントをもう 1 つ使用して、後でスクリプトで使用できる ip add と port no をさらに取得したいと考えています。ただし、node1 と node2 自体の値は保存されません。これらは C の自動変数のようなものですか? node1 と node2 の値を保持するためにこれを解析するにはどうすればよいですか?

どんな助けでも大歓迎です。前もって感謝します。

4

3 に答える 3

2

値はgawkスクリプトで「保持」されますが、値などを出力しないため、問題が発生します。スクリプト内のgawk変数は、シェル内の変数から完全に独立しています。を実行するgawkと、それは別のプロセスになります。シェル変数値をgawk;に渡すことができます。gawk直接割り当てによって変数値をシェルに戻すことはできません。

スクリプト内のそれぞれを分割するために使用できるsplit()関数があり、分割されたフィールドを1からインデックス付けされた配列に配置しますが、その後の値をどのように処理しますか?あなたはそれらを印刷する義務がかなりあります:gawknode1node2gawk

array=($(gawk 'NR == 1 {split($1, node1, ":"); split($2, node2, ":");
                        print node1[1], node1[2], node2[1], node2[2]}' f1.txt))

これでシェル配列ができました。

echo ${array[*]}

そこから、シェルスクリプトで好きなように実行できます。

node1_ipv4=${array[0]}
node1_port=${array[1]}
node2_ipv4=${array[2]}
node2_port=${array[3]}

注意:この答えは明示的にbashプラス用gawkです。他のシェルまたは他のバリアントは、awkおそらく異なる答えを必要とします。

于 2012-05-22T10:54:14.077 に答える
2
# One call to gawk to put the two desired nodes into an array
nodes=( $(gawk 'NR==1 {print $1, $2}' f1.txt) )
# nodes=( 192.168.100.253:34611 69.171.228.46:80 )

# Use % to remove the :port suffix from each array element
addresses=( ${nodes[@]%:*} )
# addresses=( 192.168.100.253 69.171.228.46 )

# Use # to remove the address: prefix from each array element
ports=( ${nodes[@]#*:} )
# ports=( 34611 80 )

# Array subscripting
node1_addr=${addresses[0]};   # 192.168.100.253
node2_port=${ports[1]};       # 80
于 2012-05-22T13:58:57.967 に答える
2

ファイルに対して gawk を 2 回実行し、node1 と node2 を解析します。

node1=$(gawk 'NR==1 {print $1}' f1.txt)
node2=$(gawk 'NR==1 {print $2}' f1.txt)

次に、IP とポートをこじ開けます。

echo $node1 | gawk -F ':' '{printf("ip: %s port: %d\n", $1, $2)}'

node2 についても同様です。

于 2012-05-22T10:58:24.087 に答える