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ユーザーガイドを参照してください。