集中力を高める

俺的ベストプラクティス

  • ガムを噛む
  • 運動する (会社の階段昇降)
  • 飯を抜く (ランチ行かない)
  • 息を止める

json ファイルの syntax 確認

$ brew install npm
$ npm install jsonlint -g
$ jsonlint -q test.json

美味しい米の炊き方

  • 4~5回水を入れ替えて米を研ぐ。
  • 研ぐ時の力加減は、軽くさらさらと研ぐ。米が割れ風味が劣る為。
  • 新米の場合は米の水分が多い場合があるため、若干水の量を減らして炊く。
  • 米の中心まで吸水させる為、水に浸けて30分以上経過してから炊く。
  • 冷水で炊く。
  • 炊き上がったら直ぐにほぐし、水分を飛ばしつつ均一な水分量にする。
  • 残ったご飯は冷ましてから炊飯器から出し、冷蔵庫か冷凍庫へ。保温にして放置しない。

Linux command basic

更新中。2015年7月9日

pbcopy

clipboard にコピー。

pbcopy < ./test.txt
cat text.txt | pbcopy

htpasswd

.htpasswd 作成。

htpasswd -c .htpasswd {ユーザー名}

ls

-R: ディレクトリ内容を再帰的に表示(全て表示)
-t: Timestamp(降順)
-r: リバース(Timestamp昇順)
-a: 拡張子含め表示

cp

[bash]

最終更新日時と最新アクセス日時,所有者と所有グループ,アクセス権(パーミッション)を保持しつつ、ディレクトリを丸ごとコピーする。

$ cp -Rp {ディレクトリ名}
[/bash]
-p: オーナー,グループ,パーミッション,タイムスタンプを保持したままコピー
-f: 同名ファイルがある場合, 警告せず上書き
[Linux] “-f”オプションを付与してコマンドを実行しても、対話形式となってしまう場合がある

mkdir

複数ディレクトリを一気に作成

$ mkdir -p

find

# `2&gt;/dev/null` は許可されていない旨のエラーを出力しないようにしている。
$ find / -name &quot;{検索ファイル名}&quot; -type f 2&gt;/dev/null -print0

$ find . -name &quot;{検索ファイル名}&quot; -type f 2&gt;/dev/null -print0 | xargs -0 grep &quot;{ファイルに含まれる文字列}&quot;

# 直近xx分以内に更新をかけたファイルをfindする
## 現在~分以内
$ find . -type f -mmin -10

## 現在~日以内
$ find . -type f -mtime 2

# 特定のディレクトリを除いて、find検索を行う。
find {検索パス} -type d -name {除外パス} -prune -o -type f -name &quot;{検索ファイル名}&quot; -print

# 7日以上前の&quot;.tar.gz&quot;ファイルを削除する。
$ find {BK_PATH}/ -name &quot;*.tar.gz&quot; -type f -mtime +7 | xargs rm -fv

# 圧縮されたjarファイルの中から、該当のClassファイルを検索する。
$ find . -name &quot;*.jar&quot; -exec zipgrep &quot;{検索文字列}&quot; '{}' \;
$ for FILE in $(find . -name '*.jar') ; do jar -tvf $FILE | grep &quot;{検索文字列}&quot; ; done

grep

  • grep: 簡単な絞り込み。
  • egrep: より強力な正規表現(EREs)が利用可能。ファイルの中から指定されたパターンを検索。grepに-Eオプションをつけた場合と同じ挙動。
  • zgrep: gzipなどで圧縮されたファイルも検索可能。
# &quot;xxx&quot;を含む行すべてを表示
$ grep &quot;xxx&quot; test.html

# &quot;xxx&quot;を含まない行すべてを表示
$ grep --invert-match[-v] &quot;xxx&quot; test.html

# 最大検索数をnとし、それ以上の検索は中止
$ grep --max-count[-m] {n} &quot;xxx&quot; test.html

# 行数を表示
$ grep --line-number[-n] &quot;xxx&quot; test.html

# &quot;xxx&quot;の前後10行を表示
$ grep --context[-C] 10 &quot;xxx&quot; test.html

# &quot;xxx&quot;を含む行とその次の10行を表示
$ grep --after-context[-A] 10 &quot;xxx&quot; test.html

# &quot;xxx&quot;を含む行とその前の10行を表示
$ grep --before-context[-B] 10 &quot;xxx&quot; test.html

# 大文字/小文字を区別しない
$ grep --ignore-case[-i] &quot;xxx&quot; test.html

# ファイル内文字列検索
$ grep -rl &quot;xxx&quot; *

# 件数表示 (wc:word count)
$ grep -rl &quot;xxx&quot; * | wc -l
$ grep -rl &quot;xxx&quot; * | grep &quot;cache&quot; | wc -l

# 特定のディレクトリを除外
grep -rl &quot;xxx&quot; {検索パス} --exclude-dir={除外パス}

# 特定のファイルを除外
grep -e &quot;xxx&quot; --exclude {除外文字列} -ri {検索パス}

# 引数で指定した&quot;xxx&quot;にマッチする部分のみ表示。大文字/小文字を無視。&quot;aaa&quot;,&quot;.bbb&quot;ディレクトリを除外。xxxが含まれるが、&quot;/tmp-xxx&quot;,&quot;test-xxx&quot;は除外。
$ grep -ri --only-matching &quot;xxx&quot; . --exclude-dir={aaa,.bbb} | egrep -v '/tmp-xxx|/test-xxx'

awk

スペースで区切られた複数列のテキストデータを処理する。

$ head /var/log/httpd/access_log | awk '{print $1&quot;   &quot;$7&quot; &quot;$9}'
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200
xxx.xxx.xxx.xxx   /healthCheck.html 200

# &quot;access_log&quot;の1列目をユニークに抽出する
$ head -300 /var/log/httpd/access_log | awk '{print $1}' | sort -n | uniq -c
      5 127.0.0.1
    141 172.0.0.27
    141 172.00.13.248
     13 202.00.232.55

# &quot;access_log&quot;の1,7,9列目をユニークに抽出しつつ、ソートを行いLESSを起動する
$ cat /var/log/httpd/access_log | awk '{print $1&quot;   &quot;$7&quot; &quot;$9}' |sort |uniq -c|less
      1 111.111.111.111   /healthCheck.html 503
      8 111.111.111.111   / 200
      3 111.111.111.111   /test 200
     46 111.111.111.111   /api/getTest.html 200
     42 111.111.111.111   /api/getAreaTest.html 200

# Fオプションで区切り文字を指定
$ cat test.csv | awk -F',' '{print $2}'
 iii

# 例えばcsvでユーザー、HOST名がリスト化してあるものを、awsで接続用コマンドを出力する
$ cat test.csv | awk -F',' '{print &quot;mysql -u&quot;$2 &quot; -p -h&quot;$4}'
mysql -u developer -p -h test.com
mysql -u testuser -p -h test.com

nslookup

正引きでドメインからIPを調べる。
DNSのサーバーに対して直接DNS要求を送り、その結果を表示する。

// DNS server を指定しない場合、既定のDNS server へ問い合わせを行う。
$ nslookup test.com

// DNS server を Google Public DNS 8.8.8.8 に指定、デフォルトではAレコードを取得。
$ nslookup test.com 8.8.8.8

// NS 等 type を指定することも可能。
$ nslookup -type=ns test.com 8.8.8.8
$ nslookup -type=mx test.com 8.8.8.8
$ nslookup -type=soa test.com 8.8.8.8
$ nslookup -type=txt test.com 8.8.8.8

TXTレコードを引いて迷惑メール対策用のSPF認証レコードなどを調べる。

関連記事: DNS basic

dig

DNS(ネームサーバー)の情報を調べる。

$ dig -t soa xxx.com

; &lt;&lt;&gt;&gt; DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.51.amzn1 &lt;&lt;&gt;&gt; -t soa xxx.com
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 62640
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;xxx.com.       IN  SOA

;; ANSWER SECTION:
xxx.com.    60  IN  SOA ns-1466.awsdns-55.org. awsdns-hostmaster.amazon.com. 1 xxx 900 xxx xxx

;; Query time: 26 msec
;; SERVER: xx.x.x.x#53(10.0.0.2)
;; WHEN: Tue Apr xx xx:xx:xx 2017
;; MSG SIZE  rcvd: xxx

各種バージョン確認

こちらの記事を参照。

curl

HTTPやFTPプロトコル経由でファイルのダウンロード、アップロード、サーバーの生死確認、APIの試打、スクレイピング等に利用する。

# ローカルIP確認
$ curl ifconfig.co

# レスポンス確認(ヘッダーのみ)
$ curl -I http://xxx.xxx.xxx.xxx:80/

# レスポンスをファイルに出力
$ curl -i http://xxx.xxx.xxx.xxx:80/ -O

ping

指定したIP、もしくはホスト名に対してパケットを送信し、応答を確認する。利用プロトコルはICMP。確認できるのは、OSI参照モデルのネットワーク層(IPレベル)まで。トランスポート層やアプリケーション層は確認不可。Pingは通るがWebが見れない場合は、Webサーバー側に問題があるのではないか、と予測できる。

$ ping {IPアドレス | ホスト名} [-c パケット送信回数] [-i 待機秒数] [-w 実行秒数] [-n IPからホストを検索しない]

telnet

単に経路が有効かどうかだけを調べたければ通常はpingコマンドを利用するが、接続先の特定ポートへ接続できるかを確認するにはtelnetコマンドを使う。

$ telnet [ポート番号]

dstat

サーバー全体のリソースを監視。

オプション 説明
-c CPU時間の割合
-d ディスクI/Oバイト数
-g ディスクからメモリへのI/Oバイト数
-i 割込状況
-l LoadAverageの状況
-m メモリの状況
-s Swap状況
-y システムの状態
$ dstat -Tclmdrn

ln

オプション 説明
-f 同一ファイルを上書きして強制的に作成する
-i 同一ファイルがあった場合確認する
-v 実行内容を出力
-n 同一ファイルがある場合は何もしない
$ ln -s /Users/developer/Dropbox/env/.zshrc /Users/developer

# リンクを削除(rmでも可)
$ unlink /Users/developer/.zshrc

tree

# ディレクトリのみ表示
$ tree -d

# ファイル・ディレクトリのサイズを表示
$ tree -s

# 現在の位置から表示させる階層の数を指定
$ tree -L 2

# ドットファイルも出力対象
$ tree -a

scp

# ローカルのファイルをリモートサーバーへ送信
$ scp /Users/user_name/file.php ec2-user@xxx.com:/home/ec2-user/{path}

# リモートサーバーのファイルをローカルへ転送
$ scp ec2-user@xxx.com:/home/ec2-user/{path}/file.php ~/Desktop/

# ポートを指定し、ディレクトリをコピーし、ローカルへ転送
$ scp -r -P 2222 ec2-user@xxx.com:/home/ec2-user/{ディレクトリ} ~/

# ~/.ssh/config の設定を読み込みつつ、scpを利用
$ scp dev-web:/home/ec2-user/test.conf ./

# &quot;Permission denied&quot; となる場合ssh-addを行う
$ ssh-add ~/.ssh/xxx.pem

# オプション
-p 最終修正時刻、最終アクセス時刻、パーミッションを引き継ぐ
-P ポートを指定

# 踏み台サーバを経由して転送
$ scp -o 'ProxyCommand ssh user@basition-host nc %h %p' ./path/to/copy/from user@remote-host:/path/to/copy/to

ssh

こちらの記事を参照。

圧縮

tar: http://webkaru.net/linux/tar-command/
gzip: http://webkaru.net/linux/gzip-command/

Current directoryで圧縮を行う。パス指定で操作すると事故を起こす。
tarの必須オプションは事故を起こすものが多い為、注意

# 連結したやり方
$ tar -cf archive.tar dir; gzip archive.tar
$ tar -zcf xxxx.tar.gz directory

# 分割したやり方
$ tar -cf archive.tar dir
$ gzip archive.tar

# 必須オプション
-c  新しくアーカイブを作成
# 任意オプション
-f アーカイブファイルを指定
-v 作成・展開するアーカイブのファイルリストを表示
-z gzip形式にアーカイブを圧縮・展開
-x アーカイブを展開

最高レベルで圧縮する (bashのみ)
ベストな圧縮をする場合、gzipを使わない。lzma7z を使う。

$ GZIP=-9 tar czf file.tar.gz /path/to/directory

絶対パスを指定して”tar: Removing leading `/’ from member names”のエラーが表示される場合は、”-C / {PATH}”で抑制する。
例) Shell Script等でDumpファイルをtarする場合等。

GZIP=-9 tar czf ${BACKUPDIR}/${DB_NAME}-dump-`date +%Y%m%d%H%M`.tar.gz -C / backups/databases/${DB_NAME}-dump.sql

zip作成

$ zip -r xxx.zip xxx

解凍

$ tar -zxf xxxx.tar.gz

ポート確認

[bash]

プロセスが使用しているポートを確認

$ lsof -i

ポート番号から使用しているプログラムを確認

$ lsof -i:80

通信が確立しているtcpポートの状況を調べる

$ netstat -t

接続待ちをしているTCP、UDPポートを表示する

$ netstat -antu
[/bash]

du

Disk Used 。
個々のディスク使用量。

# public.shtml以下のディレクトリの容量をKバイト単位で表示する
$ du -k public.shtml
1024    public.shtml/images
364     public.shtml/doc
1905    public.shtml

# public.shtmlディレクトリのみの容量を表示する
(サブディレクトリの情報は表示しない)
$ du -s public.shtml
1905    public.shtml

# public.shtmlディレクトリの容量のみを表示する
$ du -sS public.shtml
517

$ du -sh *
4.0K    Gemfile
4.0K    Gemfile.lock
3.2M    cookbooks

NKF

# インストール
$ brew install nkf

# エンコードの確認
$ nkf -g foo.csv
UTF-8

# Shift-jisへ変換 (-s)
$ nkf -s foo.csv &gt; bar.csv

# UTF-8へ変換 (-w)
$ nkf -w foo.csv &gt; bar.csv

# UTF-8+unix改行コード(LF)へ変換
$ nkf -w -Lu foo.csv &gt; bar.csv

# SHIFT-JIS+Windows改行コード(CRLF)へ変換
$ nkf -s -Lw foo.csv &gt; bar.csv

# UTF-8へ変換+Macintosh改行コード(CR)へ変換
$ nkf -w -Lm foo.csv &gt; bar.csv

whois

$ whois test.com
Domain Name: TEST.COM
Registrar: AMAZON REGISTRAR, INC.
Sponsoring Registrar IANA ID: 468
Whois Server: whois.registrar.amazon.com
Referral URL: http://registrar.amazon.com
Name Server: NS-xxxx.AWSDNS-55.ORG
Name Server: NS-xxxx.AWSDNS-03.CO.UK
Name Server: NS-xxx.AWSDNS-54.COM
Name Server: NS-xxx.AWSDNS-30.NET
Status: ok https://icann.org/epp#ok
Updated Date: 14-may-2017
Creation Date: 09-jul-2016
Expiration Date: 09-jul-2017

NTP

http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-time.html#configure_ntp

# NTP サービスを起動
$ sudo service ntpd start

# ブート時に NTP を開始
$ sudo chkconfig ntpd on

# NTP が有効かどうか
$ sudo chkconfig --list ntpd
ntpd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
# 実行レベル 2、3、4、および 5 で ntpd がオンになっていれば、適正。

# NTP が機能していることを確認
$ ntpstat

ip

$ ip -f inet -o addr show

監視

vmstat

メモリやCPUの情報だけでなく、スワップやプロセスの情報を出力。

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 653116 165176 2561636    0    0     0     5   41   31  0  0 100  0  0
 0  0      0 653116 165176 2561636    0    0     0     0  211  499  0  0 100  0  0
 0  0      0 653084 165176 2561636    0    0     0    20  264  573  0  0 100  0  1

si(スワップイン), so(スワップアウト)が頻繁に動いている場合はスワップが発生している。他の項目としては、rは実行待ち状態のプロセス数、bは割り込み不可能なスリープ状態にあるプロセス数。memoryの項目はfreeと同様、ioはデバイスとのブロックの転送量、systemはコンテキストの毎秒の切り替えレート(割り込み回数・コンテキストスイッチの回数)、cpuはCPU使用率。

ps

psで特定のプロセスだけ確認する。

$ ps -C java ufw
$ ps -Cruby,nginx ufw

メモリ確認

$ cat /proc/meminfo |egrep -e &quot;Active:|Inactive:|MemFree:&quot;
MemFree:          208944 kB
Active:          3033956 kB
Inactive:         636568 kB

Swap

こちらの記事を参照。

top

こちらの記事を参照。

passwd

こちらの記事を参照。

user*

新規ユーザー追加

$ useradd {User_Name}

グループへ追加

# -Gのみで新しいサブグループを追加しない。既に設定されている他グループ設定が消える。
$ sudo usermod -aG {Group_Name} {User_Name}

# 指定グループの所属ユーザーを確認
$ getent group {Group_Name}

ユーザー削除

# -rオプションでhomeディレクトリごと削除
$ sudo userdel -r olduser

wget

ファイルをダウンロードする。

# 指定したURLからファイルを取得する
$ wget {URL}

# バックグラウンドでプロセスを実行する
$ wget -b {URL}

# 指定したファイルへログを出力する
$ wget -o /tmp/test.log {URL}

# ファイルが存在している場合は、ダウンロードしない
$ wget -nc {URL}

less

ファイルの中身を閲覧する。

# -N: 行数表示
# -M: カーセルの行数、ファイル名表示
# -i: 検索時大文字でない限り大文字/小文字を区別しない
# -S: テキストを折返し表示しない
$ less -NMiS {FILE_NAME}
less起動後のコマンド 説明
R 画面再描画
F “tail -f”と同様
Enter 1行進む
y 1行戻る
g 先頭へ
G 末尾へ
space 1画面戻進む
b 1画面戻る
q 終了

mail

受信したメールの確認をする。

$ mail
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
&quot;/var/spool/mail/root&quot;: 2 messages 2 new
>N  1 developer@xxx  Tue Jun  6 22:18  17/770   &quot;*** SECURITY information for xxx ***&quot;
 N  2 developer@xxx  Tue Jun  6 22:19  17/779   &quot;*** SECURITY information for xxx ***&quot;
&amp;
Message  1:
From developer@xxx  Tue Jun  6 22:18:40 2017
Return-Path: &lt;developer@xxx&gt;
Date: Tue, 6 Jun 2017 22:18:40 +0900
To: root@xxx
From: developer@xxx
Auto-Submitted: auto-generated
Subject: *** SECURITY information for heart-core-dev ***
Status: R

xxx : Jun  6 22:18:40 : developer : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/developer ; USER=root ; COMMAND=/bin/su -

>N  1 developer@xxx  Tue Jun  6 22:18  17/770   &quot;*** SECURITY information for xxx ***&quot;
 N  2 developer@xxx  Tue Jun  6 22:19  17/779   &quot;*** SECURITY information for xxx ***&quot;

|メールステータス|1,2,3…|developer@xxx|17/770|”*** SECURITY information for xxx ***”|
|N: 新着, U: 未読, R: 既読, S: セーブ済み|受信した順番|送信者|メール行数/文字数|題名|

yum

依存関係を考慮しつつパッケージ管理を行い、インストール/更新が可能。
こちらの記事を参照。

convmv

ファイル名のエンコードを変更する。

# Dry run
$ convmv -f sjis -t utf-8 *

$ convmv -f sjis -t utf-8 * --notest

# ディレクトリの場合
$ convmv -r -f sjis -t utf-8 * --notest

tr

文字の一括置換を行う。

split

ファイルを条件を指定して分割する。

watch

コマンドの定期実行。

$ brew install watch

# 何らかのスクリプトを実行している際に、ファイルサイズの変化等を監視する
# -e: 実行結果がエラーとなった場合に終了
# -c: カラー出力
# -n: 実行間隔(秒)
$ watch -e -c -n 1 ls -la

w

ログインユーザーの利用状況を確認する。

項目 説明
TTY 端末
FROM 接続元Ip
LOGIN@ ログイン日時
IDLE 入力待ち状態時間
JCPU 全プロセスの処理時間
PCPU 実行中プロセスの処理時間
WHAT 現在実行中のプロセス
$ w
 19:44:20 up 79 days,  2:14,  5 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
xxx      pts/0    111.111.111.111   15:05    2:37m  0.15s  0.00s sshd: xxx [priv]
xxx      pts/1    111.111.111.111   Wed18    2days  0.02s  0.00s sshd: xxx [priv]
xxx      pts/2    111.111.111.111   15:07    3:16m  0.04s  0.00s sshd: xxx [priv]
xxx      pts/3    111.111.111.111   15:09    1:16m  0.11s  0.00s sshd: xxx [priv]
xxx      pts/4    111.111.111.111.b 19:40    1.00s  0.00s  0.00s w

Mac 辞書を開く

$ open dict:///{検索文字列}

shutdown

// Mac 電源 off
$ shutdown now

// Mac 再起動
$ shutdown -r now