在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

那么我做错了什么?

谢谢,

将单引号替换为双引号,以便由shell评估$1

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

在shell中,单引号防止参数替换;因此,如果您的脚本被这样调用:

script.sh word

那么您希望运行此AWK程序:

/word/ {print NR}

但你实际上运行的是这个:

/$1/ {print NR}

不用说,AWK根本不知道$1应该是什么

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

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

使得外壳将用CCD_ 5代替CCD_。

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

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

CCD_ 7使得CCD_。

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

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

看起来比上面的更麻烦,但说明了传递vars。

最新更新