Bash:パラメータを使用してawkの.bashrcにエイリアスを作成する方法

Bash:パラメータを使用してawkの.bashrcにエイリアスを作成する方法

次のように.bashrcファイルにエイリアスを追加しようとしています。

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

(この関数の目的は、$ 1ファイル内の$ 2と$ 3の間に番号が付けられた行の内容を表示することです。)

新しいbashセッションでcutfを呼び出すと、出力は出ません。

私は何を逃したことがありませんか?

答え1

$ 2と$ 3は一重引用符で囲まれています。シェルは一重引用符で囲まれた変数を拡張しないため、からawk二重引用符に変換されます。

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

以下を使用して同じ結果を得ることができます。

sed -n 'X,Yp' file

ここで、XとYは行番号、またはPerlでも同様です。

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

どちらも短く、おそらくその機能は必要ありません。

答え2

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"
}

関連情報