5

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

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

那么我做错了什么?

谢谢,

4

4 回答 4

7

用双引号替换单引号,以便$1由 shell 评估:

awk "/$1/ {print NR}" $2 | head -n 1
于 2012-07-11T20:38:29.077 回答
6

在 shell 中,单引号防止参数替换;所以如果你的脚本是这样调用的:

script.sh word

那么你运行这个 AWK 程序:

/word/ {print NR}

但你实际上正在运行这个:

/$1/ {print NR}

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

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

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

这样外壳就可以代替word.$1

于 2012-07-11T20:38:37.020 回答
6

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

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

使不必要exit的。head -1

于 2012-07-11T20:50:06.177 回答
2

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

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

似乎比上面更麻烦,但说明了传递变量。

于 2012-07-11T21:00:31.413 回答