Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.

For the best experience please use the latest Chrome or Safari browser. Firefox 10 (to be released soon) will also handle it.

カジュアルにターミナルを

第二回DevLOVEターミナル勉強会

Version :1.0 of 2012/03/26

Author :SUZUKI Masashi / masasuzu

Mail :m15.suzuki.masashi@gmail.com

Agenda

  1. 自己紹介とか.
  2. ターミナルを使う.
  3. コードを書く.
  4. ログを見る.

自己紹介とか

コンテキストとか

普段のお仕事環境

クライアントマシン :Windows7

ターミナル :mintty

開発マシン :Debian Lenny

Client PC
(mintty on Windows)
    |
    |
    |  ssh    Development Machine
    +-------> (Debian Lenny on VM)
                |
                |  ssh    IDC
                +-------> (Debian Lenny)

前回

第一回ターミナル勉強会で普段のターミナルの使い方について話をさせていただきました。

今回

一歩進めてカジュアルな感じで、もうちょっとターミナルを便利に使うために覚えると便利かもしれないコマンドの使い方を.zsh_historyから適当に拾ってきて紹介します。

濃いお話はきっと ようぞうさんや 尾形さんにしていただけると思いますのでカジュアルな感じで行きます。

基本、debian lennyで確認しています。macとかだと動かないかも。

ターミナルを使う

コマンドライン編集

コマンドラインはデフォルトで、emacsキーバインドになっています。 emacsキーバインドを覚えておくと効率よくコマンドラインを編集することができるようになります。

set -oで変更することができます。

set -o vi
set -o emacs

emacsキーバインド

emacsキーバインド cont.

emacsキーバインド cont..

ヒストリー

fc

コマンドラインをエディタで編集できます。EDITOR変数に指定されているエディタが立ち上がります。

コードを書く

vim

vim -c

普段エディタはvimを使っています。-cオプションを付けると起動時にコマンドを実行してくれます。

vim -c ":NERDTree"

vim -d

diffを使っても良いんですが、vimでシンタックスハイライトをしてくれるので、ハイライト大好きな人なら使っておいて損は無いかと。

また、vimで開いているのでその場で編集できます。

vim -d  ${FILE1} ${FILE2}
vimdiff ${FILE1} ${FILE2}

vim -b -c ':%!xxd'

バイナリも開けるよ。 使ったことはほぼないですが。。。

vim -b -c ':%!xxd' ${FILE}

vim -R

読み込み専用モードで開く。シンタックスハイライトが(ry

※ 本番サーバではlessとかlv使ってね。

vim -R ${FILE}
view   ${FILE}

コードを探す

grep

grep -r

再帰的に検索してくれます。

grep -r          ${PATTERN} ./
grep --recursive ${PATTERN} ./
grep -d recurse  ${PATTERN} ./
grep --directories=recurse ${PATTERN} ./

grep -n

行数を表示します。

grep -rn ${PATTERN} ./

grep -A -B -C

"-A n"でマッチした行の後ろの行n行、"-B n"でマッチした行の前n行も表示してくれます。 "-C n"で前後n行を表示します。

メソッドとかの使用コンテキストを知りたい時に使うと便利。

grep -r -A3 -B3 ${PATTERN} ./
grep -r -C3     ${PATTERN} ./

grep --exclude-dir

除外ディレクトリを指定できます。.gitとか.svmとかを除外しておくと良いです。

grep -r --exclude-dir=".git" ${PATTERN} ./

grep --color

検索結果を色づけしてくれます。

grep -r --color=auto --exclude-dir=.git ${PATTERN} ./

grep -v

マッチしない行を返してくれます。 検索の絞り込みとかに使うと便利ですね。

grep -r ${PATTERN1} ./ | grep -v ${PATTERN2}

grep -w -x

"-w"オプションは単語としてマッチした行、"-x"オプションは行としてマッチした行を返してくれます。

"-w"オプションは変数名とかメソッド名を探す時に使えるかな。

grep -r  -w            ${PATTERN} ./
grep -r  --word-regexp ${PATTERN} ./

grep -r  -x            ${PATTERN} ./
grep -r  --line-regexp ${PATTERN} ./

grep -h

ファイル名を表示させません。パイプラインに喰わせる時に使います。

grep -c

ファイル毎でマッチした回数をカウントします。

grep -rc ${PATTERN} ./

awkとかに喰わせれば、プロジェクト内でメソッドが合計でどれくらい使われているかとか測ったりもできます。

grep -rwhc ${PATTERN} ./ | awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'
grep -rwhc ${PATTERN} ./ | perl -E 'my $c; while (<STDIN>) { chomp; $c += $_; }; say $c'

grep -c cont.

そんな面倒なことしなくても、wc -lに喰わせれば良いのでした。

grep -rw ${PATTERN} ./ | wc -l

grep -l -L

"-l"オプションでマッチしたファイル名を表示、"-L"オプションでマッチしなかったファイル名を表示します。

grep -rwl                     ${PATTERN} ./
grep -rw --files-with-matches ${PATTERN} ./

grep -rwL                      ${PATTERN} ./
grep -rw --files-without-match ${PATTERN} ./

grep -rwl ${PATTERN} ./ | wc -l

grepその他

GREP_OPTIONS変数

GREP_OPTIONS変数を定義しておくと、grep使用時に指定されたオプションを付けてくれます。

"--recursive"とか"--color"あたりを.zshrcとかに入れておくと良いでしょう。

GREP_OPTIONS="--recursive --color=auto --exclude-dir=.git"

ack

Perlで実装されたgrep互換のコマンド。 cpanだとApp::Ack、debianだとack-grepってパッケージ名になっているはず。

デフォルトで、色づけされていたり、再帰的に検索してくれるので、カジュアルに使うにはgrepよりは便利。

git grep

gitを使っているなら素直にgit grep使った方が良いシーンが多いと思います。 grep本体より低機能。

ログを見る

date

現在時刻を表示するコマンド。フォーマットを指定することもできるので、日にちでローテションしているログファイルにアクセスするのに使えます。

tail -f /usr/local/apache/logs/$( date +"%Y/%m/error.%Y_%m%d").log
# tail -f /usr/local/apache/logs/2012/03/error.2012_0326.log

こういうのは毎回打つのが面倒なので、パスの通ったところに実行権を付けてスクリプトファイルにしておくと再利用できて便利です。

tail -f $(apache_error_log)

tail

tailfをgrepに喰わせることで、フィルタリングすることもできます。

tail -f /var/log/any.log | fgrep error

sedで特定の単語をansii colorで色づけしてあげることもできます。

tail -f /var/log/any.log | sed -e 's/\([error]\)/\x1b[33m\1\x1b[0m/g'

ssh

ssh接続先に一番最後の引数にコマンドを指定すると接続先にコマンドを実行することがでいます。

こんな感じで、リモートサーバのエラーログを見ることができます。

ssh 192.168.1.2 "tail -100 /var/log/any.log | fgrep [error]"

最後に

拙い発表ですが、明日からの現場に役立つことが1つでもあれば幸いです。

私自身ターミナルの達人には遠いと思っているので、これ違うよとかもっと便利な方法があるよとかありましたら、次回のターミナル勉強会で是非発表していただけるとありがたいです。

求む。達人ターミナル使い。

Thank you.

Use a spacebar or arrow keys to navigate