Rubyでログを強制出力する
require 'logger' _log = Logger.new('/tmp/debug.log') _log.info("#{ログ出力したいもの}")
こちらを参考にさせていただきました
http://dev.classmethod.jp/client-side/language-client-side/output_log_using_logger/
sedコマンドの基本を知っておく
基本系
- eオプションにコマンドを渡して使う
コマンドにはs(置換), d(行削除), p(行抽出)などがある。
cat input.txt | sed -e 'コマンド' # もしくは sed -e 'コマンド' input.txt
使用例
# 正規表現で文字列の置換を行う cat input.txt | sed -e 's/xxx/XXX/g' # 指定行を削除する cat input.txt | sed -e '1,10d' # 指定行だけ出力する # ※nコマンドはpで指定した行だけを抽出するオプション cat input.txt |sed -n -e '1,10p' # 正規表現でマッチする行を削除 cat input.txt | sed '/hoge/d' # 正規表現でマッチする行だけ出力 cat input.txt | sed -n -e '/hoge/p' # 10行目から20行目を全置換 # ※sコマンドの前に数字を置くと、その行のみが対象となる。 $ sed 3,5s/abc/ABC/g # ファイルを置換する # -i, --in-place オプションを使う sed -i -e 's/before/after/g' target.txt
こんな便利なことも
# 後方参照 echo 090-1111-2222 | sed 's/\(...\)-\(....\)-\(....\)/\1\2\3/' # => 09011112222
こちらのサイトにて勉強させていただきました。
https://hydrocul.github.io/wiki/commands/sed.html
RubyでHashの要素に.(ドット)でアクセスしたい
Struct使えば楽にできるみたい。
hash = {hoge: 'fuga'} obj = Struct.new(*(hash.keys)).new(*(hash.values)) obj.hoge # => 'fuga'
PostgreSQLの基本的なコマンド
これまでMySQLばかり使ってきてPostgreSQLの操作に戸惑ったので、よく使う基本的なコマンドをメモしました。
シェルでの操作
# 接続 psql -U USERNAME # DB指定で接続 psql -d postgres # ダンプ pg_dump -U USERNAME DBNAME > DUMP_FILE # ダンプ(データだけ) pg_dump -U USERNAME --data-only DBNAME > DUMP_FILE # ダンプ(データだけ/テーブル指定) pg_dump -U USERNAME --data-only --table TABLE_NAME DBNAME > DUMP_FILE # リストア psql -U USERNAME DBNAME < DUMP_FILE
DB接続後の操作
# データベース一覧 \l # データベース選択 \c DB_NAME # スキーマ一覧 \dn # テーブル一覧 # more表示になったときはspaceで進む \dt # テーブル構造の表示 \d TABLE_NAME; # セッションのPIDを調べる select pid, datname from pg_stat_activity; # セッションを強制切断 select pg_terminate_backend (PID); # 現在のスキーマ select current_schema(); # スキーマ切り替え set search_path = SCHEMA_NAME; # selectの結果を縦表示にする(MySQLでいう末尾\G) \x # 終了 \q
エクステンションの追加・削除
intarrayの場合で
# エクステンションの有効化 # pg_catalog指定で全スキーマで有効になる create extension intarray with schema pg_catalog; # 有効なエクステンション一覧 \dx; # エクステンションを無効化 drop extension intarray;
ロールの操作
# ロールの一覧 select rolname from pg_roles; # ロールの作成 CREATE ROLE role_name WITH LOGIN SUPERUSER # ロールの削除 DROP ROLE role_name # ロールの変更 ALTER ROLE role_name WITH PASSWOD 'password'
インデックス操作
# インデックス作成 CREATE INDEX index_name ON table_name (column_name); # インデックス削除 DROP INDEX index_name; # インデックス一覧 ¥di # インデックス確認 \d index_name
データをリストで取得
# tsvで取り出す psql -U USER -h HOSTNAME -p 5439 -d DBNAME -c "SELECT GETDATE();" -A -F $'\t' > ./test.tsv # csvで取り出す psql -U USER -h HOSTNAME -p 5439 -d DBNAME -c "SELECT GETDATE();" -A -F,> ./test.csv
各テーブルにレコード数を調べる
SELECT T2.relname, T2.reltuples FROM pg_stat_user_tables AS T1 INNER JOIN pg_class AS T2 ON T1.relname = T2.relname ORDER BY T2.relname;
{print $1}しか知らない自分のためのAWKメモ
awkのことをきちんと知っておこうと思って、下記を読ませていただいたときのメモ書きです。
http://antibayesian.hateblo.jp/entry/2014/09/15/162605
条件マッチする行を抽出
# 10にマッチする行を抽出する。 awk /10/ trees.txt # 両方の条件を満たす行を抽出する。 awk "/10/ && /16/" trees.txt # 片方どちらかでも条件を満たした行を抽出 awk "/10/ || /16/" trees.txt # 10を含まない行を抽出 awk !/10/ trees.txt # 1列目に10が含まれる行を抽出 # ※$0には行全体が入っている awk $1~/10/ trees.txt # 1行目が10未満の行を抽出 awk "$1<10" trees.txt # 12~14間の数値が含まれる行を抽出 awk /12/,/14/ trees.txt
組み込み変数を使って抽出
組み込み変数
NR # 現在読み込んでいる行数 NF # 現在読み込んでいる行の列数 -F # ファイルセパレータ指定。デフォルトは半角スペースかタブ。,を指定することでCSVファイルに対応 length # 現在読み込んでいる行の文字数 # CSVファイルから取り出す awk -F , $1~/10/ trees.txt # 1~3行目を取り出す awk "NR<=3" trees.txt # 列数が2未満の行を取り出す awk "NF<2 {print NR, $0}" trees.txt # 空行以外を取り出す awk "length>0" trees.txt
printを使ったデータ加工
# 1列目だけ awk "{print $1}" trees.txt # 1列目*2列目の計算結果を出力 # ※文字列での計算は0になる awk "{print $0,$1*$2}" trees.txt # 行数付与 awk "{print NR, $0}" trees.txt # $0に含まれる8をxxxに置換して出力 awk "{gsub(8,\"xxx\",$0);print $0}" trees.txt
シェルの便利コマンドメモ(cat, paste, join, comm)
処理対象ファイル
a.txt
1. abc 2. def 4. xyz
b.txt
1. 123 4. xyz 5. 456
cat
ファイルを結合する
$ cat a.txt b.txt 1.abc 2.def 4.xyz 1.123 4.xyz 5.456
paste
ファイルを横に並べて結合する
$ paste a.txt b.txt 1.abc 1.123 2.def 4.xyz 4.xyz 5.456
join
同じキーをもつ行を結合する
$ join a.txt b.txt
1. abc 123
4. xyz xyz