在shell脚本中调用Awk

use*_*893 5 shell awk

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

awk '/word/ {print NR}' file.txt | head -n 1
Run Code Online (Sandbox Code Playgroud)

目的是找到'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
Run Code Online (Sandbox Code Playgroud)

那我做错了什么?

谢谢,

Lar*_*off 7

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

awk "/$1/ {print NR}" $2 | head -n 1
Run Code Online (Sandbox Code Playgroud)


Pau*_*ce. 7

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

awk -v patt="$1" '$0 ~ patt {print NR; exit}' "$2"
Run Code Online (Sandbox Code Playgroud)

exit使得head -1不必要.


rua*_*akh 6

在shell中,单引号阻止参数替换; 所以,如果您的脚本被调用如下:

script.sh word
Run Code Online (Sandbox Code Playgroud)

那么你运行这个AWK程序:

/word/ {print NR}
Run Code Online (Sandbox Code Playgroud)

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

/$1/ {print NR}
Run Code Online (Sandbox Code Playgroud)

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

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

awk "/$1/ {print NR}" $2 | head -n 1
Run Code Online (Sandbox Code Playgroud)

从而使外壳将取代word$1.