
Linuxでの作業を効率化するうえで、テキスト処理は欠かせません。その中でも特に便利なツールが「awkコマンド」です。
この記事では、awkコマンドの基本的な使い方を解説します。
インフラエンジニアとして業務をする際、awkを使えるとコマンドの生成、ログ抽出の場面などで役立ちます。
ぜひ一緒に学んでいきましょう。
awkコマンドとは
awkコマンドは1977年からサポートされている、テキスト処理に特化したLinuxコマンドです。awkという名前は、開発者のAho、Weinberger、Kernighanの頭文字から取られていると言われています。
読み方は「オーク」です。
Linuxを使うことで、テキストベースで様々な操作を行うことができます。
次の記事では、エンジニアがなぜLinuxコマンドを習得するのかについて解説しています。
また、基本的なLinuxコマンドに関しては以下の記事で紹介しています。
エンジニア初学者がとりあえず覚えておくべきLinuxコマンド
awkコマンドでできること
awkコマンドを使用することで、主に以下のような処理を行うことができます。
- ログファイルからエラーなど特定の情報を抽出する
- CSVファイルの特定の列だけを抽出する
- AWS CLIコマンドと組み合わせて内容を変換する
次のセクションから、上記3つの具体的な実践方法を解説します。
基本的な使い方
awkコマンドの処理の流れ
awkコマンドは基本的に、以下の流れで動作します。
- 入力テキストを1行ずつ読み込む
- 各行を「フィールド」と呼ばれる列に分割
- パターンにマッチするか確認
- マッチした場合、対応するアクションを実行
awkの基本構文
awk [オプション] 'パターン { アクション }' ファイル名
「オプション」では、-F
、-v
などのオプションを指定します。
「パターン」は条件式で、awkコマンドはこのパターンに一致する行を処理します。
「アクション」では、パターンで指定した条件に一致した行に対して実行する操作を指定します。
「ファイル名」で、処理対象のテキストファイルを指定することができます。
フィールドの参照方法
フィールドとは、それぞれの行を列に分割したものです。
awkコマンドでフィールドを参照するには$n
と指定します。nには0からの数値が入り、この数値で何列目を参照したいかを決定します。
$0
行全体$1
1番目のフィールド$2
2番目のフィールド$3
3番目のフィールド
フィールドを参照してみよう
実際にフィールドを参照し、どのような挙動になるか確認します。
次のコマンドを実行し、テキストデータを作成します。
cat <<EOF > system_logs.txt
2025-01-22 12:00:01 INFO User john logged in from 192.168.1.100
2025-01-22 12:01:15 ERROR Failed to connect to database
2025-01-22 12:03:45 WARN Memory usage high: 85%
2025-01-22 12:05:23 INFO User alice uploaded file report.pdf
2025-01-22 12:07:10 ERROR File not found: /var/www/html/index.html
2025-01-22 12:10:55 INFO User bob logged out
EOF
system_logs.txt
が作成できているか確認します。
ls | grep system
system_logs.txt
$0で行全体を出力する
$0
を使用すると、ファイルの全体を出力します。
awk '{ print $0 }' system_logs.txt
2025-01-22 12:00:01 INFO User john logged in from 192.168.1.100
2025-01-22 12:01:15 ERROR Failed to connect to database
2025-01-22 12:03:45 WARN Memory usage high: 85%
2025-01-22 12:05:23 INFO User alice uploaded file report.pdf
2025-01-22 12:07:10 ERROR File not found: /var/www/html/index.html
2025-01-22 12:10:55 INFO User bob logged out
$1で1列目のみ出力する
$1では、ファイルの1列目を出力します。
awk '{ print $1 }' system_logs.txt
2025-01-22
2025-01-22
2025-01-22
2025-01-22
2025-01-22
2025-01-22
$2で2列目を出力する
同じように、$2
を指定して2列目を出力します。
awk '{ print $2 }' system_logs.txt
12:00:01
12:01:15
12:03:45
12:05:23
12:07:10
12:10:55
このように、awkコマンドでは$n
を指定することで、指定した列のみを抽出して出力することができます。
複数の列を指定して出力する
カンマ区切りにすることで、複数の列を出力することもできます。
awk '{ print$1, $3 }' system_logs.txt
2025-01-22 INFO
2025-01-22 ERROR
2025-01-22 WARN
2025-01-22 INFO
2025-01-22 ERROR
2025-01-22 INFO
カンマを入れない場合、列の間のスペースがなくなってしまうので注意が必要です。
awk '{ print$1 $3 }' system_logs.txt
2025-01-22INFO
2025-01-22ERROR
2025-01-22WARN
2025-01-22INFO
2025-01-22ERROR
2025-01-22INFO
ユーザー関連ログのみを抽出
ファイル内の「ERROR」という文字列と一致するログを抽出します。
システムのエラーを調査するときに役立ちます。
awk '/ERROR/ { print $0 }' system_logs.txt
2025-01-22 12:01:15 ERROR Failed to connect to database
2025-01-22 12:07:10 ERROR File not found: /var/www/html/index.html
条件に合う行を抽出する
条件式にしてコマンドを実行することもできます。
先ほどのERRORという文字列を例にします。
awk '$3 == "ERROR" { print $0 }' system_logs.txt
次のように、ある特定の時間帯に絞ってデータを出力することも可能です。
awk '$2 >= "12:00:00" && $2 <= "12:05:00" { print $0 }' system_logs.txt
コマンドのマニュアルをターミナルで参照する
ターミナル上では、次のコマンドでawkコマンドのマニュアルを確認できます。
man awk
Linuxにはman
コマンドがあり、man 調べたいコマンド名
とすることでコマンドの使い方、オプションなど詳細を確認できるため、使い方をすぐに調べたい方はmanコマンドを使いましょう。
awkの便利な組み込み変数
awkコマンドには、組み込み変数と呼ばれる変数があります。
この変数を使うことで、行番号や列数などを出力結果に反映できます。
NR(行番号を表示する)
NR
(Number of Records)は現在の行番号を表します。ファイルのどの行を処理しているかを確認できます。
awk '{ print "Line", NR ":", $0 }' system_logs.txt
Line 1: 2025-01-22 12:00:01 INFO User john logged in from 192.168.1.100
Line 2: 2025-01-22 12:01:15 ERROR Failed to connect to database
Line 3: 2025-01-22 12:03:45 WARN Memory usage high: 85%
Line 4: 2025-01-22 12:05:23 INFO User alice uploaded file report.pdf
Line 5: 2025-01-22 12:07:10 ERROR File not found: /var/www/html/index.html
Line 6: 2025-01-22 12:10:55 INFO User bob logged out
NF(各行の列数を表示する)
NF
(Number of Fields)は現在処理している行のフィールド数(列数)を表します。
次の例では、各行に何列のフィールドがあるかを表示します。
awk '{ print "Fields in line", NR ":", NF }' system_logs.txt
Fields in line 1: 9
Fields in line 2: 8
Fields in line 3: 7
Fields in line 4: 8
Fields in line 5: 7
Fields in line 6: 7
FS(データをどの区切り文字で分割するかを指定する)
FS
(Field Separator)は、指定した文字や正規表現に基づいて各行をフィールド(列)に分割します。
デフォルトではスペースやタブが区切り文字ですが、カンマや特定の文字列を指定することも可能です。
以下は、ログレベルの文字列を区切り文字として指定した場合の例です。
awk 'BEGIN { FS = "INFO|ERROR|WARN" } { print $1 }' system_logs.txt
2025-01-22 12:00:01
2025-01-22 12:01:15
2025-01-22 12:03:45
2025-01-22 12:05:23
2025-01-22 12:07:10
2025-01-22 12:10:55
上記の例ではBEGINブロックを使用し、区切り文字を指定しています。もっとシンプルに区切り文字を指定するには、-F
オプションを使用します。
awk -F 'INFO|ERROR|WARN' '{ print $1 }' system_logs.txt
2025-01-22 12:00:01
2025-01-22 12:01:15
2025-01-22 12:03:45
2025-01-22 12:05:23
2025-01-22 12:07:10
2025-01-22 12:10:55
FSで指定しても、-Fオプションを指定しても出力結果は同じになります。
OFS
OFS
(Output Field Separator)は、データを出力する際のフィールド間の区切り文字を設定する変数です。
awkのデフォルトの出力ではスペースが設定されていますが、これをカンマやタブなどに変更することができます。
awk 'BEGIN { OFS = "," } { print $1, $3, $4 }' system_logs.txt
2025-01-22,INFO,User
2025-01-22,ERROR,Failed
2025-01-22,WARN,Memory
2025-01-22,INFO,User
2025-01-22,ERROR,File
2025-01-22,INFO,User
こちらもBEGINブロックを使用せずに、-v
オプションに置き換えることができます。
awk -v OFS="," '{ print $1, $2, $3 }' system_logs.txt
2025-01-22,12:00:01,INFO
2025-01-22,12:01:15,ERROR
2025-01-22,12:03:45,WARN
2025-01-22,12:05:23,INFO
2025-01-22,12:07:10,ERROR
2025-01-22,12:10:55,INFO
AWS CLIコマンドとの組み合わせ
AWS CLIとawkを組み合わせて、csvファイルを作成したり情報を取得することができます。
特にcsvファイルにすると、スプレッドシートやエクセルに情報を集約することができ作業効率を上げることができます。
S3バケットの情報を取得する
次のコマンドは、S3の情報を取得し、csv形式に変換してファイルに保存します。
この場合、 「作成日時」「作成時刻」「バケット名」 の3つの情報を取得することが可能です。
aws s3 ls | awk -v OFS=',' '{print $1,$2,$3}' > s3.csv
ヘッダーをつけてcsvファイルを作成する
次に紹介するコマンドでは、csvファイルの1行目にヘッダー情報を付与し、2行目から取得した情報を保存します。
こうすることで、スプレッドシートなどにインポートした際に、どの情報なのか一目でわかるため便利です。
今回の例ではELBの情報を取得しましたが、BEGINブロックの内容を適宜変更すればどの情報を取得するときでもヘッダーを付与することが可能です。
aws elbv2 describe-load-balancers --query 'LoadBalancers[*].[LoadBalancerName,LoadBalancerArn,Type,DNSName,VpcId]' --output text | awk 'BEGIN {print "Name,ARN,Type,DNSName,VPCId"} {print $1","$2","$3","$4","$5}' > alb.csv
まとめ
この記事では、Linuxのテキスト処理に便利なawkコマンドの基本を解説しました。
awkは、ログの解析やデータの抽出、AWS CLIとの組み合わせによる効率的なデータ管理など、さまざまな場面で活用できます。
基本構文やフィールドの参照、条件によるデータ抽出、組み込み変数の使い方を学ぶことで、テキスト処理をより柔軟に行えます。
awkにはさらに多くの組み込み関数やオプションがありますので、実際にコマンドを試しながら、より便利な使い方を探してみてください。
参考記事
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

関連記事

2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア

2025.02.10
Rocky Linuxとは?CentOSとの違いやインストール方法を解説
CentOSとはRHELと同じく企業のサーバ構築を主目的とし、RHELの完全互換を目指して作られたLinuxディストリビューションです。Rocky Linuxの誕生やCentOSとの関係性について解説を行った上で、実際に仮想マシンへのインストールを解説します。
- Linux

2023.04.07
【Linux】仮想化ソフトUTMを用いてM1 MacにCentOS7を導入する方法
今回はCentOS(Linux)と仮想化ソフト「UTM」を用いてM1 Mac上に仮想マシンの構築を行います。
- Linux

2024.03.11
システムエンジニア・ネットワークエンジニア初心者がマスターすべきLinuxコマンド
システムエンジニアやネットワークエンジニアにとって、Linuxコマンドは単なるスキルではなく、日々の業務を効率化する必須ツールです。サーバーのセットアップからトラブルシューティング、定期的なメンテナンスまで、幅広い場面で活用できます。
- Linux
- エンジニア