awk入門ガイド:Linuxコマンドラインでテキスト処理をマスターしよう
awk、sed、grepは、LinuxやUNIXのコマンドラインで最も強力なテキスト処理ツールの3つです。本記事では、awkの基本的な使い方から実用的なワンライナー(1行コマンド)まで、初心者にもわかりやすく解説します。
awkとは何か
AWKは、ファイルやデータストリーム内のテキストベースのデータを処理するために設計されたプログラミング言語です。1970年代にベル研究所で開発されました。歴史は古いものの、その性能は現在でも非常に強力かつ効率的で、テキスト処理において今なお第一線で活躍しています。
準備:練習用ファイルを作成する
まずはawkの基本から始めましょう。この演習ではダミーファイルを使用します。システムのログファイルなど、任意のテキストファイルでも構いません。ここでは例として、システム監視ツール「Dstat」の出力を使用します。以下のようなタブ区切りのデータです。
このようなカンマやタブで区切られたデータは、awkが最も得意とする形式です。同様のデータを作成するか、上記の出力を「test.txt」という名前のファイルにコピー&ペーストしてください。その後、Linuxマシンでターミナルウィンドウを起動します。ほぼすべてのLinuxディストリビューションにはawkが標準搭載されていますが、もしインストールされていない場合は事前にインストールしておきましょう。
基本操作:ファイル全体を表示する
test.txtが保存されているディレクトリで、以下のコマンドを実行します。
# awk '{print}' test.txt
これにより、テキストファイルの全内容が出力されます。ただし、これだけではあまり面白くありませんね。
特定の列だけを抽出する
次に、特定の列だけを選んで表示する方法を見てみましょう。以下のコマンドを実行します。
# awk '{print $1}' test.txt
これは「1列目だけを出力せよ」という指示です。awkは自動的にファイルがタブ区切りであることを判別し、1列目のみを出力してくれます。出力は次のようになります。
---total-cpu-usage--- usr 5 13 8 0 1 1 1 0 1 1
同じ要領で、任意の列を抽出できます。3列目を表示したい場合は、コマンドを次のように変更します。
# awk '{print $3}' test.txt
複数の列を同時に表示する
awkでは複数の列を一度に出力することも可能です。1列目・3列目・7列目を表示したい場合は、列番号をカンマで区切って指定します。
# awk '{print $1, $3, $7}' test.txt
実行結果は以下のようになります。
---total-cpu-usage--- -net/total- usr idl read 5 93 154k 13 87 0 8 92 0 0 99 0 1 97 0 1 98 0 1 99 0 0 99 0 1 99 0 1 100 0
区切り文字を指定する(-Fオプション)
/etc/passwdのように、データがスペースやタブではなくコロンで区切られているファイルの場合、awkは自動的に認識できません。そんなときは、-Fオプションで正しい区切り文字を指定します。以下のコマンドで、ファイルの1列目(ユーザー名)を出力できます。
# awk -F':' '{print $1}' /etc/passwd
このコマンドを実行すると、システム上の全ユーザーのユーザー名一覧が取得できます。
apple mango banana watermelon kiwi orange
もちろん、コロン以外の任意の区切り文字にも対応できます。
応用編:アクセスログの解析
awkはログファイルの解析にも威力を発揮します。たとえば、Webサーバーのアクセスログから、アクセスされたIPアドレスとURLの組み合わせを抽出したい場合は、次のコマンドを使用します。
# awk '$9 == 200 { print $1, $7}' access.log
この例では、HTTPステータスコードが200(正常なアクセス)のレコードだけを対象に、IPアドレス($1)とURLパス($7)を出力しています。
199.63.142.250 /2008/10/my-5-favourite-hangouts/ 220.180.94.221 /2009/02/querious-a-mysql-client-for-the-mac/ 67.190.114.46 /2009/05/ 173.234.43.110 /2009/01/bicycle-rental/ 173.234.38.110 /wp-comments-post.php
このような解析を行うことで、特定のユーザーが頻繁にサイトへアクセスしているかどうか(情報を不正に収集している可能性など)を把握できます。
さらに便利に:sortやuniqとの組み合わせ
awkの出力は他のコマンドと組み合わせることで、さらに強力になります。たとえば、「特定のIPアドレスが何回アクセスしたか」を知りたい場合は、sortやuniqとパイプで連結します。
# awk '$9 == 200 { print $1}' access.log | sort | uniq -c | sort -nr
このコマンドは、IPアドレスごとのアクセス回数を多い順に集計して表示します。
46 122.248.161.1 35 122.248.161.2 26 65.202.21.10 24 67.195.111.46 19 144.36.231.111 18 59.183.121.71
まとめ
awkはシンプルな構文ながら、列の抽出、条件付きフィルタリング、他のコマンドとの連携など、テキスト処理における可能性は無限大です。まずは今回紹介した基本的なコマンドから試してみて、日々の作業に取り入れてみてください。慣れてくれば、ログ解析やデータ集計が格段に効率化されるはずです。
-
SvnXでSubversionを始めよう!Macユーザー向けSVNクライアント活用ガイド
開発者にとって、バージョン管理ソフトウェアはコードの変更履歴を追跡するための必須ツールです。特にチームでプロジェクトを進める場合、変更内容をリアルタイムに把握できることは非常に重要です。GITなどのサービスはオープンソース開発を中心に広く普及していますが、Subversion(SVN)のような代替手段を選べば、より細かいコントロールが可能になります。 SVNクライアントは多数存在しますが、Macユーザーに人気のある選択肢が「SvnX」です。このシンプルで無料のオープンソースMac用SVNクライアントは、10年以上前に登場して以来、数多くの新機能や改良が加えられてきました。この記事では、SvnX
-
Parallelsを使ってMacにWindowsを導入する方法を徹底解説
MacとWindowsの両方のプラットフォームを頻繁に使う方にとって、Mac上でWindows OSやアプリを利用できるのは非常に便利です。「MacはWindowsと相性が悪いのでは?」と思うかもしれませんが、実は専用アプリを使えば誰でも簡単に実現できます。MacでWindowsを導入する方法として最も人気があるのが、仮想化ソフト「Parallels Desktop」を利用する方法です。 Parallelsを使ってMacにWindowsを導入する手順 Macユーザーの中には、仕事などで必要なWindowsアプリを同じ画面で動かしたいと考えている方も多いでしょう。Parallelsを使えば、そ