自分向け各種チートシートまとめ
自分が忘れがち or 使用頻度の高い事柄だけ書いておく。
原則、Bourne Shell 互換のものを書く
- 実行中のスクリプトがあるディレクトリをフルパスで取得
SCRIPT_DIR=$( cd "$( dirname "$0" )" && pwd -P )
この場合、実行スクリプト自身がシンボリックリンクだと正しい判定ができない。以下のような実装が必要。
function __readlink_f {
local t="$1"; local n=
(while [ "$t" ]; do cd $(dirname "$t"); n=$(basename "$t"); t=$(readlink "$n"); done; echo "$(pwd -P)/$n")
}
SCRIPT_PATH=$(__readlink_f "$0")
SCRIPT_DIR=$(dirname "${SCRIPT_PATH}")
- 変数が未定義または空文字だった場合にデフォルト値を代入
NAME=${NAME:-"default_value"}
- 特定ディレクトリ配下の条件を満たすファイルを削除
/usr/bin/find $PATH_TO_FIND -type f -name '*.gz' -mtime +$PRESERVE_DAYS -delete
- パラメータの2個目以降を取得
$ f() { echo "${@:2}" }
$ f 1 2 3 4 5
2 3 4 5
- シェルスクリプト終了時に一時ファイルを削除
TMP_FILE="/tmp/$(basename "$0").$$.tmp"
trap "rm -f ${TMP_FILE}" EXIT
- [Linux] サーバに接続されているディスクのマウントポイントを列挙
df --output=source,target | grep ^/dev | awk '{print $2}'
- コマンドの存在をチェック
# assert that all required commands exist
assert_command_exists() {
while [ -n "$1" ]; do
command -v $1 >/dev/null 2>&1 || {
echo "Command '$1' is required but not installed. Aborting."
exit 1
}
shift
done
}
- Yes/No プロンプト
# print prompt and return yes/no
prompt_yesno() {
local prompt=$1
read -p "$prompt [y/N]: " yn
case "$yn" in
[Yy]) return 0;;
*) return 1;;
esac
}
-
シェルスクリプト中のコマンドで失敗した場合に即終了とする
- シェルの中で
set -e
- or シェル起動時に
bash -e
- シェルの中で
-
ファイルの内容を入力と同時に書き換える (一時ファイルなし)
(rm -f -- "${FILEPATH}" && COMMAND > "${FILEPATH}") < "${FILEPATH}"
- 参考: シェルスクリプトを極める
- 標準入力から読み込んだ内容を 1行ずつ配列に格納する
IFS=$'\n' lines=($(cat))
または
declare -a lines ### lines=() でも可
while IFS= read line; do
lines+=("$line")
done
- 配列の要素を全て削除
unset arr[@]
- 配列のコピー
dst_arr=("${src_arr[@]}")
- 配列の内容を表示
printf '%s\n' "${arr[@]}"
- shebang
#!/usr/bin/env awk -f
- 先頭の n 個の要素を除外
# Join all tokens except first n ones with a space
function drop(n) {
s = "";
for (i = n + 1; i <= NF; ++i) {
s = (s == "" ? s : s " ") $i
}
return s;
}
実行例
$ echo '1 2 3 4 5' | awk 'function drop(n){s="";for(i=n+1;i<=NF;++i){s=(s==""?s:s" ")$i}return s} {print drop(2)}'
3 4 5
- リモートブランチをローカルに取得してチェックアウト
git checkout -t -b branch_name origin/branch_name
- 直前コミットの author を修正
git commit --amend --author="Your Name <your_address@example.com>"
- git push の時に、自動的に現在のブランチが対象になるようにする
git config --global push.default current
- リモートブランチの削除
git push --delete origin branch_name
- コマンドのエイリアスを設定する (checkout => co の例)
git config --global alias.co checkout
- アップストリームの確認と設定
git branch -vv
git push -u [origin branch_name]
or
git branch --set-upstream-to=origin/branch_name branch_name
- データベース一覧
show databases
- テーブル一覧
use <db_name>
show tables
- テーブル定義
desc <db_name>;
- ユーザ一覧
select host, user, password from mysql.user;
- ユーザ権限
show grants for <user>@<host>
- レプリケーション状態
スレーブノード上で
show slave status \G
- サーバパラメータ
show variables like '%host';
- カラム名変更
alter table <table_name> change <old_column_name> <new_column_name> <type> <option>;
- カラム削除
alter table <table_name> drop column <column_name>;
- サーバパラメータ
set global <variable_name>=<value>
or modify /etc/my.cnf
- AUTO_INCREMENTの値をリセット
ALTER TABLE <table_name> AUTO_INCREMENT = 1;
- TIMESTAMP型の値を変更
UPDATE <table_name> SET <column_name> = 'YYYY-MM-DD hh:mm:ss' WHERE <condition>
- パスワード変更
set password for 'root'@'localhost' = password('root');
- DB全体
mysqldump -u root -x --all-databases > 出力ファイル名
- 特定DB
mysqldump -u root データベース名 > 出力ファイル名
- 特定テーブル
mysqldump -h ホスト名 -u ユーザ名 -p -t データベース名 テーブル名 > 出力ファイル名
- psql で接続
psql -h <エンドポイントURL> -U <接続ユーザ> -d <データベース名> -p <ポート番号>
例: psql -h xxxxxx.xxxxxxxxxxxx.ap-northeast-1.redshift.amazonaws.com -U awsuser -d xxxxxx -p 5439
環境変数 PGPASSWORD=<パスワード>
を指定すればパスワードの入力を省略可能。
プロンプト文字列を変える場合は -v PROMPT1='%m:%/# '
のように変数指定オプションを追加。
- テーブル一覧
\dt
クエリを直接実行する場合
SELECT DISTINCT tablename FROM pg_table_def WHERE schemaname = 'public' ORDER BY tablename;
- テーブル定義の確認
\d+ <テーブル名>
クエリを直接実行する場合
SELECT * FROM pg_table_def WHERE tablename = '<テーブル名>' AND schemaname = 'public';
- カラムの型を変更
新しいカラムを定義し、データを全てコピーし、そしてそのカラム名を変更するより方法がない。
ALTER TABLE <テーブル名> ADD COLUMN <一時的なカラム名> <正しいカラム定義>;
UPDATE <テーブル名> SET <一時的なカラム名> = <カラム名>;
ALTER TABLE <テーブル名> DROP COLUMN <カラム名>;
ALTER TABLE <テーブル名> RENAME COLUMN <一時的なカラム名> TO <カラム名>;
- ミリ秒単位の Unix time から DATETIME に変換
SELECT TIMESTAMP 'epoch' + <カラム名> * INTERVAL '0.001 s' AS time_stamp FROM <テーブル名>
- 日本時間で表示
SELECT CONVERT_TIMEZONE('JST', TIMESTAMP 'epoch' + <カラム名> * INTERVAL '0.001 s') AS time_stamp FROM <テーブル名>
- データロードエラーの調査
SELECT DISTINCT
name AS tablename,
raw_line,
query,
starttime,
filename,
line_number,
colname,
err_code,
err_reason
FROM
stl_load_errors error,
stv_tbl_perm perm
WHERE
error.tbl = perm.id
ORDER BY
starttime DESC
LIMIT 20;
- コマンド結果によって処理の要否を判断する
register
を使ってコマンド実行結果を変数に格納。ignore_errors
は必須。changed_when
,failed_when
は表示を見やすくするために。
- name: check if YOUR_MODULE is installed
command: /usr/bin/test -e PATH_TO_THE_FILE
ignore_errors: True
changed_when: False
failed_when: False
register: is_installed
tags: YOUR_MODULE
- name: install YOUR_MODULE
ANSIBLE_MODULE: PARAMS
when: is_installed | failed
tags: YOUR_MODULE
- name: check if YOUR_PIP_MODULE is installed
command: pip show YOUR_PIP_MODULE
ignore_errors: True
changed_when: False
failed_when: False
register: check_installed
tags: YOUR_PIP_MODULE
- name: install YOUR_PIP_MODULE
pip: name={{ item }} state=present
with_items: YOUR_PIP_MODULE_URL
when: check_installed.stdout == ''
tags: YOUR_PIP_MODULE
0 件のコメント:
コメントを投稿