2

なぜこれが機能しないのですか?

x=5
$ ls -l | awk '{print $(($x))}'

ls -l コマンドのフィールド 5 を出力する必要がありますよね?

4

4 に答える 4

3

シェル変数の値を渡す必要がある唯一の方法awkは次のとおりです。

$ x=5

$ ls -l | awk -v x="$x" '{print $x}'

$ ls -l | awk '{print $x}' x="$x"

これら 2 つの方法の主な違いは-v、値を使用するとブロックにx設定されBEGINますが、2 番目の方法では値が設定されないことです。トリックを引用したりエスケープしたりする他のすべての方法は、頭が痛いのでない限り使用しないでください。


ただし、まったく解析したくないls場合は、本当に必要なコマンドは次のとおりです。

stat --printf="%s\n" *

あなたの5番目の列がls私のものと同じであると仮定すると、これは現在のディレクトリ内のすべてのファイルサイズを表示します。

于 2013-05-10T07:35:11.630 に答える
2

これらに似たシェル変数にアクセスできます。

最初の方法は推奨されません。

x=5
ls -l | awk '{print $'$x'}'

または、プログラムの実行が開始される前に、値 x を変数 shellVar に割り当てます。

x=5
ls -l | awk -v shellVar="$x" '{print $shellVar}'

または現在の環境の値を含む配列を使用する

export x=5
ls -l | awk '{print $ENVIRON["x"]}'
于 2013-05-10T04:53:21.150 に答える
1

これはシェル変数であり、シェルによって単一引用符で囲まれて展開されません。awk スクリプトを単一引用符で囲む理由は、シェルが awk の利益のために意図されたものを解釈して物事を台無しにするのを防ぐためですが、シェルにその一部を解釈させたい場合もあります。

このような場合、値を awk 変数として渡すことを好みます。

ls -l | awk -v "x=$x" '{print $x}'

しかし、他の方法はいくらでもできます。たとえば、これは次のとおりです。

ls -l | awk '{print $'$x'}'

これは実際には次のようになります。

ls -l | awk '{print $'"$x"'}'

または、これ:

ls -l | awk "{print \$$x}"
于 2013-05-10T05:55:29.247 に答える
0

これを試して :

ls -l | awk '{print $'$x'}'
于 2013-05-10T04:47:58.533 に答える