将awk-for循环变量的值赋给bash变量

时间:2018-05-17 14:31:41

标签: bash awk

tempfile中的内容

123 sam moore IT_Team
235 Rob Xavir Management

我要做的是从用户那里获取输入并在tempfile中搜索它,搜索输出应该给出列号

我的代码

#!/bin/bash
set -x;
read -p "Enter :" sword6;
awk 'BEGIN{IGNORECASE = 1 }
{
for(i=1;i<=NF;i++) {
    if( $i ~ "'$sword6'$" )
            print i;
    }
} ' /root/scripts/pscripts/tempprint.txt;

这正是列号

输出

Enter : sam
2

我需要的是i变量的值应该分配给bash变量,以便我可以根据脚本中的需要调用。

任何帮助都受到高度赞赏。

我搜索找到任何现有的答案,但无法找到任何答案。如果有任何让我知道的话。

4 个答案:

答案 0 :(得分:1)

  • 首先,您应该以这种方式将shell变量传递给awk(例如sword6

    awk -v word="$sword6" '{.. if($i ~ word)...}`...
    
  • 通过其他命令的输出分配shell变量:

    shellVar=$(awk '......')
    

然后,您可以在脚本中继续使用$shellVar

关于你的awk代码:

  • 如果用户输入了一些特殊字符,您的脚本可能会失败,例如.*
  • 如果一列多次匹配userinput,则可能有重复的输出。
  • 如果您的文件有多列匹配用户输入,您可能需要处理它。

答案 1 :(得分:1)

您只需要捕获awk的输出。顺便说一句,我会将sword6作为awk变量传递,而不是通过字符串插值注入它。

i=$(awk -v w="$sword6" '
        BEGIN { IGNORECASE = 1 }
        { for (i=1;i<=NF;i++) {
            if ($i ~ w"$") { print i; }
          }
        }' /root/scripts/pscipts/tempprint.txt)

答案 2 :(得分:1)

以下脚本也可以帮助你。

cat script.ksh
echo "Please enter the user name:"
read var
awk -v val="$var" '{for(i=1;i<=NF;i++){if(tolower($i)==tolower(val)){print i,$i}}}'   Input_file

答案 3 :(得分:0)

如果tempprint.txt很大

awk -v w="$word6" '
BEGIN { IGNORECASE = 1 }
"$0 ~ \\<w\\>" {
    for(i=1;i<=NF;i++)
        if($i==w)print i
}' tempprint.txt