

環境変数Nに数字が入っていたとして、

[code]

    awk "NR>N"
    
[/code]

のように awk のスクリプト内で変数の値を使いたいのですがどうすればいいでしょうか？


CC BY-SA 4.0
2020-08-05T09:23:50.633
69273
2020-08-05T10:53:07.403
2020-08-05T10:39:37.527
19110
36091
question
linux shellscript zsh
環境変数をawk内で使う方法


awk の `-v` オプションを使ってください。

[code]

    awk -v N="$N" 'NR>N'
    
[/code]

## 理由

他に考えられる方法として、シェルの変数展開を使う方法もあります。

[code]

    awk "NR>$N"
    
[/code]

しかしこの方法には 2 つ欠点があります。

  1. 一般には可読性が落ちます。awk スクリプトを書く際は内部での無駄なエスケープを避けるため、全体をシングルクォートで囲いたくなることがあります。その上でこの方法を使おうとするとシングルクォートとダブルクォートが入り乱れ可読性が落ちてしまいます。
  2. 変数の中身が awk スクリプトとして解釈されてしまう可能性が排除されます。シェルによる展開を使うと変数の中身を使った文字列がそのまま awk の引数として渡されるため、シェルの変数の中に awk スクリプトとして解釈可能なものが入っていればそれが awk によって解釈されてしまいます。`-v` を使う方法ではそうなりません。

2 の例：

[code]

    $ CMD='; print "piyopiyo"'
    $ awk "BEGIN { print $CMD }"
    
    piyopiyo
    $ awk -v CMD="$CMD" 'BEGIN { print CMD }'
    ; print "piyopiyo"
    
[/code]


CC BY-SA 4.0
2020-08-05T10:53:07.403
69279
2020-08-05T10:53:07.403
19110
69273
answer