利用awk中的变量然后将输出输入另一个变量

时间:2015-12-13 01:42:50

标签: bash shell awk

#!/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并且到了这里,但又被卡住了。使用grepawk对我来说都是一样的。

1 个答案:

答案 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."