なぜこれが機能しないのですか?
x=5
$ ls -l | awk '{print $(($x))}'
ls -l コマンドのフィールド 5 を出力する必要がありますよね?
なぜこれが機能しないのですか?
x=5
$ ls -l | awk '{print $(($x))}'
ls -l コマンドのフィールド 5 を出力する必要がありますよね?
シェル変数の値を渡す必要がある唯一の方法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
私のものと同じであると仮定すると、これは現在のディレクトリ内のすべてのファイルサイズを表示します。
これらに似たシェル変数にアクセスできます。
最初の方法は推奨されません。
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"]}'
これはシェル変数であり、シェルによって単一引用符で囲まれて展開されません。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}"
これを試して :
ls -l | awk '{print $'$x'}'