GNU/Linux >> Linux の 問題 >  >> Linux

gawkの初心者向けガイド

gawkは、1970年代にUNIXオペレーティングシステム用に最初に開発されたAwkプログラミング言語のGNU実装です。 Awkプログラミング言語は、テキストファイルのデータフォーマット、特に列に編成されたテキストデータの処理を専門としています。

Awkプログラミング言語を使用すると、データの操作や抽出、レポートの生成、パターンの照合、計算の実行などを非常に柔軟に行うことができます。 Awkを使用すると、1行のコードでやや難しいタスクを実行できます。 CやPythonなどの従来のプログラミング言語を使用して同じ結果を得るには、追加の作業と多くのコード行が必要になります。

gawk また、ほとんどのLinuxディストリビューションでデフォルトで使用可能なコマンドラインユーティリティも指します。ほとんどのディストリビューションは、awkのシンボリックリンクも提供します gawkを指しています 。簡単にするために、これ以降、ユーティリティをawkとのみ呼びます。 。

awk 標準入力(STDIN)から直接データを処理します。一般的なパターンは、他のプログラムの出力をawkにパイプすることです。 データを抽出して印刷しますが、awk ファイルからのデータを処理することもできます。

この記事では、awkを使用します スペースで区切られた列を持つファイルからのデータを分析します。サンプルデータを確認することから始めましょう。

サンプルデータ

このガイドの例では、コマンドps uxの出力を使用してみましょう。 psux.outファイルに保存 。ファイル内のデータのサンプルは次のとおりです。

$ head psux.out
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
ricardo     1446  0.0  0.2  21644 11536 ?        Ss   Sep10   0:00 /usr/lib/systemd/systemd --user
ricardo     1448  0.0  0.1  49212  5848 ?        S    Sep10   0:00 (sd-pam)
ricardo     1459  0.0  0.1 447560  7148 ?        Sl   Sep10   0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
ricardo     1467  0.0  0.1 369144  6080 tty2     Ssl+ Sep10   0:00 /usr/libexec/gdm-wayland-session /usr/bin/gnome-session
ricardo     1469  0.0  0.1 277692  4112 ?        Ss   Sep10   0:00 /usr/bin/dbus-broker-launch --scope user
ricardo     1471  0.0  0.1   6836  4408 ?        S    Sep10   0:00 dbus-broker --log 4 --controller 11 --machine-id 16355057c7274843823dd747f8e2978b --max-bytes 100000000000000 --max-fds 25000000000000 --max-matches 5000000000
ricardo     1474  0.0  0.3 467744 14132 tty2     Sl+  Sep10   0:00 /usr/libexec/gnome-session-binary
ricardo     1531  0.0  0.1 297456  4280 ?        Ssl  Sep10   0:00 /usr/libexec/gnome-session-ctl --monitor
ricardo     1532  0.0  0.3 1230908 12920 ?       S<sl Sep10   0:01 /usr/bin/pulseaudio --daemonize=no

次のコマンドを使用して、ここから完全なファイルをダウンロードできます:

$ curl -o psux.out https://gitlab.com/-/snippets/2013935/raw\?inline\=false

ps uxの出力を使用することにした場合 システムで、結果に一致するように例に示されている値を調整します。

次に、awkを使用しましょう サンプルファイルのデータを表示します。

基本的な使用法

基本的なawk プログラムは、中括弧で囲まれたアクションが続くパターンで構成されます。 awkにプログラムを提供できます 次のように、ユーティリティを一重引用符で囲んでインライン化します。

$ awk 'pattern { action }'

awk 入力データ(標準の入力またはファイル)を1行ずつ処理し、パターンに一致する各行(またはレコード)に対して指定されたアクションを実行します。パターンを省略した場合は、awk すべてのレコードに対してアクションを実行します。アクションは、ラインからデータを印刷するのと同じくらい単純な場合もあれば、完全なプログラムのように複雑な場合もあります。たとえば、サンプルファイルからすべての行を印刷するには、次のコマンドを使用します。

$ awk '{ print }' psux.out
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
ricardo     1446  0.0  0.2  21644 11536 ?        Ss   Sep10   0:00 /usr/lib/systemd/systemd --user
.... OUTPUT TRUNCATED ....

この例はあまり役に立ちませんが、awkを示しています。 コマンドの基本的な使用率。

コマンドps ux を使用している場合 マシンでは、出力を直接awkにパイプできます。 、入力ファイル名を指定する代わりに:

$ ps ux | awk '{ print }'

次に、awkを使用しましょう サンプルファイルからデータの一部を抽出するための列処理機能。

印刷フィールド

awkの力 その列処理機能を使用すると、明らかになり始めます。 awk 各行(またはレコード)をフィールドに自動的に分割します。デフォルトでは、スペースを使用します 各フィールドを区切る文字ですが、コマンドラインパラメータ-Fを指定することで変更できます。 目的のセパレータが続きます。

分割後、awk 各フィールドを、文字$で始まる番号付き変数に割り当てます 。たとえば、最初のフィールドは$1です。 、2番目の$2 、 等々。特別な変数$0 分割する前のレコード全体が含まれます。

フィールド変数を使用することにより、入力からデータを抽出できます。たとえば、サンプルファイルからコマンド名のみを出力するには、変数$11を使用します。 コマンド名は各行の11列目であるため:

$ awk '{ print $11 }' psux.out
COMMAND
/usr/lib/systemd/systemd
(sd-pam)
/usr/bin/gnome-keyring-daemon
.... OUTPUT TRUNCATED ....

複数のフィールドをコンマで区切って印刷することもできます。たとえば、コマンド名とCPU使用率を列3に出力するには、次のコマンドを使用します。

$ awk '{ print $11, $3 }' psux.out
COMMAND %CPU
/usr/lib/systemd/systemd 0.0
(sd-pam) 0.0
/usr/bin/gnome-keyring-daemon 0.0
.... OUTPUT TRUNCATED ....

最後に、組み込みのprintfを使用します 出力をフォーマットし、列を整列させる関数。より長いコマンド名に対応するために、最初の列の右側に40文字のパディングを提供します。

$ awk '{ printf("%-40s %s\n", $11, $3) }' psux.out
COMMAND                                  %CPU
/usr/lib/systemd/systemd                 0.0
(sd-pam)                                 0.0
/usr/bin/gnome-keyring-daemon            0.0
/usr/libexec/gdm-wayland-session         0.0
.... OUTPUT TRUNCATED ....

各レコードから個々のフィールドを操作および抽出できるようになったので、パターン機能を適用してレコードをフィルタリングしましょう。

[次のこともお勧めします:sedを使用してコマンドラインでテキストを操作する]

パターンマッチング

フィールドの操作に加えて、awk 強力なパターンマッチング機能を使用して、アクションを実行するレコードをフィルタリングできます。最も基本的な使用法では、スラッシュ/で囲まれた正規表現を提供します レコードに一致する文字。たとえば、 firefoxに一致するレコードでフィルタリングするには 、/firefox/を使用します :

$ awk '/firefox/ { print $11, $3 }' psux.out
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 8.3
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 9.0
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0
/usr/lib64/firefox/firefox 0.0

フィールドと比較式をパターンマッチング基準として使用することもできます。たとえば、PID 6685に一致するプロセスからのデータを印刷するには、フィールド$2を比較します。 、このように:

$ awk '$2==6685 { print $11, $3 }' psux.out
/usr/lib64/firefox/firefox 0.0

awk は数値フィールドを理解するのに十分スマートであり、より大きいまたはより小さいなどの相対比較を使用できます。たとえば、 5%以上のCPUを使用するすべてのプロセスを表示するには$3 > 5を使用します :

$ awk '$3 > 5 { print $11, $3 }' psux.out
/usr/bin/gnome-shell 5.1
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 8.3
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 9.0
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0

パターンと演算子を組み合わせることができます。たとえば、 firefoxに一致するすべてのプロセスを表示するには 5%以上のCPUを使用 、両方のパターンを&&と組み合わせます 論理ANDの演算子 :

$ awk '/firefox/ && $3 > 5 { print $11, $3 }' psux.out
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 8.3
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 9.0
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0

最後に、パターンマッチングを使用しているため、awk ヘッダー行を印刷しなくなりました。 BEGINを使用して、独自のヘッダー行を追加できます レコードを処理する前に単一のアクションを実行するパターン:

$ awk 'BEGIN { printf("%-26s %s\n", "Command", "CPU%")} $3 > 10 { print $11, $3 }' psux.out
Command                    CPU%
/usr/lib64/firefox/firefox 66.2
/usr/lib64/firefox/firefox 15.6
/usr/lib64/firefox/firefox 31.5
/usr/lib64/firefox/firefox 20.6
/usr/lib64/firefox/firefox 31.0

次に、個々のフィールドのデータを操作してみましょう。

フィールド操作

前のセクションで説明したように、awk 数値フィールドを理解します。これにより、数値計算を含むデータ操作を実行できます。たとえば、すべての firefoxの列6にメモリ使用率を出力することを検討してください。 プロセス:

$ awk '/firefox/ { print $11, $6 }' psux.out
/usr/lib64/firefox/firefox 301212
/usr/lib64/firefox/firefox 118220
/usr/lib64/firefox/firefox 168468
/usr/lib64/firefox/firefox 101520
/usr/lib64/firefox/firefox 194336
/usr/lib64/firefox/firefox 111864
/usr/lib64/firefox/firefox 163440
/usr/lib64/firefox/firefox 38496
/usr/lib64/firefox/firefox 174636
/usr/lib64/firefox/firefox 37264
/usr/lib64/firefox/firefox 30608
/usr/lib64/firefox/firefox 174636
/usr/lib64/firefox/firefox 174660

コマンドps ux 読みにくいメモリ使用率をキロバイト単位で表示します。フィールド値を1024で割り込んで、メガバイトに変換してみましょう:

$ awk '/firefox/ { print $11, $6/1024 }' psux.out
/usr/lib64/firefox/firefox 294.152
/usr/lib64/firefox/firefox 115.449
/usr/lib64/firefox/firefox 164.52
/usr/lib64/firefox/firefox 99.1406
/usr/lib64/firefox/firefox 189.781
/usr/lib64/firefox/firefox 109.242
/usr/lib64/firefox/firefox 159.609
/usr/lib64/firefox/firefox 37.5938
/usr/lib64/firefox/firefox 170.543
/usr/lib64/firefox/firefox 36.3906
/usr/lib64/firefox/firefox 29.8906
/usr/lib64/firefox/firefox 170.543
/usr/lib64/firefox/firefox 170.566

数値を切り上げて、接尾辞 MBを追加することもできます printfを使用する 読みやすさを向上させるために:

$ awk '/firefox/ { printf("%s %4.0f MB\n", $11, $6/1024) }' psux.out
/usr/lib64/firefox/firefox  294 MB
/usr/lib64/firefox/firefox  115 MB
/usr/lib64/firefox/firefox  165 MB
/usr/lib64/firefox/firefox   99 MB
/usr/lib64/firefox/firefox  190 MB
/usr/lib64/firefox/firefox  109 MB
/usr/lib64/firefox/firefox  160 MB
/usr/lib64/firefox/firefox   38 MB
/usr/lib64/firefox/firefox  171 MB
/usr/lib64/firefox/firefox   36 MB
/usr/lib64/firefox/firefox   30 MB
/usr/lib64/firefox/firefox  171 MB
/usr/lib64/firefox/firefox  171 MB

最後に、このアイデアをBEGINと組み合わせます およびEND より高度なデータ操作を実行するためのパターン。たとえば、すべての Firefoxの合計メモリ使用率を計算してみましょう。 変数sumを定義して処理します BEGINで アクション、列6の値を追加$6 firefoxに一致する行ごとに 合計に 変数を入力し、ENDで出力します。 メガバイト単位のアクション:

$ awk 'BEGIN { sum=0 } /firefox/ { sum+=$6 } END { printf("Total Firefox memory: %.0f MB\n", sum/1024) }' psux.out
Total Firefox memory: 1747 MB

[今すぐダウンロード:システム管理者によるBashスクリプトのガイド。 ]

次は何ですか?

gawk は、テキストデータ、特に列に配置されたデータを処理するための強力で柔軟なツールです。この記事では、このツールを使用してデータを抽出および操作するための便利な例をいくつか紹介しましたが、gawk はるかに多くのことができます。 gawkの詳細については 、Linuxディストリビューションのマニュアルページを参照してください。

Awk言語には、このガイドで説明したものよりもはるかに多くのリソースがあります。詳細については、公式のGNUAwkユーザーガイドを参照してください。


Linux
  1. awkを学ぶための実用的なガイド

  2. .htaccessファイルでリダイレクトを作成するための初心者向けガイド

  3. Dockerロギングの完全な初心者向けガイド

  1. Linuxの基本:vimを使用したテキスト編集の初心者向けガイド

  2. Linuxでのfirewalldの初心者向けガイド

  3. LinuxでのLVMの完全な初心者向けガイド

  1. Linuxパーミッションのビギナーズガイド

  2. awkを使用したデータの抽出と表示

  3. AWK 対 NAWK 対 GAWK