2017-10-23 14 views
1

このコマンドはaと表示されます。awkで二重引用符を使用する

echo "line1 a b c" | awk '{ print $2 }' 

私は二重引用符に単一引用符を変更すると、このように、それは全体のラインが印刷されます。

echo "line1 a b c" | awk "{ print $2 }" 

なぜですか?私は一重引用符を使用すべきであることを知っていますが、二重引用符を使用すると、なぜ行全体が表示されますか?

+1

二重引用符を使用すると、シェルは2番目の位置パラメータに '$ 2 'を展開します。これは非常にうまくいくかもしれません。awkは' print'だけを見ます。 –

+0

@ベンジャミンW。あなたの答えに同意しますが、重複しているとは思わないでください。 – michael

+1

私はそれが*重複していない方法を見ることができません。一重引用符と二重引用符がどのように異なっているかに対する答えは、bashでは 'awk'を呼び出すためにbashを使うときの違いを答えています。 'awk'は' awk '{print}'と 'awk" {print $ 2} "との違いを、空の' $ 2'を持つbashと区別する方法がありません。 –

答えて

3

awkコマンドが引用された単一の場合は、$2は、シェルによって解釈されるのではなく、awkに文字列リテラル$2として渡されます。 awkは、printの入力文字列内の2番目のスペースで区切られたトークン(この場合はa)になります。

echo "line1 a b c" | awk '{ print $2 }' # prints the second space-delimited token 
> a 

awkコマンドは、二重引用符で囲まれている場合、$2がシェルによって解釈されます。 $2が空であるため(この場合)、空の文字列が置換されます。 awkは、すべてを印刷する指示であるawk "{ print }"のようなコマンドを表示します。

echo "line1 a b c" | awk '{ print }' # prints all input 
> line1 a b c 

二重のqotesを使用し、$は、シェルによって解釈されないように、代わりに$2文字列がawkに渡される原因になります$を、エスケープすることも可能です。

echo "line1 a b c" | awk "{ print \$2 }" # prints the second space-delimited token 
> a 
関連する問題