Ack-grep, un grep en esteroides
Programador, ¿has necesitado alguna vez buscar un texto en tus ficheros fuente de tu directorio de trabajo, excluyendo los directorios de Subversion, Git o lo que sea que uses? ¿Has necesitado buscar sólo en ciertos tipos de fichero?.
Ya sé que la respuesta es “un montón de veces”. Y también sé que, si no conoces esta utilidad, lo más seguro es que uses grep con varias opciones y luego filtres los resultados con varios greps más hasta dar con lo que buscas.
Pues bien, dichas tareas se hacen muchísimo más fáciles y llevaderas cuando uno descubre la utilidad ack-grep.
Vamos directamente con el caso más sencillo:
$ ack-grep texto
Si os fijáis, no le hemos dicho a ack-grep que busque en todos los ficheros; ni siquiera le hemos dicho que busque recursivamente: eso ack-grep ya lo da por sentado. El comando anterior busca el texto en todos los ficheros del árbol de directorios actual, ignorando ficheros temporales y directorios típicos de sistemas de control de versiones, y presenta los resultados resaltados y coloreados.
Hay bastantes más opciones que se pueden usar, explicadas en la página de manual de ack-grep. No obstante, aquí explicaré las opciones para buscar en tipos de fichero concretos.
Ack-grep soporta la búsqueda en tipos de fichero concretos. Esta es la lista de
tipos de fichero que ack-grep soporta, que puede obtenerse escribiendo ack-grep
--help type
en la línea de comandos:
--[no]actionscript .as .mxml
--[no]ada .ada .adb .ads
--[no]asm .asm .s
--[no]batch .bat .cmd
--[no]binary Binary files, as defined by Perl's -B op (default: off)
--[no]cc .c .h .xs
--[no]cfmx .cfc .cfm .cfml
--[no]cpp .cpp .cc .cxx .m .hpp .hh .h .hxx
--[no]csharp .cs
--[no]css .css
--[no]elisp .el
--[no]erlang .erl .hrl
--[no]fortran .f .f77 .f90 .f95 .f03 .for .ftn .fpp
--[no]haskell .hs .lhs
--[no]hh .h
--[no]html .htm .html .shtml .xhtml
--[no]java .java .properties
--[no]js .js
--[no]jsp .jsp .jspx .jhtm .jhtml
--[no]lisp .lisp .lsp
--[no]lua .lua
--[no]make Makefiles
--[no]mason .mas .mhtml .mpl .mtxt
--[no]objc .m .h
--[no]objcpp .mm .h
--[no]ocaml .ml .mli
--[no]parrot .pir .pasm .pmc .ops .pod .pg .tg
--[no]perl .pl .pm .pod .t
--[no]php .php .phpt .php3 .php4 .php5 .phtml
--[no]plone .pt .cpt .metadata .cpy .py
--[no]python .py
--[no]rake Rakefiles
--[no]ruby .rb .rhtml .rjs .rxml .erb .rake
--[no]scala .scala
--[no]scheme .scm .ss
--[no]shell .sh .bash .csh .tcsh .ksh .zsh
--[no]skipped Files, but not directories, normally skipped by ack (default: off)
--[no]smalltalk .st
--[no]sql .sql .ctl
--[no]tcl .tcl .itcl .itk
--[no]tex .tex .cls .sty
--[no]text Text files, as defined by Perl's -T op (default: off)
--[no]tt .tt .tt2 .ttml
--[no]vb .bas .cls .frm .ctl .vb .resx
--[no]vim .vim
--[no]xml .xml .dtd .xslt .ent
--[no]yaml .yaml .yml
De esta forma, si se quiere buscar un texto en el árbol de directorios actual pero sólo en los scripts Python, usaríamos la siguiente orden:
$ ack-grep --python texto
O si queremos buscar en todos los ficheros menos en los documentos XML, ejecutaríamos el siguiente comando:
$ ack-grep --noxml texto
Esto es sólo una pequeña parte de lo que se puede hacer con ack-grep.