Excel vs. AWK!? 基礎の知識は長く役に立つ!

シェル上でちょっと気の利いたことができる気軽なツール

ネットワーク上のリソース活用がサービスにとってもはや当然のものとなり、開発・運用を問わず、エンジニアはこれまで以上にサーバに対する作業が必要になります。今あらためて、Unix/Linuxの基礎知識が求められているのです。AWKをご存じでない方には、シェルコマンドに習熟したサーバ管理現場でログ解析によく使われるこのツールを、ぜひとも身につけて業務に役立てていただきたいと思います。

と、いきなり大上段に構えましたが、AWK自体はそんな仰々しいものではなく、日常のちょっとした作業で役立つ、気軽なシェルコマンド&スクリプト言語です。ここではそういった簡単な例をご紹介しましょう。

プログラムリストの先頭に行番号をふる作業

たとえば、次のようなプログラムを書いたファイル「samplecode」があったとします。

リスト1 samplecode
{
  for (i=1; i<=n; i++) {
    printf("%s-" $i)
  }
  printf ""
}

このプログラムリストの行頭に、3桁の行番号をふりたい場合を考えてみます(たとえば1行目なら「001: {⁠⁠。やり方はいろいろあるでしょうが、ここではExcelでやってみましょう。

Excelでの手順

  • (1)samplecodeのテキストをコピーして、ExcelのB列にペースト
  • (2)ExcelのA1に「1⁠⁠、A2に「2」を入力。この2つのセルを選択し、オートフィル機能を使って連番を入力図1
  • (3)C1に「=CONCATENATE(TEXT(A1, "[<=999]000: "), B1)」を入力して、A1とB1を書式付きで結合
  • (4)C1をC2以降にコピペ
  • (5)C列をテキストファイルにコピペして保存図2
図1 オートフィル機能で連番をふる
図1 オートフィル機能で連番をふる
図2 目的のテキスト完成
図2 目的のテキスト完成

筆者が考え得る限りの最短手順です。行数が多い場合は、⁠2)の手順でExcelの「連続データの作成」機能を使うとよいでしょう(このへんのExcelのコツは弊社刊『たった1日で即戦力になるExcelの教科書』に載っています⁠⁠。

さてそれでは、AWKを使った場合はどうでしょう。シェル上で次のように実行するだけです。

AWKでの手順

(1)gawk '{printf("%03d: %s\n", NR, $0)}' samplecode

結果の出力は次のとおりです。

001: {
002:   for (i=1; i<=n; i++) {
003:     printf("%s-" $i)
004:   }
005:   printf ""
006: }

テキストファイルに保存、というところまでやるにしても、先の1行にファイルへのリダイレクトを付けてあげるだけなので、やはり一発です。

printfの中身が多少呪文めいて見えますが、やっていることは単純です。

第1引数の「"%03d: %s\n"」が出力書式の設定で、%03dで「第2引数のNR(入力レコード番号)を10進数3桁・先頭0付き表示」し、そのあとに「: 」が表示されて、%s\nで「第3引数の$0(入力レコード全体)を文字列として表示して改行」するという指示になります。

サンプルを使って、変えて、気軽にプログラミング

このあたりの詳細は、弊社刊AWK実践入門を読めばすぐに理解できます。昔AWKを使ったことがある方でも、今ではExcelでの作業に慣れてしまって、なんでもExcelでやろうとしていませんか? 今やっているテキスト一括処理の中には、AWKでもっと簡単に行えるものがあるかもしれませんよ?

サンプルスクリプトが豊富に載っている本書で、AWKを楽しみながら自分の手になじんだツールにしてください。