S3に置いてあるテキストファイルをheadして一部だけ表示する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

S3は非常に便利なオブジェクトストレージのため、様々なファイルを気軽に放り込んでおくことが可能です。また、Amazon RedshiftAmazon Machine Learningといったデータを扱うAWSプロダクトとやりとりする際のデータの配置場所としても利用されています。

たとえば、Redshiftに保存されたデータをS3に吐き出す(Unloadする)と、そのファイルサイズが数十GBに達するということはザラにあります。そういったファイルの内容を確認する時にいちいちローカルにダウンロードするとそれだけで数時間かかってしまいます。それに、数十GBものファイルをエディタでそのまま開くようなことはしたらエディタが死亡してしまうのは、経験者ならお分かりかと思います。

そういった巨大ファイルの内容を確認する時に利用されるのがheadtailといったファイルの一部だけを取り出すユーティリティですね。ローカルのファイルであれば単純に

$ head sample.csv

とするだけでファイルの先頭10行を取り出すことが可能です。 *1

Amazon S3に配置されたオブジェクトにも同じように気軽に内容確認ができると嬉しいですよね。

そこで輝くパイプ処理

以前に弊社ブログで、aws s3コマンドを標準入出力を利用してパイプで処理を続ける方法をご紹介しました。

この方法を使えば、実は単純にheadを実現可能です。 Amazon Machine Learningのチュートリアル用のサンプルCSVを利用して、動作を検証してみます。

$ aws s3 cp s3://aml-sample-data/banking.csv - 2>/dev/null | head
age,job,marital,education,default,housing,loan,contact,month,day_of_week,duration,campaign,pdays,previous,poutcome,emp_var_rate,cons_price_idx,cons_conf_idx,euribor3m,nr_employed,y
44,blue-collar,married,basic.4y,unknown,yes,no,cellular,aug,thu,210,1,999,0,nonexistent,1.4,93.444,-36.1,4.963,5228.1,0
53,technician,married,unknown,no,no,no,cellular,nov,fri,138,1,999,0,nonexistent,-0.1,93.2,-42,4.021,5195.8,0
28,management,single,university.degree,no,yes,no,cellular,jun,thu,339,3,6,2,success,-1.7,94.055,-39.8,0.729,4991.6,1
39,services,married,high.school,no,no,no,cellular,apr,fri,185,2,999,0,nonexistent,-1.8,93.075,-47.1,1.405,5099.1,0
55,retired,married,basic.4y,no,yes,no,cellular,aug,fri,137,1,3,1,success,-2.9,92.201,-31.4,0.869,5076.2,1
30,management,divorced,basic.4y,no,yes,no,cellular,jul,tue,68,8,999,0,nonexistent,1.4,93.918,-42.7,4.961,5228.1,0
37,blue-collar,married,basic.4y,no,yes,no,cellular,may,thu,204,1,999,0,nonexistent,-1.8,92.893,-46.2,1.327,5099.1,0
39,blue-collar,divorced,basic.9y,no,yes,no,cellular,may,fri,191,1,999,0,nonexistent,-1.8,92.893,-46.2,1.313,5099.1,0
36,admin.,married,university.degree,no,no,no,cellular,jun,mon,174,1,3,1,success,-2.9,92.963,-40.8,1.266,5076.2,1

無事、10行の内容が確認できました。コマンド内で2>/dev/nullにしているのは、終了時にBroken Pipeエラーが出力されるのでそれを抑制するためです。エラーを残しておきたい場合には適宜ログファイルにリダイレクトさせましょう。

また、上述のチュートリアルデータでは発生していませんが、ファイルサイズが巨大になると、headで出力されたあとも裏でcpが走り続けます。これは、ファイルサイズが巨大なオブジェクトをGetObjectしようとした際に、AWS CLIが自動的にMultipart Uploadを利用するようにしているためだと思われます。そのため、別のスレッドでのUploadを止めるために、headの結果が得られたらCtrl + Cなどで動作を停止させる必要がある点には注意しましょう。

なお、CSVファイルの場合はヘッダと見比べるためにheadを使うケースのほうが多いと思いますが、この文法でtailを利用することも可能です。ですが、当然tailの場合はファイル全体を読み込んでからの表示になるため、時間がかかる点には注意しましょう。

AWS CLIを使いこなして快適なAWSライフを!

脚注

  1. -nオプションで取り出す行数を指定可能です。