AWS CLI を使って S3 オブジェクトの中身を保存せずに確認する方法と、シェルにおけるハイフンに関するメモ
AWS CLI で S3 オブジェクトの中身を確認する
以下のようなコマンドで、 S3 オブジェクトを標準出力に出力できる
aws s3 cp s3://mybucket/myobject -
なので S3 オブジェクトとして保存してある JSON をいい感じみたい場合は、以下のようにすると良い
aws s3 cp s3://mybucket/myobject - | jq .
gzip 化された JSON なら gunzip を挟めば良い
aws s3 cp s3://mybucket/myobject - | gunzip | jq .
duckdb に標準入力経由で入力して分析しちゃったりもできちゃう
- jq を間に挟んで duckdb に入力する JSON をフィルタしたりも出来る
duckdb のオプション指定で、出力フォーマットを json, csv, markdown など様々指定できちゃう
- https://duckdb.org/docs/api/cli/arguments.html
https://duckdb.org/docs/api/cli/output_formats.html
aws s3 cp s3://mybucket/myobject - | gunzip | duckdb -c "SELECT * FROM read_json_auto('/dev/stdin') LIMIT 1"
-
って何なの?
- この
-
ハイフンの正体は POSIX や GNU Coding Standards から始まった慣習らしい?- 少なくとも AWS CLI が独自に提供している機能や規格ではない
- 基本的に標準入出力を意味しており、指定したコンテキストによって標準入力になったり標準出力になったりする
- 今回の例では標準出力になっている
aws s3 cp s3://mybucket/myobjet -
- 例えば以下のようなコマンド指定をすると標準入力になり、入力された値を出力するという動作になる
cat -
GNU Coding Standards
https://www.gnu.org/prep/standards/standards.html#Command_002dLine-Interfaces
It is a good idea to follow the POSIX guidelines for the command-line options of a program. The easiest way to do this is to use getopt to parse them. Note that the GNU version of getopt will normally permit options anywhere among the arguments unless the special argument ‘–’ is used. This is not what POSIX specifies; it is a GNU extension.
Bash Reference Manual
https://www.gnu.org/software/bash/manual/bash.html
Unless otherwise noted, each builtin command documented as accepting options preceded by ‘-’ accepts ‘–’ to signify the end of the options. The :, true, false, and test/[ builtins do not accept options and do not treat ‘–’ specially. The exit, logout, return, break, continue, let, and shift builtins accept and process arguments beginning with ‘-’ without requiring ‘–’. Other builtins that accept arguments but are not specified as accepting options interpret arguments beginning with ‘-’ as invalid options and require ‘–’ to prevent this interpretation.
- 少し異なるトピックだが
--
を指定するという慣習もある - これは個人的には npm を使う際によく見かける
- 例えば
npm run dev
するときにポートを指定したい場合はnpm run dev -- --port 8080
のように指定する- これは多くの場合
vite
コマンドをnpm
経由で使っているのだが、npm run dev --port 8080
のような指定だとnpm
に対するオプション指定と判別することが困難なため、--
を指定することでnpm
経由で起動するvite
コマンドに対してオプション指定するというスキームになっている
- これは多くの場合
- 例えば
コマンドラインインターフェイス | Vite
https://ja.vite.dev/guide/cli
–port
ポートを指定する(number)
おそらく以上の慣習を多くのプログラミング言語や引数をパースするライブラリが踏襲しており、まぁ常識でしょ?みたいな扱いになっているのだと思われる。