awk でちょっとした問題に遭遇したのですが、なぜこのようなことが起こるのか説明してくれる人がいたら知りたいです。
次の 2 行を実行すると、動作が異なります。
# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" '{print $1}'
予想どおり、BASE_DIR を含むファイルへのパスの最初のディレクトリだけが取得されます。
ただし、次のように実行すると:
# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F="/" "{print $1}"
編集:
-F="/"
-F "/"
私のテストでは違いはなかった。2番目のコマンドはこれを示すように更新されました
回答のGlenn Jackmanの提案に従って、コマンドを次のように変更しました。
# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" "{print $1}"
そして全く同じ欠陥のある結果を得た
編集終了
"{print \$1}"
BASE_DIR を含むファイルへの完全なパスを取得し、これが問題である場合に備えてプログラム テキストをエスケープしてみましたが、結果は同じでした。
ここで何が問題なのか誰か教えてもらえますか?
答え1
最初の例では、次のことを行っています。awk -F "/"
次の例では、次のことを行っています。awk -F="/"
フィールドセパレータが異なります。2文字の文字列を=/
フィールドセパレータとして使用しています。
ああ、なぜ今まで気づかなかったのか分かりませんが、引用符の使い方が間違っています。
# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" "{print $1}"
------------------------------------------------------^
awkプログラムを囲む二重引用符は、シェルが変数を置換することを意味します。$1
前にプログラムを awk に渡します。シェルではおそらく$1
空なので、awk は次のように認識します。{print }
代わりに一重引用符を使用してください。