我有这样的命令,如果直接在终端上运行的正确执行。
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
所以我做了什么错?
谢谢,
使替换单引号用双引号$1
是由shell评价:
awk "/$1/ {print NR}" $2 | head -n 1
在壳,单引号防止参数取代; 所以如果你的脚本调用是这样的:
script.sh word
那么你想运行此程序AWK:
/word/ {print NR}
但你的确在这一个:
/$1/ {print NR}
不用说,AWK不知道什么$1
应该是。
为了解决这个问题,改变你的单引号双引号:
awk "/$1/ {print NR}" $2 | head -n 1
从而使外壳将取代word
为$1
。
您应该使用AWK的变量传递功能:
awk -v patt="$1" '$0 ~ patt {print NR; exit}' "$2"
该exit
使head -1
不必要的。
你也可以通过该值作为一个变量AWK:
awk -v varA=$1 '{if(match($0,varA)>0){print NR;}}' $2 | head -n 1
似乎比上述更麻烦,但示出了通过VARS。