![Bash:如何在 .bashrc 中为带参数的 awk 创建别名](https://linux22.com/image/4678/Bash%EF%BC%9A%E5%A6%82%E4%BD%95%E5%9C%A8%20.bashrc%20%E4%B8%AD%E4%B8%BA%E5%B8%A6%E5%8F%82%E6%95%B0%E7%9A%84%20awk%20%E5%88%9B%E5%BB%BA%E5%88%AB%E5%90%8D.png)
我试图在 .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"
}