大抵はググればでてくる内容だが、シェル芸を足してもっと見やすくする。
S3でファイルを見る場面があったが、ファイル数が毎秒増えていく用途のバケットだったので、GUIで見ることが困難だった。そのためコマンドで対応するほかなかった。そういうときのナレッジ。
S3バケットをlsする
aws s3 ls s3://BUCKETNAME/DIRNAME/ --human-readable
BUCKETNAMEにはバケット名を、DIRNAMEにはディレクトリ名を置き換えて入力。--human-readableをつけることで、サイズ等を見やすくしてくれる。つけないとバイト表記。S3バケットの指定は、一番後ろにスラッシュをつけないといけないので、注意。
また、東京リージョンであってもタイムスタンプがUTCのため、時間が9時間マイナスされていても焦らないこと。
S3バケットをlsして、最新ファイルだけ抽出する
aws s3 ls s3://BUCKETNAME/DIRNAME/ --human-readable | sort -nr | head -n 10
CloudShellはパイプと一般的なLinuxコマンドが使えるので、それを利用。sortで並び替えを行い、headで上から10行の結果を出力。head -n 10の数値は任意変更して、見やすくファイル名を出力する。
S3バケットから指定したファイルをダウンロードする
aws s3 cp s3://BUCKETNAME/DIRNAME/ ./ --exclude "*" --include "FILENAME" --recursive
CloudShell上のカレントディレクトリに、指定したファイルをダウンロードする。このあと、単なるlsコマンドで、ダウンロードを確認。FILENAMEに実際のファイル名を記載する。
S3バケットのgzファイルをcatする
aws s3 cp s3://BUCKETNAME/DIRNAME/FILENAME.gz - | zcat
たまにマネージドサービスなどのログをS3に保存すると、gzファイルのことがある。たとえばCloudFrontとかCloudFrontとか(大事なことなので2回書きました)。そのようなファイルをちょっと見たいときに利用する。
S3バケットのgzファイルをgrepでキーワード検索する
aws s3 cp s3://BUCKETNAME/DIRNAME/FILENAME.gz - | zgrep "KEYWORD"
そのようなgzファイルをダウンロードせずに中身をgrep検索したいときは上記。"KEYWORD"を検索したいキーワードに置き換える。zgrepはヘルプ等を参照。基本grepとだいたい同じオプションが利用可能。
S3バケットの最新gzファイル1つを機械的にgrepでキーワード検索する
いままでの応用技。何も考えたくないぐらい機械的にやりたいときはこれ。
[cloudshell-user@ip ~]$ BUCKETDIRNAME="s3://BUCKETNAME/DIRNAME/"
[cloudshell-user@ip ~]$ FILENAME=`aws s3 ls ${BUCKETDIRNAME} --human-readable | sort -nr | head -n 1 | awk '{ print $5 }'`
[cloudshell-user@ip ~]$ aws s3 cp ${BUCKETDIRNAME}${FILENAME} - | zgrep "KEYWORD"
変数にすることで、コマンドは同じものを単純繰り返しすることできる。変更するのは1行目のS3バケットとディレクトリ名、3行目のzgrep検索キーワードのみ。
参考リンク
[aws]s3 lsで取得したファイルを更新日時順でソートする
https://blog.hello-world.jp.net/posts/aws-4254