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 语句,以进一步获取我稍后可以在脚本中使用的 ip add 和 port no。但是 node1 和 node2 本身的值不会被存储。这些像 C 中的自动 var 吗?我如何解析它以保留 node1 和 node2 值?

任何帮助将不胜感激。提前致谢。

4

3 回答 3

2

这些值被“保留”在gawk脚本中,但是由于您不打印它们或任何东西,所以您遇到了问题。脚本中的变量gawk完全独立于 shell 中的任何变量。当您运行时gawk,它是一个单独的进程。您可以将 shell 变量值传递给gawk; 您无法gawk通过直接赋值将变量值返回给 shell。

有一个split()函数gawk可用于拆分脚本中的每个字段,node1并将拆分字段放入索引为 1 的数组中,但之后您将如何处理这些值?你几乎有义务打印它们:node2gawk

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

现在你有一个 shell 数组:

echo ${array[*]}

从那里,你可以在 shell 脚本中做你想做的事:

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

注意:这个答案是明确的bashplus gawk; 其他外壳或其他变体awk可能需要不同的答案。

于 2012-05-22T10:54:14.077 回答
2

对文件运行 gawk 两次,解析出 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)}'

节点2也是如此。

于 2012-05-22T10:58:24.087 回答
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 回答