2015-12-13 169 views
3
#!/bin/bash 

cat /home/user/list 
read -p "enter a number: " LISTNUMBER 
USERNAME=$(awk '$LISTNUMBER { 
    match($0, $LISTNUMBER); print substr($0, RLENGTH + 2); }' /home/user/list) 

echo "you chose $USERNAME." 

這個腳本會使用awk來搜索有編號和用戶名的列表另一個文件: 1 BOB 2弗雷德 等... 我只想用戶名不是相應的數字,這就是爲什麼我嘗試使用:print substr($0, RLENGTH + 2)利用awk的一個變量,然後輸入輸出到另一個變量

不幸的是,awk的輸出不會附加到$ USERNAME。

我試圖爲此grep,但無法實現答案。然後我讀了awk併到了這裏,但我再次卡住了。使用grepawk對我來說都是一樣的。

+0

用awk -v變量...:HTTP://計算器。 com/questions/15786777/can-we-use-shell-variables-in-awk – Jayan

+1

我很抱歉,如果這是一個重新問。感謝您的鏈接。 – cole

+0

再次提出同樣的問題沒有任何錯誤.. :) – Jayan

回答

4

在POSIX般的炮彈-quoted字符串都不約而同文字 - 不執行其內容插值。因此,您的代碼中的$LISTNUMBER而不是擴展爲其值。

要將shell變量傳遞給Awk,請使用-v {awkVarName}="${shellVarName}"。另外,Awk通過運行空白(默認情況下)將輸入行自動分割成字段。 $1表示第一場,$2第二,...

如果我們將兩者的見解,您的情況,我們得到:

#!/bin/bash 

read -p "enter a number: " LISTNUMBER 
USERNAME=$(awk -v LISTNUMBER="$LISTNUMBER" ' 
    $1 == LISTNUMBER { print $2 }' /home/user/list) 

echo "you chose $USERNAME."