Bash:如何在 .bashrc 中为带参数的 awk 创建别名

Bash:如何在 .bashrc 中为带参数的 awk 创建别名

我试图在 .bashrc 文件中添加别名,如下所示:

...
alias cutf="_cutf"
...
_cutf() {
   awk 'NR >= $2 && NR <= $3 { print }' < $1
}

(该函数的目标是显示 $1 文件中编号在 $2 到 $3 之间的行的内容)

当我在新的 bash 会话中调用 cutf 时,我没有得到任何输出。

我错过了什么吗?

答案1

$2 和 $3 用单引号引起来。 Shell 不会在单引号中扩展变量,因此它们由awk.切换到双引号:

awk "NR >= $2 && NR <= $3 { print }" < "$1"

请注意,您可以通过以下方式实现相同的目的

sed -n 'X,Yp' file

其中 X 和 Y 是行号,或者在 Perl 中类似

perl -ne 'print if X .. Y' file

它们都很短,您可能不需要它们的函数。

答案2

您不应该让 shell 扩展 awk 语句中的变量。 $2 和 $3 等变量在 awk 中具有特殊含义。

_cutf() {
   awk -v start="$2" -v stop="$3" 'NR >= start && NR <= stop { print }' "$1"
}

或者你可以这样写

_cutf() {
   awk 'NR >= start && NR <= stop { print }' start="$2" stop="$3" "$1"
}

相关内容