awkってなんだ

はじめに

最近仕事で圧縮して15GB程度の大きなLogファイルを扱う場面があります。

各カラム中にあるカンマを置換しなければいけないのですが、その際のノウハウをおいておこうと思います。


対象読者

LINUX、UNIXのコマンドが使える方

大きなログファイル、.gz形式などを開いて再圧縮する必要がある方など


awkを使う

awkとは

awkとはプログラミング言語の一つであり、テキストファイルやCSVなどのデータ処理を念頭になおいたし用となっている。(Wikipediaより)


基本的構文

awkコマンドは複数行に渡って記述する方法と、ワンライナーと言って一行で表す方法があります。

複数行の記述方法

BEGIN{
#最初に1回に実行する処理
#変数の宣言などもここで行う
}


条件1{
#条件に合致する行に実行する処理

}

条件2{
#条件に合致する行に実行する処理

}

END{
#最後に1回に実行する処理
print "Process finished"
}

実行するには以下のように「-f」オプションを付けます。

awk -f ./[awkスクリプトファイル名].awk [入力ファイルのパス]

コメント

コメントを記述する際は#を使用します。
BEGIN{
#コメントのサンプルです

}

#○○の処理
NR == 6 {
 
}

END{
#コメントのサンプルです

}

ワンライナーの記述方法

awk '{print $0}' log.txt 
cat log.txt | awk '{print $0}' > gzip exportFileName.gz

よく使う組み込み変数

組み込み変数とは、awk内ですでに予約されている変数です。

レコードすべてを指します。
$0

レコード中のカラムを指します。$1で1つ目のカラムを指します。
$1,$2,$3,,,$n

レコード内の区切り文字を指します。行末に付与されている文字で通常は改行(¥n)です。
RS

フィールド内の区切り文字を指します。カラム間の区切り文字で通常はスペースです。
FS

入力中のレコード数です。
NR

圧縮されたログを扱う

awkの特性上ログを扱う場面も多いかと思います。
Syslogなどの保存は容量も考慮して、.gz形式などで保存されていますが、それをawkで扱う方法をご紹介します。

圧縮ファイルを開く

この場合でのawk '$0'はすべての行を出力になります。

gunzip -c [入力ファイル].gz | awk '$0' |

圧縮ファイルを処理して、圧縮ファイルにする

gunzip -c [入力ファイル].gz | awk '$0' | gzip > compressed.gz

圧縮ファイルを複数の圧縮ファイルに分割する

自分は1行で記述するメリットがあまりなかったので、スクリプト形式にしています。
この例では、カラム数が6行の場合と7行の場合で別のファイルに出力しています。また、セパレータはカンマを指定しました。
BEGIN{
#セパレータにカンマを設定します
 FS=","
}

NR == 6 {
 print $0 | gzip > [path]/[file].gz
}

NR == 7 {
 print  $0 | gzip > [path]/[file].gz
}

END{
}

さいごに

まだ理解が追いついていない部分があるので、分かり次第追記します

コメント