我有这个命令,如果直接在终端上运行,它会正确执行。
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。