2013-03-19 54 views
0

我有一個文件列出了我們小型網絡上所有機器的名稱和位置,以及它們是否具有不間斷電源(UPS)。該文件具有使用命令行中的一個awk的單行格式簡單的awk腳本來查找帶有UPS的機器

alpha % in office 1 % 
beta % in office 2 %UPS 
gamma % in office 1 % 
delta % in reception %UPS 

我可以很容易地找到機器的名稱和位置 awk -F '%' '/UPS/ {print $1, $2}' $HOME/network_file其中$ HOME是一個環境變量。

但是,我想寫一個awk腳本來添加一些額外的功能。我曾嘗試以下

#!/usr/bin/awk -f 
BEGIN { 
FS="%"; 
OFS=" "; 
print "The following computers in the department have UPS \n"; 
print "Computer\tLocation"; 
} 

{ 
if (~/UPS/) {print $1,$2;} $HOME/network_file 
} 

這不工作,我得到了一些錯誤信息,包括 BEGIN:找不到命令 行37:打印:找不到命令 38行:打印:找不到命令 線39:近意外的標記`}」

所需的輸出

The following computers in the department have UPS 
Computer Location 
beta in office 2 
delta in reception 

回答

1

擺脫認領的,只是寫上你想要的文件AWK調用一個shell腳本:

/usr/bin/awk -F'%' ' 
BEGIN { 
    print "The following computers in the department have UPS \n" 
    print "Computer\tLocation" 
} 
/UPS/ {print $1,$2} 
' "$HOME/network_file" 

如果你在Solaris上,請注意/ usr/bin/awk是舊的,你一定不要使用破解的awk - 用/ usr/xpg4/bin/awk或nawk代替。

請注意,我擺脫了所有的空聲明(虛假拖尾分號)。

1

我想你想

語法錯誤
#!/usr/bin/awk -f 
# script follows 
BEGIN .... 

in one executable file。該文件中的第一行(#!...)指導的Unix使用指定的可執行文件(/usr/bin/awk)運行該文件的其餘部分(您awk腳本)

+0

'-f'實際上是需要的; shebang使內核通過腳本文件作爲下一個參數。如果沒有'-f',Awk需要腳本的實際文本作爲命令行參數。 – 2013-03-19 11:18:41

+0

啊。謝謝。將修改 – 2013-03-19 11:33:00

+0

@BrianAgnew不能相信我省略了shebang。我現在遇到的問題來自if(〜/ UPS /){print $ 1,$ 2;} $ HOME/network_file,它在tilda – moadeep 2013-03-19 11:35:11

2

腳本應該與

#!/usr/bin/awk -f 

開始(這是一個。shebang

+0

處給我一個語法錯誤我無法相信我省略了shebang。我現在遇到的問題來自'if(〜/ UPS /){print $ 1,$ 2;} $ HOME/network_file',它給了我一個語法錯誤tilda – moadeep 2013-03-19 11:33:19

+1

這就是'(/ UPS /)' ,沒有'〜',但是你有更大的問題,因爲你試圖使用shbang來執行一個awk腳本,但是包括文件名,這個文件名是將調用awk的SHELL腳本語法的一部分。我會發佈一個答案.... – 2013-03-19 11:50:48