Base de conocimiento

Creado por eth0
2011-04-06
10:14:06

Categorías
Etiquetas

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.