##はじめに
仕事でログファイルを整形することがあり、
sed、awkコマンドなどを初めて使用し、
試行錯誤したので忘れないようにまとめます。
##やりたいこと
以下のfileA~Cの3ファイルから必要な情報を抽出し加工、
最終形のファイルを作成します。
20190501,comic,naruto,300円,100冊
20190201,novel,hibana,800円,20冊
20190301,magazine,rurubu,600円,25冊
20190401,picture,neko,800円,30冊
20190301,comic,bleach,400円,40冊
20190202,novel,gekijyou,800円,60冊
20190302,magazine,cancan,600円,30冊
20190402,picture,dog,800円,15冊
20190401,comic,onepiece,500円,80冊
20190103,novel,natunoniwa,800円,10冊
20190104,magazine,joker,600円,12冊
20190105,picture,rabit,800円,25冊
2019-03-01,bleach,400
2019-04-01,onepiece,500
2019-05-01,naruto,300
##1、comicの行を抽出
まずはgrepコマンドを使用して各ファイルからcomicの行を検索して出力します。
###grep
ディレクトリ・ファイルの文字列を正規表現で検索して表示するコマンド
書き方
grep オプション 正規表現 ファイル名
実行コマンド
grep -w "comic" file* > grep_result
fileA:20190501,comic,naruto,300円,100冊
fileB:20190301,comic,bleach,400円,40冊
fileC:20190401,comic,onepiece,500円,80冊
各ファイルからcomicを含む行を抽出して出力出来ました。
##2、必要な項目を抽出(日付、タイトル、値段)
次にcutコマンドを使用して日付、タイトル、値段を取り出します。
###cut
指定した部分を切り出すコマンド
書き方
cut オプション 処理内容 ファイル名
実行コマンド
cut -d "," -f 1,3,4 grep_result > cut_result
-dのオプションでは区切り文字を指定できます。(今回はカンマを指定しました。)
-fのオプションで必要な項目数を指定できます。
なのでこのコマンドでは-dで指定したカンマで区切られた-fで指定した1,3,4番目を取り出してねというコマンドになります。
fileA:20190501,naruto,300円
fileB:20190301,bleach,400円
fileC:20190401,onepiece,500円
必要項目が取り出せました。
##3、ファイル名削除、値段の円を削除
sedコマンドを使用してfileA:と書いてある部分と値段の円が不要なので取ります。
###sed
指定ファイルの中身を置換したり、抽出したりするコマンド
書き方
sed オプション 処理内容 ファイル名
実行コマンド
sed -e 's/円//g' -e 's/file[A-Z]://g' cut_result > sed_result
-e 条件式で指定した条件式で変換処理を行う事が出来ます。
条件式は次のように書くことが出来ます。
s/置換前文字列/置換後文字列/g
今回は円の部分とfileA:~fileC:の部分を空に置換しています。
20190501,naruto,300
20190301,bleach,400
20190401,onepiece,500
ちゃんと置換出来ています。
##4、日付をハイフン区切り
awkコマンドを使用して日付をハイフン区切りに加工します。
###awk
1つ以上のスペースで区切られた複数列のテキストデータを色々処理するコマンド。
書き方
awk オプション 処理内容
実行コマンド
awk -F ',' 'BEGIN {OFS=","} {print substr($1, 1, 4) "-" substr($1, 5, 2) "-" substr($1, 7, 2) , $2, $3}' sed_result > awk_result
-Fで区切り文字を指定します。(これで指定した区切り文字を目印に加工します。今回はカンマ)
awkの出力は何も指定しないとスペースで区切られた結果が出力されます。
今回はカンマで区切りたいのでBEGIN {OFS=","}
でカンマを指定します。
print $フィールドでそのフィールドを取り出せます。
今回はハイフンを途中に入れたいのでsubstr関数で1番目のフィールドから4桁、2桁、2桁を取り出して間にハイフンを入れています。
2019-05-01,naruto,300
2019-03-01,bleach,400
2019-04-01,onepiece,500
##5、日付順にソート
最後にsortコマンドで日付順に並び替えます。
###sort
ファイルの中身の並び順をソートするコマンド
書き方
sort オプション ファイル名
実行コマンド
sort -k 1 -t "," awk_result > result
-tオプションで区切り文字、-kで区切った何番目のフィールドでソートするか指定します。
今回はカンマで区切った1番目のフィールド(日付)でソートしました。
2019-03-01,bleach,400
2019-04-01,onepiece,500
2019-05-01,naruto,300
完成!
##おわりに
オプションも多く、どのコマンドが目的の達成に適しているのかを把握することに苦労しました。
もっとスマートに自在に操れるよう練習あるのみです。
また、正規表現の知識が乏しく仕事では時間がかかってしまったのでその辺りも勉強の必要があると痛感しました。