二重引用符を使用してawkのアクションステートメントを囲むと、単一引用符を使用してそれらを囲む場合とは異なる結果が生成されるのはなぜですか?


8

一重引用符を使用してawkのアクションステートメントを囲むと、期待どおりに機能します。

$ dpkg -l | grep "linux\-[a-z]*\-" | awk {'print $2'}
linux-headers-3.13.0-27
linux-headers-3.13.0-27-generic
linux-headers-3.14.4-031404
linux-headers-3.14.4-031404-generic
linux-headers-generic
linux-image-3.13.0-27-generic
linux-image-3.14.4-031404-generic
linux-image-extra-3.13.0-27-generic
linux-image-generic
linux-libc-dev:i386
linux-sound-base

しかし、二重引用符を使用してそれらを囲むと、特定の列/フィールドではなく行全体が出力されます。

$ dpkg -l | grep "linux\-[a-z]*\-" | awk {"print $2"}
ii  linux-headers-3.13.0-27                    3.13.0-27.50                                           all          Header files related to Linux kernel version 3.13.0
ii  linux-headers-3.13.0-27-generic            3.13.0-27.50                                           i386         Linux kernel headers for version 3.13.0 on 32 bit x86 SMP
ii  linux-headers-3.14.4-031404                3.14.4-031404.201405130853                             all          Header files related to Linux kernel version 3.14.4
ii  linux-headers-3.14.4-031404-generic        3.14.4-031404.201405130853                             i386         Linux kernel headers for version 3.14.4 on 32 bit x86 SMP
ii  linux-headers-generic                      3.13.0.27.33                                           i386         Generic Linux kernel headers
ii  linux-image-3.13.0-27-generic              3.13.0-27.50                                           i386         Linux kernel image for version 3.13.0 on 32 bit x86 SMP
ii  linux-image-3.14.4-031404-generic          3.14.4-031404.201405130853                             i386         Linux kernel image for version 3.14.4 on 32 bit x86 SMP
ii  linux-image-extra-3.13.0-27-generic        3.13.0-27.50                                           i386         Linux kernel extra modules for version 3.13.0 on 32 bit x86 SMP
ii  linux-image-generic                        3.13.0.27.33                                           i386         Generic Linux kernel image
ii  linux-libc-dev:i386                        3.13.0-27.50                                           i386         Linux Kernel Headers for development
ii  linux-sound-base                           1.0.25+dfsg-0ubuntu4                                   all          base package for ALSA and OSS sound systems

なぜそうなのですか?二重引用符を使用してawkのアクションステートメントを囲むと、単一引用符を使用してそれらを囲む場合とは異なる結果が生成されるのはなぜですか?二重引用符を使用して囲むと、単一引用符を使用して囲むように動作するようにできますか?


中括弧の外で単一引用符を使用するようにしてください。
Avinash Raj 14年

@AvinashRaj構文エラーが発生します。すべてのアクションステートメントはawk内にある必要があります{ ... }
Aditya 2014年

構文エラーが発生すると誰が言ったのですか?Awk sysntaxは次のようになりますawk 'condition1{action1} condition2 {action2}'。このようにawkコマンドawk '{print $1}'を指定すると、条件が指定されていないことになります。
Avinash Raj

私はあなたのコマンドawk {'print $2'}が間違っているとは言いませんでした。私は、あなたを混乱させるので、中括弧の中に一重引用符を避ける方が良いだろうと述べました。
Avinash Raj 14年

@AvinashRajああ。
Aditya 2014年

回答:


6

二重引用符を使用$2すると、awkが呼び出される前にシェルに置き換えられます。$2通常、空に動作しています

awk {"print $2"}

走ることと同じです

awk {"print "}

使用する

awk {"print \$2"}

二重引用符を使用する場合。


私はシェル拡張を行っているときのように、マニュアルを見て。一重引用符や二重引用符については何も触れられていません。単一引用符の場合、なぜ拡張が実行されないのですか?そして、bashはどこから$2拡張されましたか?(私は物事を学ぼうとしているので、私は何が起こっているのかを理解したいと思います):)
Aditya

ああ.. これ見つけて、シングルクォートとダブルクォートの違いを説明します。それは明らかです..さて、bashはどこから入手しました$2か?
Aditya

コマンドラインで作業している場合、$2通常は空の環境変数です
Florian Diesch

わかりました、bashで変数を定義する必要がないことを知りませんでした。変数が見つからない場合、bashは自動的にそれを空として展開します。Server Faultに関するこの回答はそれを解消します。
Aditya 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.