InfraAcademy

InfraAcademy Blog

【Linux】awkコマンドの使い方を初心者向けに解説!テキストを抽出・集計してみよう

| #Linux #Linux初心者 #コマンド

こんにちは、フルスタックエンジニアのryuです。

今回の記事では、Linuxのawk(オーク)コマンドについて解説します。awkコマンドとは、テキストファイルを行や列に分けて、必要な部分を取り出したり、計算したりできるコマンドです。

Linuxを勉強していると、awkは難しそうに見えますよね。$1$2、波括弧の中にあるprintを見て、プログラミング言語のように感じる方も多いと思います。

ただ、最初から複雑な処理を覚える必要はありません。まずは、何列目を表示するか指定できるコマンドとして使ってみると理解しやすいです。

この記事では、awkコマンドの基本的な使い方から、区切り文字の変更、条件による抽出、合計や平均の計算まで、実際のコマンドを使いながら解説します。

【Linux】awkコマンドとは?

awkコマンドは、テキストデータを一定のルールで読み取り、必要な部分を抽出したり加工したりするためのコマンドです。

ファイルを1行ずつ読み込み、その行を空白やカンマなどで分割して処理します。そのため、ログファイルやCSVファイルの確認でとても役立ちます。

awkコマンドでできること

awkコマンドでよく行う処理を整理すると、次のようになります。

処理 できること
列の抽出 1列目や2列目など、必要なフィールドだけ表示する
行の抽出 特定の文字列や条件に一致する行だけ表示する
区切り文字の変更 カンマやコロンなどを区切り文字として扱う
集計 数値の合計、件数、平均などを計算する
表示形式の調整 文字列を追加したり、見やすく整形したりする
パイプとの連携 別のLinuxコマンドの結果を受け取って加工する

たとえば、Webサーバーのアクセスログからステータスコードだけを取り出すことができます。ユーザー情報が記録された/etc/passwdから、ユーザー名だけを一覧表示することも可能です。

エンジニアとして10年ほどサーバーを扱ってきましたが、awkは大量のデータを本格的に分析するというより、調査中に必要な情報を素早く抜き出したいときによく使います。

障害調査では、ログ全体を目で追うよりも、awkで列を絞った方が状況をつかみやすくなります。数十行では差が小さくても、数千行のログになると作業時間が大きく変わります。

grepコマンドとの違い

grepは、指定した文字列を含む行を検索するのが得意です。一方、awkは行を列に分け、特定の列を表示したり数値を計算したりできます。

エラー行を探すならgrep、エラー行から日時やステータスコードだけを取り出すならawk、という使い分けが分かりやすいです。

【関連記事】Linuxのgrepコマンドで文字を検索する方法

【Linux】awkコマンドの使い方

まずは、awkコマンドの基本的な使い方から解説します。

awkコマンドの基本的なコマンド

awkコマンドは、テキストファイルを処理するコマンドです。

処理する条件とファイルを指定します。

awk '[処理する条件]' [ファイル名]

条件を指定することで、ファイルの中身を加工して表示してくれます。

例えば、ファイルの中身から2つ目のフィールドを表示させたい場合は、以下のように実行します。

awk '{ print $2 }' file.txt

file.txtの元のデータは、以下のようになっています。

field1 field2 field3 field4
field1 field2 field3 field4

コマンドを実行すると、field2の部分だけ表示されます。

‘{ print $2 }’と指定することで、2番目のフィールドを表示します。awkコマンドは、デフォルトで空白文字部分でフィールドを区切るので、1つ目の空白の次の場所が2番目のフィールドになります。

awkでは、分割された1つひとつの項目をフィールドと呼びます。$1は1番目のフィールド、$2は2番目のフィールド、$3は3番目のフィールドです。

$1・$2・$NFの意味

awkを使ううえで、最初に覚えておきたい記号を表にまとめます。

記述 意味
$0 現在読み込んでいる行全体
$1 1番目のフィールド
$2 2番目のフィールド
$NF 最後のフィールド
NF 現在の行にあるフィールド数
NR 先頭から数えた現在の行番号

最後の列を表示したいときは、列数を数えて$5などと書く必要はありません。$NFを使えば、列数が異なるデータでも最後のフィールドを取り出せます。

awk '{ print $NF }' file.txt

行番号を付けて表示したい場合は、NRを使います。

awk '{ print NR, $0 }' file.txt

設定ファイルやログへ行番号を付けると、問題箇所をほかのメンバーへ伝えやすくなります。

複数のフィールドを表示する

複数のフィールドを表示したい場合は、printの後ろにカンマで並べます。

awk '{ print $1, $3 }' file.txt

この場合、1番目と3番目のフィールドが空白で区切られて表示されます。

awkコマンドの区切り文字を指定する

awkは、デフォルトではスペースやタブを区切りとしてフィールドを分けます。

しかし、実際に扱うファイルが空白区切りとは限りません。CSVはカンマ、/etc/passwdはコロンで区切られています。

-Fオプションで区切り文字を変更する

区切り文字を変更するときは、-Fオプションを使います。

awk -F'[区切り文字]' '{ print $1 }' ファイル名

よく使う指定は、CSVの-F','/etc/passwd-F':'、タブ区切りの-F'\t'です。

区切り文字はシングルクォートで囲んでおくと、シェルによる記号の解釈を避けやすくなります。

CSVファイルの特定の部分を出力する

まずは、CSVファイルです。

CSVファイルは,(カンマ)で区切られて値が入っています。

その場合、-Fオプション使い、区切り文字を,(カンマ)に指定します。

awk -F',' '{ print $2 }' file.csv

1行目の見出しを除き、2列目だけを表示する場合は、次のように実行します。

awk -F',' 'NR > 1 { print $2 }' users.csv

NR > 1は、2行目以降を処理する条件です。値の中にカンマや改行を含むCSVは正しく分割できないことがあるため、その場合はPythonなどを使いましょう。

/etc/passwdからユーザー名を表示する

Linuxのユーザー情報が保存されている/etc/passwdは、コロンで区切られています。

ユーザー名は1番目のフィールドにあるため、次のコマンドで一覧表示できます。

awk -F':' '{ print $1 }' /etc/passwd

ユーザー名とログインシェルを確認するなら、{ print $1, $7 }と指定します。awkを覚えると、設定ファイルを項目ごとのデータとして読みやすくなります。

awkコマンドを別のコマンドと組み合わせる

awkは、ファイルを直接指定するだけでなく、別のコマンドの実行結果を受け取って処理できます。

Linuxでは、コマンド同士を|でつなぐ仕組みをパイプと呼びます。

別のコマンドと同時に使用する

awkコマンドは、|(パイプ)を使うことで、別のコマンドと同時に使用することができます。例えば、lsコマンドの結果をawkコマンドで加工して出力する場合は、以下のように実行します。

ls -la | awk '{ print $1, $9 }'

上記の例では、ls -laコマンドの権限の部分とファイル名だけ出力するように加工しています。

別のコマンドと同時にawkコマンドを使う

awkコマンドの処理する条件の指定のやり方

awkコマンドは、処理する条件とファイル名を指定します。

ここでは、処理する条件をどのように記述するのかを解説します。

なお、ls -laの表示はファイル名に空白が含まれる場合などに列がずれることがあります。簡単な確認には便利ですが、厳密なファイル処理ではfindなど別の方法も検討しましょう。

パイプを理解すると、awkだけでなくLinuxコマンド全体の使い方が広がります。

【関連記事】Linuxの標準入力・標準出力・標準エラーとは?

パターンとアクションを理解する

awkの処理は、パターンアクションに分けて考えると理解しやすくなります。

awk 'パターン { アクション }' ファイル名

パターンは、どの行を処理するかを決める条件です。アクションは、条件に一致した行をどのように処理するかを指定します。

パターンを省略すると、すべての行が処理対象になります。アクションを省略すると、条件に一致した行全体が表示されます。

awk '/error/' application.log

このコマンドでは、errorを含む行が表示されます。アクションを省略しているため、暗黙的に行全体が出力されます。

文字列を含む行を表示する

特定の文字列を含む行を表示するときは、文字列をスラッシュで囲みます。

awk '/failed/ { print }' application.log

フィールドの値で条件を指定する

文字列だけでなく、数値の大小でも行を絞り込めます。

たとえば、scores.txtが次の内容だとします。

Sato 75
Suzuki 92
Tanaka 68
Yamada 88

点数が80以上の行だけを表示する場合は、次のように実行します。

awk '$2 >= 80 { print $1, $2 }' scores.txt

条件式では、==!=>>=<<=を使えます。複数条件は&&||で組み合わせます。

awk '$2 >= 70 && $2 < 90 { print $1, $2 }' scores.txt

この例では、70点以上90点未満の行だけが表示されます。

awkコマンドで合計や平均を計算する

awkは文字列の抽出だけでなく、数値の集計もできます。

複数行の値を足し合わせるときは変数を使い、最後に結果を表示するときはENDを使います。

数値の合計を求める

先ほどのscores.txtの2列目を合計する場合は、次のように実行します。

awk '{ total += $2 } END { print total }' scores.txt

total += $2は、現在のtotalに2列目の値を加える処理です。awkがすべての行を読み終えた後、ENDの中にあるprint totalが実行されます。

分かりやすい表示にしたい場合は、文字列を追加します。

awk '{ total += $2 } END { print "合計:", total }' scores.txt

平均を求める

平均は、合計を行数で割れば求められます。

awk '{ total += $2 } END { print "平均:", total / NR }' scores.txt

空のファイルではNRが0になるため、スクリプトへ組み込む場合はデータの有無も確認しましょう。

awkコマンドでよく使うオプション

初心者のうちは、次の3つを覚えておけば十分です。

オプション 説明 使用例
-F 入力の区切り文字を指定する awk -F':' '{ print $1 }' /etc/passwd
-v awkへ変数を渡す awk -v min=80 '$2 >= min { print }' scores.txt
-f 処理を外部ファイルから読み込む awk -f script.awk file.txt

awkには複数の実装があり、追加オプションは環境によって異なります。まずは、区切り文字の指定、変数の受け渡し、外部ファイルの読み込みから覚えましょう。

-vでしきい値を渡すと、条件だけを簡単に変更できます。

awk -v min=80 '$2 >= min { print $1, $2 }' scores.txt

処理が1行で読めないほど長くなったら、-fで別ファイルへ分けた方が安全です。

awkコマンドを使うときの注意点

awkは便利ですが、どのようなデータでも万能に処理できるわけではありません。

最後に、初心者がつまずきやすい点を確認しておきましょう。

シングルクォートで処理を囲む

awkの処理は、基本的にシングルクォートで囲みます。ダブルクォートでは、シェルが$1を先に展開することがあるためです。

awk '{ print $1 }' file.txt

区切り文字を思い込まない

見た目では空白でも、実際にはタブで区切られている場合があります。結果がずれたら、元データの区切り文字を確認しましょう。

複雑になりすぎたら別の方法を選ぶ

短い抽出や集計ならawkが便利です。

しかし、引用符を含むCSV、複雑な日付処理、大規模なデータ変換などは、Pythonなどを使った方が読みやすく安全な場合があります。

エンジニア歴10年の中で感じるのは、コマンドを使えること以上に、どこまでをawkで処理し、どこから別の道具へ切り替えるか判断できることが大切だという点です。

まずは1列を抜き出すところから始め、必要に応じて条件や集計を追加していきましょう。

まとめ

今回はawkコマンドの使い方について解説しました。

awkは、テキストをフィールドに分割し、必要な列の抽出、条件に一致する行の表示、合計や平均の計算ができるコマンドです。

最初はawk '{ print $2 }' file.txtを試し、慣れたら-Fやパイプ、条件式へ進みましょう。

Linuxコマンドは、実際に入力して結果を確認することで身につきます。

【関連記事】Linuxでよく使うコマンド40個を一覧で確認する

さらにLinuxのコマンドの学習をしたい人に向けて、InfraAcademyというインフラ学習サービスのご紹介です。

「Linuxの実践的な内容を学習したい」 「コマンドを打ちながらLinuxを学習したい」

そのようなご要望にお応えして、Linuxやネットワークが学習できるサイト「InfraAcademy」をリリースしました!

入門から中級まで初心者でもわかりやすく学習を進めることができます。

講座 学習内容
Linux入門講座1 ディレクトリ、相対パス、絶対パス
Linux入門講座2 ファイルの作成、コピー、移動、削除
Linux入門講座3 ファイルのアクセス権限
Linux入門講座4 vimを使ったファイル編集
Linux入門講座5 ユーザーとグループ
Linux入門講座6 Linuxのネットワーク

↓InfraAcademyの講座の一部です。

上記以外にも、DNSサーバーの構築方法や、Dockerの設定方法などさまざまな講座があります。

インフラエンジニアに必要な知識が学習できます。

InfraAcademyで学習を始める

参考:Linuxのコマンド練習におすすめのInfraAcademy

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

InfraAcademy運営 / エンジニア

エンジニア歴10年。Linux、ネットワーク、クラウドを中心に、実務で役立つインフラ技術を初心者にもわかりやすく解説しています。

X: @ryu63614894

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る