#!/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个鲍勃
2弗雷德
等等...
我只想要用户名而不是相应的号码,这就是我尝试使用的原因:print substr($0, RLENGTH + 2)
不幸的是,awk的输出不会附加到$ USERNAME。
我曾尝试grep
但未能达到答案。然后我阅读了awk
并且到了这里,但又被卡住了。使用grep
或awk
对我来说都是一样的。
答案 0 :(得分:4)
在类似POSIX的shell中单个引用的字符串总是 literals - 不执行其内容的插值。因此,代码中的$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."