2012-05-22 40 views
0

我有內容的文件f1.txt:使用GAWK解析:如何留住一些變量的值以外呆子

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 '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中的自動變種嗎?我如何解析這個以保留node1和node2值?

任何幫助將不勝感激。提前致謝。

回答

2

這些值「保留」在gawk腳本中,但由於您不打印它們或任何內容,因此存在問題。 gawk腳本中的變量完全獨立於shell中的任何變量。當您運行gawk時,它是一個單獨的過程。您可以將shell變量值傳遞給gawk;您無法通過直接分配將gawk變量值返回到shell。

有在gawk一個split()功能,可用於在gawk腳本中的每一個node1node2分裂,它把分田到1索引的數組,但你有什麼打算的價值觀做之後?你幾乎不得不打印出來:

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

現在你有一個殼陣列:

echo ${array[*]} 

從那裏,你的shell腳本願意,你可以這樣做:

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

注意:這個答案明確表示爲bashgawk;其他shell或其他變體awk可能需要不同的答案。

2

上的文件運行GAWK兩次,解析出節點1和節點:

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。

+2

考慮:'節點1 = 192.168.100.253:34611',您可以用'回聲$ {節點1%:*}'來獲得IP地址 '192.168.100.253'和'回聲$ {節點1#* :}'得到端口號 '34611'。 –

+2

不需要運行'gawk'兩次; '節點=($(gawk'NR == 1 {print $ 1,$ 2}'f1.txt))'Then'node1 = $ {nodes [0]}'和'node2 = $ {nodes [1]}''。 – chepner

+0

對,@chepner!我沒有想過shell數組。 – mpe

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