Bashで使えるパイプ・リダイレクト関連の小技集。アップデートしていきたいなぁ。
コマンドの出力をdiff
比べたい内容の片方がファイルで、もう片方がコマンド出力の場合は、-
引数を使ってコマンド出力を標準入力に流してやればよい。しかし両方がコマンド出力の場合はこのような事はできないので、代わりにプロセス置換(<(...)
)を使う。これで一時ファイルに格納してやる必要が無くなる。
$ diff <(ps -A) <(ps -e)
238d237
< 31640 pts/1 00:00:00 bash
241d239
< 31643 pts/1 00:00:00 ps
-e
と-A
が本当に同じか比べるつもりだったが・・・ま、そうなりますよね。
ps + grepでヘッダを表示する
ps
コマンドの出力を単純にgrep
するとヘッダが失われてしまう。
$ ps -e | grep solaar
2743 ? 00:03:30 solaar
ヘッダも出力するにはグループコマンドを使えばよい。最後の;
は必須。
$ ps -e | { head -n 1; grep solaar; }
PID TTY TIME CMD
2743 ? 00:03:30 solaar
grep
の代わりにsed
を使うというのもアリ。
$ ps -e | sed -e '1p;1d;/solaar/p;d'
PID TTY TIME CMD
2743 ? 00:03:32 solaar
ただ、大抵の場合はps -C
で事足りるかもしれない。
$ ps -C solaar
PID TTY TIME CMD
2743 ? 00:03:32 solaar
ちょっとした文字列を標準入力する
例えばsed
は標準入力を受け付けてくれるが、Ctrl-d
を押すまでは停止しない。しかし、スクリプトのデバッグ中は結果だけ表示して、さっさと終了して欲しい。かと言って一時ファイルを作るのも面倒くさい。そんな時はヒアストリング(<<<
)が使える。
$ sed -e 's/\(..\)\/\(..\)\/\(....\)/\3\/\1\/\2/' <<<06/03/2016
2016/06/03