awkを使用した複数の文字列に基づいたファイルパスのフィルタリング

awkを使用した複数の文字列に基づいたファイルパスのフィルタリング

awkを使用してスクリプトのファイルパスをフィルタリングして、正規表現のすべてのエントリを無視しようとしています。

FILTERED_FILE=$(echo $File |  awk -F / "{(for(i=NF; i>=0; i--) {if $(i!~^(NewConfig|Old|old|backup|Backup|Servers)$ print $i}}") ;

デフォルトでは、フィールドごとに繰り返し、これらのキーワードを含まないファイルパスの最初のフィールドを抽出しようとしています。たとえば、ファイルパスが次のような場合:

/etc/Backup/Servers/blah/Old

$FILTERED_FILE変数になりたいですblah

これ精密この行は他のスクリプトで期待どおりに機能しますが、awk変数($ i)はまだ空です。私はawkの初心者なので、明らかに何かを見逃しています。どこを見なければならないかご提案いただきありがとうございます。私はこの行がスクリプトの他の行に依存していないと思いますが(もう一度言うが、これは私が適用した以前のスクリプトで動作しました)、必要に応じてさらにアップロードします。私もawkに捧げません。より良いツール(grep、sedなど)を考えることができれば、それも良いでしょう。

ありがとうございます!

ベストアンサー1

コードだけでなくシェルawkにもいくつかの問題があると思います。

まず、のawkように常にコードを一重引用符で囲みますawk '<commands>'。そうしないと、奇妙な効果が発生する可能性があります。シェル$<...>声明を説明してください。

第二に、いくつかの場所で構文が間違っているようです。

  • あなたが探していると言いました。最初フィールドが一致しませんが、探しているようです。最後一つ?ただし、コードが印刷されます。みんな最初の一致が見つかった後はループから出ないので、一致しない他のフィールドにも同様です。
  • RegExpの比較は次のとおりです。
    if ($i !~ /^( .... )$/) { ... }
    
  • ifサンプルコードで、ステートメントの閉じ括弧がありません。

第三に、シェルスクリプトでコマンドを二重引用符で置き換える必要があります。

修正された awkコードは次のとおりです。

awk -F '/' '{for (i=NF; i>0; i--) {if ($i !~ /^(NewConfig|[Oo]ld|[Bb]ackup|Servers)$/) {print $i; exit}}}'

スクリプトから呼び出すには、次を使用します。

Filtered_File="$( echo "$File" | awk -F '/' ' .... ')"

構造のため、この最後の部分は実際にはスクリプト内でのみ機能します!~。コマンドラインで完了すると、bash少なくともコマンド置換用のサブシェルを起動する前にコマンド履歴の拡張が試行され、エラーメッセージが表示されます。

おすすめ記事