在shell脚本中调用Awk

时间:2012-07-11 20:35:27

标签: shell awk

如果直接在终端上运行,我有这个命令可以正确执行。

awk '/word/ {print NR}' file.txt | head -n 1

目的是找到单词'word'首次出现在file.txt中的行的行号。

但是当我把它放在一个脚本文件中时,似乎无法正常工作。

#! /bin/sh

if [ $# -ne 2 ]
then
        echo "Usage: $0 <word> <filename>"
        exit 1
fi

awk '/$1/ {print NR}' $2 | head -n 1

那我做错了什么?

谢谢,

4 个答案:

答案 0 :(得分:7)

用双引号替换单引号,以便shell评估$1

awk "/$1/ {print NR}" $2 | head -n 1

答案 1 :(得分:6)

在shell中,单引号阻止参数替换;所以,如果您的脚本被调用如下:

script.sh word

然后你希望运行这个AWK程序:

/word/ {print NR}

但你实际正在运行这个:

/$1/ {print NR}

并且不用说,AWK不知道$1应该是什么。

要解决此问题,请将单引号更改为双引号:

awk "/$1/ {print NR}" $2 | head -n 1

以便shell将word替换为$1

答案 2 :(得分:6)

您应该使用AWK的变量传递功能:

awk -v patt="$1" '$0 ~ patt {print NR; exit}' "$2"

exit不需要head -1

答案 3 :(得分:2)

你也可以将值作为变量传递给awk:

awk -v varA=$1 '{if(match($0,varA)>0){print NR;}}' $2 | head -n 1

似乎比上面更麻烦,但说明了通过变量。