我有这个命令,如果直接在终端上运行,它可以正确执行.
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)
那我做错了什么?
谢谢,
用双引号替换单引号,以便$1shell评估:
awk "/$1/ {print NR}" $2 | head -n 1
Run Code Online (Sandbox Code Playgroud)
您应该使用AWK的变量传递功能:
awk -v patt="$1" '$0 ~ patt {print NR; exit}' "$2"
Run Code Online (Sandbox Code Playgroud)
这exit使得head -1不必要.
在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.
| 归档时间: |
|
| 查看次数: |
8609 次 |
| 最近记录: |