grepをfindの代わりに使う


アニメ『Occultic;Nine -オカルティック・ナイン-』(2016)

オカルトな人たちが9人集まるんでしょうか。まだよく分かってませんが、まだ2話しか見てないので、3人集まったぐらいです。主人公がさっそく何かまずいことに巻き込まれていて、少し怖い。大丈夫だろうか。謎だらけです。

linuxの主要コマンド9つ挙げろと言われても、コマンドが多すぎて9つに絞れないですが、grepやfindあたりは絶対入っている気がします。特にgrepは優秀で、grepでfind(の一部の仕事なら)をすることができるけども(遅いけど)、findでgrepの代わりの作業をすることができません。今回はこのgrepについて考えます。

(Linux入門はコチラ→中級者のためのLinuxコマンド入門)

grep の-rオプションでディレクトリを再帰的に検索することができますが、すべてのファイルから文字列検索してしまいます。

takk@deb83:~/bread$ grep -r main *
バイナリファイル mcu/avr/attiny26/hello.o に一致しました
バイナリファイル mcu/avr/attiny26/hello に一致しました
mcu/avr/attiny26/hello.c:int main(void)
バイナリファイル mcu/avr/attiny2313/hello.o に一致しました
バイナリファイル mcu/avr/attiny2313/hello に一致しました
mcu/avr/attiny2313/hello.c:int main(void)
バイナリファイル mcu/avr/attiny2313/device/clcd/hello.o に一致しました
バイナリファイル mcu/avr/attiny2313/device/clcd/hello に一致しました
mcu/avr/attiny2313/device/clcd/hello.c:int main(void)
バイナリファイル mcu/avr/attiny2313/device/a-3880eg/hello.o に一致しました
バイナリファイル mcu/avr/attiny2313/device/a-3880eg/hello に一致しました
mcu/avr/attiny2313/device/a-3880eg/hello.c:int main()
バイナリファイル mcu/avr/attiny2313/device/c-7seg/hello.o に一致しました
バイナリファイル mcu/avr/attiny2313/device/c-7seg/hello に一致しました
mcu/avr/attiny2313/device/c-7seg/hello.c:int main()
バイナリファイル mcu/avr/attiny2313/device/tc1602e-13a/hello.o に一致しました
バイナリファイル mcu/avr/attiny2313/device/tc1602e-13a/hello に一致しました
mcu/avr/attiny2313/device/tc1602e-13a/hello.c:int main(void)
バイナリファイル mcu/avr/attiny2313/device/7seg-4digit/hello.o に一致しました
バイナリファイル mcu/avr/attiny2313/device/7seg-4digit/hello に一致しました
mcu/avr/attiny2313/device/7seg-4digit/hello.c:int main()
バイナリファイル mcu/avr/attiny85/hello.o に一致しました
バイナリファイル mcu/avr/attiny85/hello に一致しました
mcu/avr/attiny85/hello.c:int main(void)

ファイルサイズが小さい場合は良いのですが、大きくなると、バイナリファイルは最初から除外したいです。

バイナリファイルを検索対象から外すオプションは-Iです。

takk@deb83:~/bread$ grep -Ir main *
mcu/avr/attiny26/hello.c:int main(void)
mcu/avr/attiny2313/hello.c:int main(void)
mcu/avr/attiny2313/device/clcd/hello.c:int main(void)
mcu/avr/attiny2313/device/a-3880eg/hello.c:int main()
mcu/avr/attiny2313/device/c-7seg/hello.c:int main()
mcu/avr/attiny2313/device/tc1602e-13a/hello.c:int main(void)
mcu/avr/attiny2313/device/7seg-4digit/hello.c:int main()
mcu/avr/attiny85/hello.c:int main(void)
takk@deb83:~/bread$ 

この-Iオプションを使用すると、テキストファイルの一覧を作成する時など、grepをfindの代わりに使うことができます。

takk@deb83:~/bread$ grep . -Irl *
bread.sh
mcu/avr/attiny26/breadboard.sh
mcu/avr/attiny26/hello.hex
mcu/avr/attiny26/makefile
mcu/avr/attiny26/hello.c
mcu/avr/attiny2313/breadboard.sh
mcu/avr/attiny2313/hello.hex
mcu/avr/attiny2313/makefile
mcu/avr/attiny2313/hello.c
mcu/avr/attiny2313/device/clcd/hello.hex
mcu/avr/attiny2313/device/clcd/makefile
mcu/avr/attiny2313/device/clcd/hello.c
mcu/avr/attiny2313/device/a-3880eg/hello.hex
mcu/avr/attiny2313/device/a-3880eg/makefile
mcu/avr/attiny2313/device/a-3880eg/hello.c
mcu/avr/attiny2313/device/c-7seg/hello.hex
mcu/avr/attiny2313/device/c-7seg/makefile
mcu/avr/attiny2313/device/c-7seg/hello.c
mcu/avr/attiny2313/device/tc1602e-13a/breadboard.sh
mcu/avr/attiny2313/device/tc1602e-13a/hello.hex
mcu/avr/attiny2313/device/tc1602e-13a/makefile
mcu/avr/attiny2313/device/tc1602e-13a/hello.c
mcu/avr/attiny2313/device/7seg-4digit/hello.hex
mcu/avr/attiny2313/device/7seg-4digit/makefile
mcu/avr/attiny2313/device/7seg-4digit/hello.c
mcu/avr/attiny85/breadboard.sh
mcu/avr/attiny85/hello.hex
mcu/avr/attiny85/makefile
mcu/avr/attiny85/hello.c
sample.sh
takk@deb83:~/bread$ 

本当にテキストか確認してみましょう。

takk@deb83:~/bread$ file `!!`
file `grep . -Irl *`
bread.sh:                                            ASCII text
mcu/avr/attiny26/breadboard.sh:                      ASCII text
mcu/avr/attiny26/hello.hex:                          ASCII text, with CRLF line terminators
mcu/avr/attiny26/makefile:                           ASCII text
mcu/avr/attiny26/hello.c:                            C source, ASCII text
mcu/avr/attiny2313/breadboard.sh:                    ASCII text
mcu/avr/attiny2313/hello.hex:                        ASCII text, with CRLF line terminators
mcu/avr/attiny2313/makefile:                         ASCII text
mcu/avr/attiny2313/hello.c:                          C source, ASCII text
mcu/avr/attiny2313/device/clcd/hello.hex:            ASCII text, with CRLF line terminators
mcu/avr/attiny2313/device/clcd/makefile:             ASCII text
mcu/avr/attiny2313/device/clcd/hello.c:              C source, ASCII text
mcu/avr/attiny2313/device/a-3880eg/hello.hex:        ASCII text, with CRLF line terminators
mcu/avr/attiny2313/device/a-3880eg/makefile:         ASCII text
mcu/avr/attiny2313/device/a-3880eg/hello.c:          C source, ASCII text
mcu/avr/attiny2313/device/c-7seg/hello.hex:          ASCII text, with CRLF line terminators
mcu/avr/attiny2313/device/c-7seg/makefile:           ASCII text
mcu/avr/attiny2313/device/c-7seg/hello.c:            C source, ASCII text
mcu/avr/attiny2313/device/tc1602e-13a/breadboard.sh: ASCII text
mcu/avr/attiny2313/device/tc1602e-13a/hello.hex:     ASCII text, with CRLF line terminators
mcu/avr/attiny2313/device/tc1602e-13a/makefile:      ASCII text
mcu/avr/attiny2313/device/tc1602e-13a/hello.c:       C source, ASCII text
mcu/avr/attiny2313/device/7seg-4digit/hello.hex:     ASCII text, with CRLF line terminators
mcu/avr/attiny2313/device/7seg-4digit/makefile:      ASCII text
mcu/avr/attiny2313/device/7seg-4digit/hello.c:       C source, ASCII text
mcu/avr/attiny85/breadboard.sh:                      ASCII text
mcu/avr/attiny85/hello.hex:                          ASCII text, with CRLF line terminators
mcu/avr/attiny85/makefile:                           ASCII text
mcu/avr/attiny85/hello.c:                            C source, ASCII text
sample.sh:                                           ASCII text
takk@deb83:~/bread$ 

find -nameをgrepでやってみましょう。まずはfind

takk@deb83:~/bread$ find -name makefile
./mcu/avr/attiny26/makefile
./mcu/avr/attiny2313/makefile
./mcu/avr/attiny2313/device/clcd/makefile
./mcu/avr/attiny2313/device/a-3880eg/makefile
./mcu/avr/attiny2313/device/c-7seg/makefile
./mcu/avr/attiny2313/device/tc1602e-13a/makefile
./mcu/avr/attiny2313/device/7seg-4digit/makefile
./mcu/avr/attiny85/makefile
takk@deb83:~/bread$ 

grep。

takk@deb83:~/bread$ grep . -rl * | grep makefile
mcu/avr/attiny26/makefile
mcu/avr/attiny2313/makefile
mcu/avr/attiny2313/device/clcd/makefile
mcu/avr/attiny2313/device/a-3880eg/makefile
mcu/avr/attiny2313/device/c-7seg/makefile
mcu/avr/attiny2313/device/tc1602e-13a/makefile
mcu/avr/attiny2313/device/7seg-4digit/makefile
mcu/avr/attiny85/makefile
takk@deb83:~/bread$ 

grepはすごいです。

コメント

タイトルとURLをコピーしました