2012-04-18 44 views
2

我目前遇到awk使用shell變量的問題。這裏是我的問題, 當我運行以下命令:awk中的shell變量用法

的awk -F: '$ 1 == 「馬可」{打印$ 7}'/ etc/passwd文件

一切工作正常,很正常。但是,我希望能夠通過我的$ user shell變量而不是「marco」,所以我嘗試以下內容(在閱讀關於-v標誌後):

awk -F:-v awkvar = $ user '$ 1 =='$ awkvar「{print $ 7}」/ etc/passwd

而且它似乎不起作用。誰能幫我?

謝謝!

回答

3

在shell一側使用引號,並且不要使用$作爲awk變量。

awk -F: -v awkvar="$user" '$1==awkvar {print $7}' /etc/passwd 

awk$表示它是一個位置參數(即,場數),因此,因爲它是,它一直在尋找字段「馬可」,它降低到$0,整條生產線。所以它會找到只有一個字段的任何行。

+0

好的答案,我不知道字符串作爲字段名減少到0. – bonsaiviking 2012-04-18 17:54:39

+0

非常感謝!這工作:) – 2012-04-18 17:55:29

2

幾件事:

  1. 在AWK,可變取代而不$印記。 $表示「位置上的字段」,因此$awkvar表示「位置上的字段」值爲awkvar「。如果awkvar=marco,則$awkvar$"marco"相同,相當於$ 0。
  2. 與shell變量,你無法引用變量AWK,否則他們將被視爲字符串:

    sh$ awk -v awkvar=foo 'BEGIN{print "awkvar",awkvar}' 
    awkvar foo 
    sh$ 
    
  3. 包含用戶名的標準shell變量是$USER,不$user

所以在最後,你要的是這樣的:

awk -F: -v awkvar=$user '$1==awkvar {print $7}' /etc/passwd 

或者,使用getent

getent passwd $USER | awk -F: '{print $7}' 
+2

引用shell變量來防止空白(雖然你不希望用戶名)。這引出了另一點。Marco可能使用'$ user'來保存來自用戶輸入或其他來源的用戶名,而不是使用'$ USER'環境變量。這可以避免名稱衝突。如果數據可能來自「不可信」來源,則可能包含任何內容。 – 2012-04-18 21:30:00

0

這不是一個awk而是一個殼問題。

這個可以工作(如果在您的shell環境中設置了$user變量)。

awk -F: '$1=="'"$user"'" {print $7}' /etc/passwd 
+0

'-v awkvar = $ user'表示他正試圖設置和使用awk變量,所以它確實是一個awk問題,而不是一個shell。但是你的解決方案最終會產生正確的輸出,所以我決定解除我的失望。 – Kevin 2012-04-18 18:16:41

+0

你應該使用'-v'而不是使用嵌套引用。 – 2012-04-18 21:24:24