クールでカッコイイ用法を発見したら随時追記していこうと思います。
ハイフンで標準入出力
コマンドでファイル名を渡す際にハイフンを指定すると基本的には標準入力(標準出力)として解釈してくれます。
たとえばcatコマンドで使うとキーボード入力をそのまま表示してくれます。
~$ cat -
hoge (←入力)
hoge
nullpo (←入力)
nullpo
特定の出力結果をファイルを引数にとるコマンドへ渡したいときに、一旦テンポラリファイルを作って・・・とかしたり、ファイル出力するコマンドを標準出力へそのまま出したい、などいろいろ利用できます。
事例集
wgetで取得したURLの内容を標準出力へ
wgetはデフォルトでURL名の最後の方をみてファイルを宜しく作ってくれるのですが、-O (--output-document=) オプションでファイル名を指定できますので、ファイル名にハイフンを渡してあげるとそのまま標準出力へ出てきます。
~$ wget http://www.example.com/ --output-document=-
ここからたとえばリンクを抽出したい場合は、
~$ wget http://www.example.com/ --output-document=- 2>>/dev/null | grep href
<p><a href="http://www.iana.org/domains/example">More information...</a></p>
とかやると(簡易なものなので正確に抽出できるかどうかは別ですが)、わりとさっくりと抽出できます。
curlコマンドでも同じようなことはできますが、あちらは細かくいろいろできる代わりにオプションが多少複雑なので、ヘッダを弄るみたいなことをしないときはさっとできるwgetをよく自分は利用します。何より左手だけでコマンドが打てる
diffで標準入力と特定のファイルを比較する
sedやらなんやらで置換した結果と特定ファイルのdiffを取ることもできます。
~$ sed "s/(なんか)/(おきかえ)/g" nullpo1.txt | diff - nullpo2.txt
似たようなファイルが2つあったときに「これってココが違うだけであとは一緒なのかな?」とか思ったときに置換+標準入力からのdiffとかササッとできるとかっこいい!
vimで標準入力を表示・編集する
自分の中ではわりと登場機会が多いvim(or 各種エディタ)へ標準入力を渡してしまう方法です。出力結果をハイライト付きで見たいけどいちいちテンポラリファイル作ってエディタで開きなおすのもめんどいときにはこんなかんじ。
~$ diff nullpo1.txt nullpo2.txt | vim -
git diff なんかもlessやmoreなんかのページャが起動しますが、これもハイライトしてほしいなぁと思ったらvimへパイプで渡すとあら不思議。
~/nullpoRepos$ git diff | vim -
ここから名前をつけて保存するのも可能です。
scpで転送したアーカイブファイルを直接展開
別サーバにあるアーカイブファイルを一旦自サーバに持ってきて展開とかしようとすると通常は
~$ scp NullpoHost:~/archive.tgz .
~$ tar zxvpf archive.tgz
~$ rm archive.tgz # 元ファイルがもう不要なら
といったかんじになると思いますが、これすらもハイフンを使えばアーカイブファイルの残骸すら残さず一発でできるようになります。
~$ ssh NullpoHost "cat ~/archive.tgz" | tar zxvpf -
sshしてアーカイブのバイナリを直接catした内容をそのままtarに渡すような流れですね。
いちおうメリットとしては通常時にはアーカイブファイル+展開されたファイルで多く取られる容量がアーカイブファイル分だけ削減されるという点がありますが、ファイルサイズが大きくなってきた時の負荷とか転送速度などの
影響はあるかもしれません・・。
(sshコマンドでファイル内容をダダ流しするよりも、ファイル転送コマンドを自負しているscp先生にお任せする方がいろいろ最適化されていそうではありますが)
おわりに
このハイフンを知ってからホームディレクトリ内のaとかhogeみたいな、もはやいつ何に使ったのかわからないファイルが激減しました!スッキリ!(なくなったとは言ってない)