在shell脚本调用awk中(Calling Awk in a shell script)

2019-06-26 05:30发布

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

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

所以我做了什么错?

谢谢,

Answer 1:

使替换单引号用双引号$1是由shell评价:

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


Answer 2:

在壳,单引号防止参数取代; 所以如果你的脚本调用是这样的:

script.sh word

那么你运行此程序AWK:

/word/ {print NR}

但你的确在这一个:

/$1/ {print NR}

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

为了解决这个问题,改变你的单引号双引号:

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

从而使外壳将取代word$1



Answer 3:

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

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

exit使head -1不必要的。



Answer 4:

你也可以通过该值作为一个变量AWK:

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

似乎比上述更麻烦,但示出了通过VARS。



文章来源: Calling Awk in a shell script
标签: shell awk