awkを用いたテキスト抽出入門

文:Vincent Danen(TechRepublic) 翻訳校正:原井彰弘
2007-12-25 16:00:00
  • このエントリーをはてなブックマークに追加

 sedと同様に、awkもテキストの変換を行うために利用される。ただし、awkは汎用のテキスト変換ツールであると同時に、それ自身がプログラミング言語でもある。スクリプトを記述する際やコマンドラインから操作を行う際には、awkが特に役立つだろう。

 awkの強力さを説明するには、例を見ていただくのが一番分かりやすい。それでは、まず以下の例を見てみよう。

$ printf "line one\nline two\n" | awk ‘{print $2, $1}'

one line

two line

 上記の例では、行の2つの単語を入れ替えている。awkでは、空白文字で分割されている文字列は変数で操作することが可能である。変数は、1番目の文字列が$1に、2番目の文字列が$2に、というように割り当てられる。例では、変数の順番を指定して表示順を変更しているため、「line one」を受け取ると「one line」が出力されるのである。ここで注意すべき点は、print $2, $1ではなくてprint $2 $1と指定した場合は、2つのフィールドはonelineのように隣り合って出力されるということだ。

 awkを利用すると、特定のパターンを含む行の数をカウントすることも可能である。たとえば、以下のような記述ができる。

$ printf "line one\nline two\nline three" | awk ‘/line/ { ++x } END { print x }'

3

$ printf "line one\nline two\nline three" | awk ‘/t/ { ++x } END { print x }'

2

 awkはprintf文の出力を受け取り、1つ目の例では文字列lineを検索している。文字列lineが見つかると、その都度変数xの値がインクリメントされ、処理の最後にxの値が表示されるというしくみだ。1つ目の例では、lineは3つの行で見つかっている。一方、2つ目の例では文字列tは2つの行のみで見つかっている。

 より実用的な例をお見せしよう。badprogという名前のプログラムが、頻繁にシステム上で問題を発生させているとする。しかし、そのプログラムはどうしても動作させる必要があるのだ。さて、システムの負荷平均が4.00に達したときに、すべてのリソースを食い尽くしてしまわないようプログラムをkillし、再起動したいとする。

#!/bin/sh

if [ "`cat /proc/loadavg | awk ‘$1 > 4 {print $1}'`" ]; then

pid="`ps ax | grep badprog | grep -v grep | awk ‘{print $1}'`"

for x in ${pid}; do

kill -9 ${x}

done

/usr/bin/badprog &

fi

 お分かりのように、awkは2度利用されている。1度目は負荷平均が4.00より高い場合にその値を出力する目的で、2度目はpsコマンドの出力から最初のカラムを取得し、pidを入手する目的で利用されているのだ。スクリプトは、その後ループを用いてマッチしたpidすべてをkillし、最後にプログラムをバックグラウンドで再起動している。

 awkは非常に強力であり、多くのことを実行できる。上記の例ではその強力さの一部をお見せしたが、ぜひさらにawkの世界を探求して、awkでできることすべてを確かめて欲しい。それだけの価値はある。

awkについてさらに知りたい方は

  • 新着記事
  • 特集
  • ブログ
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]