仕事でS3に上がってるログファイルを見ることがあるんですが、毎回毎回
- S3からファイルをダウンロード
- ローカルでgzファイルをgrep
と、2段階やってました。
でも、これ結構面倒なんですよねぇ。。。
無駄なローカルファイルも増えるし。。。
で、これどうにかならないかなぁと探したらどうにかなりました。
CPコマンドの出力先をハイフンにしてcatする
通常のCPだとこう
1 2 3 |
aws s3 cp s3://バケット名/ファイルパス ファイルダウンロード先 ↓ 指定した場所にファイルがダウンロードされる |
それをテキストファイルの場合はこう
1 2 3 |
aws s3 cp s3://バケット名/ファイルパス.txt - | grep 検索文字列 ↓ txtをcatしてgrep結果を出力 |
CPの出力先をハイフンにするとcatされるので、その結果をいじる感じ。
zgrep+aオプションでgzファイルをgrepする
そのままzgrepすると
1 2 3 4 |
aws s3 cp s3://バケット名/ファイルパス.gz - | zgrep 検索文字列 ↓ バイナリー・ファイル(標準入力)は一致しました と出力される |
バイナリとみなされてしまうので、そんな時はaオプション
1 2 3 |
aws s3 cp s3://バケット名/ファイルパス.gz - | zgrep -a 検索文字列 ↓ 検索文字列がテキストで出力される |
これで解決!
追記
それダウンロードしてんじゃん!
という指摘がありました。
ダウンロードしてる=課金されてるぞ!ってことですかね…?
訂正するとしたら、
ダウンロードせずに~
ではなく
ファイルを保存することなく~
ですかね。
Athena使えない
アクセスできるディレクトリが制限されててtmpが使えない
ファイル置きすぎると容量使い過ぎ!と怒られる
中身見るだけなのにローカルにファイル増えてくのいやだ~
という環境だったので、ターミナル上で完結するの便利じゃん!と思って書きました。
ちなみに、対象ファイルは数十万行のログファイルだったりするのですが、いくら課金されてるのかは全くわかりません!
(だって他の会社が管理してる環境で請求来ないから…)
なので通信量についてはよくわかりませんが。
少なくともハイフンを指定することで、ローカルにファイルを保存する時間よりも高速に中身を見ることができていたと思います。
もう当分本番の踏み台でアレコレすることはないと思うので検証できませんけどね…。