2015-12-13 35 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."