はじめに
最近仕事で圧縮して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で扱う方法をご紹介します。
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{
}
さいごに
まだ理解が追いついていない部分があるので、分かり次第追記します

コメント
コメントを投稿