1. ホーム
  2. 記事一覧
  3. Linuxのawkコマンド入門|初心者向け基本構文&実践例

2025.02.03

Linuxのawkコマンド入門|初心者向け基本構文&実践例

Linuxでの作業を効率化するうえで、テキスト処理は欠かせません。その中でも特に便利なツールが「awkコマンド」です。

この記事では、awkコマンドの基本的な使い方を解説します。

インフラエンジニアとして業務をする際、awkを使えるとコマンドの生成、ログ抽出の場面などで役立ちます。

ぜひ一緒に学んでいきましょう。

awkコマンドとは

awkコマンドは1977年からサポートされている、テキスト処理に特化したLinuxコマンドです。awkという名前は、開発者のAho、Weinberger、Kernighanの頭文字から取られていると言われています。

読み方は「オーク」です。

とほほのAWK入門

Linuxを使うことで、テキストベースで様々な操作を行うことができます。

次の記事では、エンジニアがなぜLinuxコマンドを習得するのかについて解説しています。

エンジニアがLinuxコマンドを習得する理由

また、基本的なLinuxコマンドに関しては以下の記事で紹介しています。

エンジニア初学者がとりあえず覚えておくべきLinuxコマンド

awkコマンドでできること

awkコマンドを使用することで、主に以下のような処理を行うことができます。

  • ログファイルからエラーなど特定の情報を抽出する
  • CSVファイルの特定の列だけを抽出する
  • AWS CLIコマンドと組み合わせて内容を変換する

次のセクションから、上記3つの具体的な実践方法を解説します。

基本的な使い方

awkコマンドの処理の流れ

awkコマンドは基本的に、以下の流れで動作します。

  1. 入力テキストを1行ずつ読み込む
  2. 各行を「フィールド」と呼ばれる列に分割
  3. パターンにマッチするか確認
  4. マッチした場合、対応するアクションを実行

awkの基本構文

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

「オプション」では、-F-vなどのオプションを指定します。

「パターン」は条件式で、awkコマンドはこのパターンに一致する行を処理します。

「アクション」では、パターンで指定した条件に一致した行に対して実行する操作を指定します。

「ファイル名」で、処理対象のテキストファイルを指定することができます。

フィールドの参照方法

フィールドとは、それぞれの行を列に分割したものです。

awkコマンドでフィールドを参照するには$nと指定します。nには0からの数値が入り、この数値で何列目を参照したいかを決定します。

  • $0行全体
  • $11番目のフィールド
  • $22番目のフィールド
  • $33番目のフィールド

フィールドを参照してみよう

実際にフィールドを参照し、どのような挙動になるか確認します。

次のコマンドを実行し、テキストデータを作成します。

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にはさらに多くの組み込み関数やオプションがありますので、実際にコマンドを試しながら、より便利な使い方を探してみてください。

参考記事

とほほのAWK入門

エンジニアがLinuxコマンドを習得する理由

エンジニア初学者がとりあえず覚えておくべきLinuxコマンド

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事