如果直接在终端上运行,我有这个命令可以正确执行。
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
那我做错了什么?
谢谢,
答案 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
似乎比上面更麻烦,但说明了通过变量。