アニメ『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はすごいです。
コメント