2015-06-29 70 views
0

我想從輸出打印包含IP地址的行(可以不存在):ifconfig $1AWK變量保留管道輸出後的值到它從系統()

任何內容都不應被打印(output應空)如果命令沒有返回任何東西。

下面是我使用的命令:

echo -e "wlan2 \n eth3" | awk '{ 
          command = "ifconfig " $1 " | grep \"inet addr\" "; 

          command | getline output; 
          print $1 output; 
           }' 

輸出:

wlan2   inet addr:192.168.0.104 Bcast:192.168.0.255 Mask:255.255.255.0 
eth3   inet addr:192.168.0.104 Bcast:192.168.0.255 Mask:255.255.255.0 

在這種情況下,wlan2都有一個IP,eth3有一個IP地址。但是相同的行則打印爲eth3

問題:如何找出命令的輸出是什麼?或者確保變量output在後續迭代中不保留其先前的值?

回答

3

假設你有一個真正的理由awk來做到這一點(目前,它看起來像你可以做到這一點使用shell),您需要做一些改動:

awk '{ command = "ifconfig " $1 " | grep \"inet addr\" " } 
    command | getline output > 0 { print $1, output } 
    { close(command) }' 

通過檢查返回值getline,我們只能在成功時打印該行。使用close也很重要,以便管道不會打開,因爲這會導致較大輸入或重複線條出現問題。

好像管道到AWK內grep是有點反模式的,所以你可能會更好做在AWK本身匹配模式:

awk '{ command = "ifconfig " $1 
    while (command | getline output > 0) if (output ~ /inet addr/) print $1, output } 
    { close(command) }' 

一個while循環用於讀取所有的輸出爲ifconfig。如果找到匹配項,則會打印該行。