PR TIMESデザイナー&エンジニアブログ BREAK TIMES

PR TIMES Developer Blog(デザイナー&エンジニアによる開発者ブログ)

PR TIMES Developer Blog

当ブログは下記URLに移転しました。
https://developers.prtimes.jp/

日常使用しているコマンドラインの紹介

PR TIMESの開発チームで主にサーバサイドを担当しているものです。 ここでは仮に「アカイ」としておきます。

過去数か月分なのでほとんどさわりだけになりますが、現在日常的に使用している開発環境のbash_historyから、なにかしら有用だと思われるようなコマンドを抜き出して掲載いたします。

おそらく日頃からコマンドラインに慣れ親しんでいる人にはわかりきっているものだと思いますので、こっちのほうがいいよ、みたいな話があればぜひ教えていただきたいと思います。

historyはgit関係のコマンドが圧倒的に多くなっていますが、便利そうなものだけに絞っています(gitは解説している文書がネット上にたくさんありますので、そちらをを見ていただいた方がよいと思います)。

Pro 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の引数'-'は、ログインシェルを実行します(そのユーザで直接ログインした場合と同じ状態)。

最近では、MacOSXubuntu等でコンピュータの管理を行う際に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はよい選択だと思います。

Git svnではじめる忍者のごとく潜むgit

php -a

phpインタラクティブモードです。

あまり使いませんが、本番環境などで確認に使用することがあります。

php -l */.php

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ワンライナーを書くときはこうやっています。

あまり使い込んでいないので、オプションはよく知りませんが…

それほど利用頻度は高くありませんが、例えば以下のような感じで使っています。

$ 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

perlruby はいささか反則気味ですね。

あまり整理されていませんが、cp/mv/mkdir/ls/cat等の基本的なコマンドとこれらのコマンドとがあれば、かなりのことができると思います。