2013-06-30 74 views
2

我正在嘗試編寫一個腳本,在這個腳本中,我將一個shell變量傳遞給一個awk命令,但是當我運行它時什麼也沒有發生,我試圖只運行那一行在shell中,我發現沒有像我期望的那樣發生可變擴展。下面的代碼:如何在awk命令中插入shell變量

1 #!/bin/bash 
    2 
    3 # Created By Rafael Adel 
    4 
    5 # This script is to start dwm with customizations needed 
    6 
    7 
    8 while true;do 
    9   datestr=`date +"%r %d/%m/%Y"` 
10   batterystr=`acpi | grep -oP "([a-zA-Z]*), ([0-9]*)%"` 
11   batterystate=`echo $batterystr | grep -oP "[a-zA-Z]*"` 
12   batterypercent=`echo $batterystr | grep -oP "[0-9]*"` 
13 
14   for nic in `ls /sys/class/net` 
15   do 
16     if [ -e "/sys/class/net/${nic}/operstate" ] 
17     then 
18       NicUp=`cat /sys/class/net/${nic}/operstate` 
19       if [ "$NicUp" == "up" ] 
20       then 
21         netstr=`ifstat | awk -v interface=${nic} '$1 ~ /interface/ {printf("D: %2.1fKiB, U: %2.1fKiB",$6/1000, $8/1000)}'` 
22         break 
23       fi 
24     fi 
25   done 
26 
27 
28   finalstr="$netstr | $batterystr | $datestr" 
29 
30   xsetroot -name "$finalstr" 
31   sleep 1 
32 done & 
33 
34 xbindkeys -f /etc/xbindkeysrc 
35 
36 numlockx on 
37 
38 exec dwm 

這條線:

netstr=`ifstat | awk -v interface=${nic} '$1 ~ /interface/ {printf("D: %2.1fKiB, U: %2.1fKiB",$6/1000, $8/1000)}'` 

是什麼原因導致netstr變量未達到所有分配。那是因爲interface不是我換成${nic}

那麼你能告訴我這裏有什麼問題嗎?謝謝。

回答

2

如果你想/grep/與您的變量,你有2種選擇:

interface=eth0 
awk "/$interface/{print}" 

awk -v interface=eth0 '$0 ~ interface{print}' 

http://www.gnu.org/software/gawk/manual/gawk.html#Using-Shell-Variables

+0

嗯,但到底是什麼'/ /'怎麼辦? –

+0

//意思是grep從輸入(又名匹配) –

+1

確切地說,//在awk中意味着只處理與它們之間包含的模式匹配的行,如條件,即只有符合表達式的行被認爲是有效的才能被處理通過awk程序。老實說,現在我不記得了,如果awk變量可以用作模式(或者如果是這樣的話),而且我碰巧太累了不能玩它,但是你可以試試$(...)而不是' ',或者表達式封閉的技巧(你可以使用任何字符來代替//定義表達式的開始和結束,比如%..%或者其他任何方法。最後一種方法是用awk程序單獨使用外部文件。 –

0

它就像我以爲,awk替代變量正確,但是在//之間,裏面的正則表達式(或者awk正則表達式,這取決於一些awk參數AFAIR),awk變量不能被用於替代

我沒有問題,具有可變grepping的awk計劃內(以一個簡單的正則表達式的情況下):

sawk1='repo\s+module2' 
sawk2='@project2\s+=\s+module2$' 
awk "/${sawk1}/,/${sawk2}/"'{print}' aFile 

(這裏xxxyyy
之間的/xxx/,/yyy/顯示一切(注意雙引號"/${sawk1}/,/${sawk2}/",其次是單引號'{print}'

這一切正常,和來自「awk: Using Shell Variables in Programs」:

的常用方法是使用shell引用替代變量的值到腳本里面的程序。
例如,請考慮下面的程序:

printf "Enter search pattern: " 
read pattern 
awk "/$pattern/ "'{ nmatches++ } 
    END { print nmatches, "found" }' /path/to/data 

awk程序由引述兩段文本被串聯在一起形成程序。

  • 第一部分是雙引號,這允許引號內的圖案殼變量的替換。
  • 第二部分是單引號。

它確實增加了雖然警告:通過引用作品

變量替換,但有可能是混亂。
它需要的shell的報價規則(見Quoting)有很好的理解,而且往往難以讀取程序時,正確地匹配了報價。