はじめに
最近仕事で圧縮して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{ }
さいごに
まだ理解が追いついていない部分があるので、分かり次第追記します
コメント
コメントを投稿