Linux
 Computer >> コンピューター >  >> スマートフォン >> Linux

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はシンプルな構文ながら、列の抽出、条件付きフィルタリング、他のコマンドとの連携など、テキスト処理における可能性は無限大です。まずは今回紹介した基本的なコマンドから試してみて、日々の作業に取り入れてみてください。慣れてくれば、ログ解析やデータ集計が格段に効率化されるはずです。

  1. SvnXでSubversionを始めよう!Macユーザー向けSVNクライアント活用ガイド

    開発者にとって、バージョン管理ソフトウェアはコードの変更履歴を追跡するための必須ツールです。特にチームでプロジェクトを進める場合、変更内容をリアルタイムに把握できることは非常に重要です。GITなどのサービスはオープンソース開発を中心に広く普及していますが、Subversion(SVN)のような代替手段を選べば、より細かいコントロールが可能になります。 SVNクライアントは多数存在しますが、Macユーザーに人気のある選択肢が「SvnX」です。このシンプルで無料のオープンソースMac用SVNクライアントは、10年以上前に登場して以来、数多くの新機能や改良が加えられてきました。この記事では、SvnX

  2. Parallelsを使ってMacにWindowsを導入する方法を徹底解説

    MacとWindowsの両方のプラットフォームを頻繁に使う方にとって、Mac上でWindows OSやアプリを利用できるのは非常に便利です。「MacはWindowsと相性が悪いのでは?」と思うかもしれませんが、実は専用アプリを使えば誰でも簡単に実現できます。MacでWindowsを導入する方法として最も人気があるのが、仮想化ソフト「Parallels Desktop」を利用する方法です。 Parallelsを使ってMacにWindowsを導入する手順 Macユーザーの中には、仕事などで必要なWindowsアプリを同じ画面で動かしたいと考えている方も多いでしょう。Parallelsを使えば、そ