[linux] grepでファイル単位の検索条件

grepを使うときは基本的に1行の中のパターンを検索するし、たいていの場合はそれで問題ない。
でも、たまに条件に合致するファイルを抽出する必要がでてきたりするよね。
行単位ではなく、ファイル単位での検索条件を考えてみよう。

準備

今回、試したのはGNU grep。
また、確認用のファイルとしてtest1,test2,test3を用意する。

[unix] 標準出力の接続先によって、動作を変える

[unix] パイプ処理時のバッファリングではgrepやsedに出力のバッファリングオプションがオプションがあるのを見た。
他にも出力先によって、動作が変わるコマンドはある。

lsの出力

例えば、lsも出力先が端末だと、ファイル名を適当に区切って並べてくれるけど、出力先がパイプだと、ファイル名を縦に並べる。
むしろ、縦に並べる方が本来で、端末の場合は見やすくしてくれていると考えた方がいいかもしれない。

[unix] パイプ処理時のバッファリング

xargsで出力を遅延させる

フィルタの役割をするコマンドは大抵バッファリングするので、teeとかでデバッグしていると、フィルタリングされたテキストがすぐに端末に表示されないことがある。
何かバッファリングの効果を目に見えるように再現できるいい方法はないかなと思ってやってみたけど、xargsを使って、無理やり出力を遅延させるのがわかりやすいかなぁ。

例えば、これだとコマンド実行の2秒後に"2"が表示される。
$ seq 10 | xargs -I% sh -c 'sleep 1; echo %' | grep 2
2
$

[sed] sedのホールドスペースの練習

[awk,Ruby,C#,Java]いくつかの言語でフィボナッチ数生成でawkとかを使ってフィボナッチ数列を生成したけど、sedでこれができないかなーと思ってやってみた。

sedでフィボナッチ数列生成

sedは数値演算を直接サポートしていないので、文字列の長さを数字とみなしてみる。

[awk] awkで指定行毎に改行除去

行区切りのデータを適当な行数でまとめるで paste を使って、指定行毎に改行を除去する方法を書いたけど、改めて見ると、こんなの awk で簡単にできるじゃん。

指定行毎に改行を除去するってのは
1
2
3
4
5
6