コピペコードで快適生活

明日使えるソースを自分のために

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

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

comm

ファイルの共通点を比較
左から a.txtのみ、b.txtのみ、両方の順

$ comm a.txt b.txt
        1.123
1.abc
2.def
                4.xyz
        5.456

ソフトウェアデザイン2017年1月号Unixコマンドライン探検隊を参考にさせていただきました。