日常使用しているコマンドラインの紹介
PR TIMESの開発チームで主にサーバサイドを担当しているものです。 ここでは仮に「アカイ」としておきます。
過去数か月分なのでほとんどさわりだけになりますが、現在日常的に使用している開発環境のbash_historyから、なにかしら有用だと思われるようなコマンドを抜き出して掲載いたします。
おそらく日頃からコマンドラインに慣れ親しんでいる人にはわかりきっているものだと思いますので、こっちのほうがいいよ、みたいな話があればぜひ教えていただきたいと思います。
historyはgit関係のコマンドが圧倒的に多くなっていますが、便利そうなものだけに絞っています(gitは解説している文書がネット上にたくさんありますので、そちらをを見ていただいた方がよいと思います)。
$ bash --version
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
grep
grepは文字列を検索するコマンドです。
オプションも色々ですが、例えばよく使うのは以下のようなものでしょうか。
$ grep *正規表現* /path/to/file | grep -v *除外する文字列1* | grep -v *除外する文字列2* .....
-v オプションは指定したパターンを結果から除外するものです。
あまり美しくないですが、パイプで除外条件を追加していくことで、結果を絞っていくことができるので簡単です。
su / sudo
Su(peruser) / Su(perUser) Do ということだそうです。
コマンド自体の機能としては、su は別のユーザに切り替えるもの、sudo は任意のユーザでコマンドを実行するというものです。
単純にsuだけだと、rootユーザへ切り替えます。
また、単純にコマンドの前にsudoを付けると、管理者権限で実行したことになります。
もちろん、これらのコマンドについては、必要な権限が付与されていなければ使用できません。
$ su - anon
suの引数'-'は、ログインシェルを実行します(そのユーザで直接ログインした場合と同じ状態)。
最近では、MacOSXやubuntu等でコンピュータの管理を行う際にsudoを使用している例を見かけますね。
$ sudo apt-get install httpd
管理者権限を使用している状態は、システムを簡単に破壊することが可能になっている状態です。
コマンドのミスによって大惨事になる可能性もありますので、くれぐれもご注意ください。
ps aux
サーバプロセスを表示するコマンドです。
大体はパイプでgrepへ送ってプロセスを探すときに使用しています。
$ ps aux | grep ^anon
anon 22836 0.0 0.2 83072 4376 ? S 14:20 0:06 sshd: anon@pts/4
anon 22837 0.0 0.2 23760 5648 pts/4 Ss 14:20 0:00 -bash
anon 22980 0.0 0.1 17252 2864 pts/4 S+ 14:20 0:00 tmux attach
anon 30422 2.1 2.9 207616 60248 pts/3 Sl+ 10:59 7:26 emacs
anon 39440 0.0 0.1 19092 2440 pts/1 R+ 16:44 0:00 ps aux
anon 39441 0.0 0.1 12720 2092 pts/1 S+ 16:44 0:00 grep ^anon
anon 41368 0.2 0.3 29252 6652 ? Ss May17 2:33 tmux
anon 41369 0.0 0.2 23840 5888 pts/1 Ss May17 0:01 -bash
anon 41508 0.0 0.3 24692 7160 pts/2 Ss+ May17 0:03 -bash
anon 41647 0.0 0.2 23664 5500 pts/3 Ss May17 0:00 -bash
top
CPU等のリソース使用状況をリアルタイム表示できるコマンドです。
先のpsと合わせて、サーバの状況を確認する際には必須のコマンドです。
私は大抵更新時間を0.5秒にしています(top -d .5)。
top - 16:46:05 up 1 day, 12:17, 1 user, load average: 0.00, 0.02, 0.05
Tasks: 80 total, 1 running, 79 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 2051796 total, 1706248 used, 345548 free, 204124 buffers
KiB Swap: 784380 total, 0 used, 784380 free. 1183964 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
41368 anon 20 0 29252 6652 2692 S 0.7 0.3 2:33.31 tmux
1 root 20 0 28712 4856 3108 S 0.0 0.2 0:03.10 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:12.12 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root 20 0 0 0 0 S 0.0 0.0 0:22.00 rcu_sched
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
10 root rt 0 0 0 0 S 0.0 0.0 0:02.26 watchdog/0
11 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
14 root 20 0 0 0 0 S 0.0 0.0 0:00.06 khungtaskd
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
16 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd
17 root 39 19 0 0 0 S 0.0 0.0 0:00.00 khugepaged
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 crypto
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
df -ha
ファイルシステムの状態表示を行います。
オプション-a ですべて表示、-hで単位をわかりやすいものにしてくれます。
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 19G 3.2G 15G 18% /
udev 10M 0 10M 0% /dev
tmpfs 401M 7.3M 394M 2% /run
tmpfs 1002M 0 1002M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 1002M 0 1002M 0% /sys/fs/cgroup
/dev/sdb1 20G 1.7G 17G 10% /usr/local/work
du -hc /path/to/directory
指定ディレクトリ内のファイル別の容量を表示します。
オプション-c で合計を表示、-hで単位をわかりやすいものにしてくれます。
対象によってはCPU負荷が高くなったりすることもありますので、濫用しないようにしましょう。
$ sudo du -hc /tmp
36K /tmp/vmware-root
4.0K /tmp/tmux-1000
4.0K /tmp/.Test-unix
4.0K /tmp/vmware-root-2991268551
4.0K /tmp/.XIM-unix
4.0K /tmp/babel-30422wqT
4.0K /tmp/.font-unix
4.0K /tmp/.X11-unix
4.0K /tmp/emacs1000
4.0K /tmp/.ICE-unix
76K /tmp
76K total
find /path/to/dir -type f -print0 | xargs -0 grep 正規表現
findはファイル・ディレクトリ検索のコマンドです。
grepと組み合わせることで、指定パターンを含むファイルを検索できます。
findの"-print0"とxargsの"-0"はファイル名にスペース等を含んでいる場合有効なものですので、その可能性がない場合は外しても問題ありません。
個人的には、最も役に立っているコマンドの一つです。
find + xargsは組み合わせるコマンドによって様々な使い方ができますが、
ファイルの編集等を行う場合は注意しましょう(バックアップを取るか、コピーしたものに対して実行する等)。
nkf -Sw /path/to/file
日本語の書かれたファイルをコマンドラインで表示する場合に使います。
オプションは都度変わります。
上記の場合はsjis => utf8 です。
また、--overwriteオプションを付けることで、変換した結果でファイルを上書きすることができます。
同種のコマンドとして、 iconv -f sjis -t utf8 /path/to/file などもあります。
$ cat test.txt
▒▒͔L▒ł▒▒▒▒▒O▒͂܂▒▒▒▒▒▒B
$ nkf -Sw test.txt
吾輩は猫である。名前はまだ無い。
$ iconv -f sjis -t utf8 test.txt
吾輩は猫である。名前はまだ無い。
git log
cdやlsなどを除けば、履歴全体で最も多かったコマンドは実はこれでした。
コミットログを表示するコマンドですが、自動的にlessで表示するようになっています。
同種のコマンドとして、git reflog もありますが、
reflogはどちらかというと困ったときに使うイメージでしょうかね。
git archive HEAD `git diff --name-only HEAD HEAD^`
gitで最新コミットとひとつ前の差分を抽出する際に使います。
リリースを自動化しているような場合には出番のないコマンドですが、
わけあって手動リリースをする場合には、
tar等と組み合わせて使用すればあとはrsyncするだけというとても楽な状況になります。
git stash [show|pop|list|drop|clear]
stashはコミットせずに変更を一時退避するコマンドです。
あまりやりすぎると退避したものを管理できなくなるので、
git stash list でstashした一覧をチェック、git stash clearやgit stash drop で削除などしましょう。
// 一時退避
$ git stash
// 退避したものを戻す
$ git stash pop
git svn rebase / git svn dcommit
git-svnにおける、svn update / svn commit と同等のコマンドです。
最近はgit-svn自体使わなくなったので、あまり使用していません。
Subversionで管理しているところは今でもかなりあると思いますので、
gitへの移行の第一歩として、git-svnはよい選択だと思います。
php -a
あまり使いませんが、本番環境などで確認に使用することがあります。
php -l */.php
私の場合、ファイル内に変な文字が知らずにに入っていたりすることがあるので、 比較的利用頻度は高いです。
cat ~/.ssh/config
これ自体は要するに、sshの設定ファイルを表示しているコマンドです。
私の場合、sshの設定は大体IPアドレスなどではなくて、名前をつけています。
踏み台や鍵の設定も行っています。
よくあるパターンとしては以下のような設定です。
Host target-srv
Hostname 192.168.0.128
ProxyCommand ssh -W %h:%p jump-username@jump-host
IdentityFile ~/.ssh/id_rsa_target-srv
User target-username
- target-srv = 最終的な接続先サーバ
- jump-host = 踏み台サーバ
ruby -r xxx -e 'rubyコード'
あまり使い込んでいないので、オプションはよく知りませんが…
それほど利用頻度は高くありませんが、例えば以下のような感じで使っています。
$ ruby -r rss -e 'RSS::Parser.parse(open("index.rss").read).items.each {|i| puts i.title}'
perl -pi -e 's/from/to/g' /path/to/file
ファイル内の一括文字列置換に使用しています。
xargsへ渡して対象ファイルすべて置換する場合に重宝しています。
ワンライナーについて、sed/awk/perl等はネット上に過去の蓄積がたくさんありますので、
各自のニーズに応じたものを使えるようにしておくと、色々と捗ることが多いと思います。
"-pi.bak"にすると、バックアップファイルを保存できます。
ちなみにrubyでも以下のようなコマンドで同じことができます。
$ ruby -pi -e '$_.gsub! %q{from}, %q{to}' /path/to/file
あまり整理されていませんが、cp/mv/mkdir/ls/cat等の基本的なコマンドとこれらのコマンドとがあれば、かなりのことができると思います。