awkを使用してスクリプトファイルから特殊文字を引用する

awkを使用してスクリプトファイルから特殊文字を引用する

そのため、ユーザーが入力した数字を受け入れ、その数字に応じて特定のコマンドを実行するスクリプトファイルを作成したいと思います。awkもちろん、このコマンドはフィールド区切り文字を使用するコマンドです。awk次のファイルを使用しています/etc/passwd

smiths|Login|2
olivert|Login|2
northj|Login|2
denniss|Login|2
smithd|Login|2
smiths|Time Reporting|210
olivert|Payroll|155
northj|Server Maintenance|70
northj|Logfile Reporting|45
denniss|Report Printing|80
smithd|Payroll Program Updates|150
smithd|Payroll Program Updates|180
smiths|Logout|2
olivert|Logout|2
northj|Logout|2
denniss|Logout|2
smithd|Logout|2

私の問題は、パイプをフィールド区切り文字として使用しようとしていますが、バックスラッシュを使用してパイプをエスケープしようとしているとき(これが私がしなければならないと思うもの)、実際に引用しないことです。コロンのようなものを使用すると問題になりません。

case "$choice" in
    1)
       awk -F : '$2\n'
       ;;
    2)
       awk -F : '$1\n'
       ;;

コロンの代わりにフィールド区切り記号としてパイプ(上記のドキュメントを参照)を使用したいと思います。どんな答えでも感謝します!

ベストアンサー1

正しい構文は次のとおりです。awk '-F[|]' '{ print $2 }'

|これはシェル特殊文字なので、シェルがパイプを生成しないように引用符で囲む必要があります。

しかし|アッ正規表現で代替パターンを区切るために使用される特殊文字。これを参照する最善の方法は、同じ文字で構成される範囲に入れることです[|]。 -Fオプションは、正規表現(RE、パターン)として使用されるawk変数FS(フィールド区切り文字)を設定します。

[..]その後、ファイル名を拡張するシェル特殊文字がある可能性があるため、内容全体を引用する必要があります。

'$2\n'有効な awk プログラムですが、期待どおりに動作しません。何も行っていない状態でモード状態です。したがって、$ 2が空でない場合、モードはTrueで、行全体が印刷されます。

これはジョブが必要な作業です。{ }フィールドを選択して印刷するだけです。改行文字は必要ありません。 printはこれを自動的に行います。

おすすめ記事