11.06.2014

Cheat Sheets for My Sake

自分向け各種チートシートまとめ

 

自分が忘れがち or 使用頻度の高い事柄だけ書いておく。

Shell Script Cheat Sheet

原則、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
  • ファイルの内容を入力と同時に書き換える (一時ファイルなし)

Bash 配列の操作

  • 標準入力から読み込んだ内容を 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[@]}"

AWK Cheat Sheet

  • 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 Cheat Sheet

  • リモートブランチをローカルに取得してチェックアウト
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

MySQL Cheat Sheet

確認

  • データベース一覧
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 データベース名 テーブル名 > 出力ファイル名

Redshift Cheat Sheet

接続

  • 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;

参考

Ansible Cheat Sheet

  • コマンド結果によって処理の要否を判断する
    • 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 件のコメント:

コメントを投稿