Table of Contents
The Silver Searcher (Ag), un grep diseñado para buscar dentro de código fuente
Web oficial de Ag: http://geoff.greer.fm/ag/ / https://github.com/ggreer/the_silver_searcher
Ventajas de Ag sobre grep y Ack.
- Más rápido de Ack y grep (hasta 10 veces más).
- Ignora los patrones de .gitignore y .hgignore.
- Patrones de ficheros a evitar por ag se definen en .agignore.
- Tiene las mismas posibilidades que Ack.
- Número de linea, resultados coloreados y recursivo por defecto.
- Visualización de resultados más agradable y amigable.
Compilar / instalar The Silver Searcher (Ag) en Centos / RedHat.
Descargar Ag de http://geoff.greer.fm/ag/, instalar dependencias, compilar e instalar.
yum -y install pcre-devel xz-devel yum -y groupinstall "Development Tools" tar -zxvf the_silver_searcher-0.29.1.tar.gz cd the_silver_searcher-0.29.1 ./configure make make install
En la mayoría de distribuciones populares “The Silver Searcher” (Ag) se encuentra en los repositorios.
Sintaxis
ag [FILE-TYPE] [OPTIONS] PATTERN [PATH]
Opciones de salida
- --ackmate Resultados en formato AckMate para parsear.
- -A --after [LINEAS] Líneas de impresión después del patrón / texto buscado (por defecto: 2).
- -B --before [LINES] Líneas de impresión anteriores al patrón / texto buscado (por defecto: 2).
- --[no]break Muestra o no líneas en blanco entre los patrones / texto encontrado en diferentes archivos (activado por defecto)
- -c --count Únicamente muestra el número de lineas con el patrón lineas buscado.
- --[no]color Resultados coloreados (activado por defecto).
- --color-line-number Los códigos de color para los números de línea (por defecto: 1; 33).
- --color-match Los códigos de color para los números de los partidos resultado (por defecto: 30; 43).
- --color-path Los códigos de color para los nombres de ruta (por defecto: 1; 32).
- --column Muestra la columna donde se encuentra el primer patrón encontrado en una linea dada.
- --[no]filename Muestra nombres de los archivos en el resultado.
- -H --[no]heading Muestra el nombre de los archivos en una cabecera (activado por defecto) y no por cada linea.
- -C --context [LINES] Muestra lineas anteriores y posteriores al patrón (por defecto: 2)
- --[no]group Igual a --[no]break --[no]heading
- -g PATTERN Buscar los ficheros cuyo nombre coincida con el patrón.
- -l --files-with-matches Sólo muestra los nombres de archivo no se imprimen las líneas coincidentes.
- -L --files-without-matches Sólo muestra muestra los nombres de los archivos que NO coinciden con el patrón.
- --[no]numbers Muestra la lineas donde se encuentra el patrón (por defecto) pero se omite cuando se buscan streams.
- -o --only-matching Muestra únicamente lo que coincide con el patrón buscado y no toda la linea.
- --print-long-lines Muestra los patrones en lineas de texto extremadamente largas (Por defecto > 2000 caracteres).
- --passthrough Durante la búsqueda en un stream mostrará todas las lineas pero solo colorea las que coincidan con el patrón.
- --silent Suprime todos los mensajes de registro, incluyendo los errores.
- --stats Muestra estadísticas de impresión (coincidencias, archivos / bytes escaneados y tiempo tomado) aun cuando se interrumpe con Cntrl + C.
- --vimgrep Muestra las salida como lo haría vimgrep (:vimgrep /pattern/g ).
- -0 --null --print0 Separa los nombres de archivos con 0 (por 'xargs -0').
NOTA1: Las opciones -A y -B no funcionan en stream (ej. comando | ag -A 5 texto). Patrón = Texto o Expresión regular.
Opciones de búsqueda de Ag
- -a --all-types Buscar en todos los archivos (no incluye los archivos ocultos ni los especificados en .gitignore, .hgignore y .agignore).
- -D --debug Modo depuración (probablemente no es útil).
- --depth NUM Buscar hasta NUM de subdirectorios (por defecto: 25)
- -f --follow Sigue los enlaces simbólicos.
- -F --fixed-strings Alias de --literal (para mantener la compatibilidad con grep).
- -G --file-search-regex PATTERN Limita la búsqueda a los ficheros con nombre que encajen con el patrón.
- --hidden Buscar archivos ocultos (no incluye los ficheros especificados en .gitignore, .hgignore y .agignore).
- -i --ignore-case Ignora el uso de mayúsculas o minúsculas (no case sensitive).
- --ignore PATTERN Ignorar archivos / directorios donde buscar según el patrón dado.
- --ignore-dir NAME Alias para --ignore para la compatibilidad con Ack.
- -m --max-count NUM Termina cuando se llega al numero de patrones encontrados (por defecto: 10000)
- --one-device No sigue enlaces a otros dispositivos.
- -p --path-to-agignore STRING Especificar ubicación de .agignore.
- -Q --literal No analiza el patrón como una expresión regular.
- -s --case-sensitive Sensible a mayúsculas y minúsculas.
- -S --smart-case Sensible a mayúsculas y minúsculas a menos que la expresión regular contenga caracteres en mayúsculas (activado por defecto).
- --search-binary Busca patrones en ficheros binarios (Por defecto los ignora).
- -t --all-text Buscar en todos los archivos de texto (no incluye archivos ocultos).
- -u --unrestricted Busca en todos los archivos (ignorando .agignore, .gitignore, etc).
- -U --skip-vcs-ignores Ignora ficheros .gitignore, .hgignore y .svnignore pero obedece a .agignore.
- -v --invert-match Invierte el resultado, muestra todo lo que no coincida con el patrón.
- -w --word-regexp Sólo busca palabras completas.
- -z --search-zip Buscar dentro de ficheros comprimidos (por ejemplo, gzip).
NOTA: El fichero .agignore utiliza los mismos patrones que .gitignore y .hgignore. Su uso puede mejorar drásticamente las velocidades de búsqueda.
Múltiples búsquedas en un solo comando (|).
ag --silent -z -C --column --stats --ignore /Desktop/ --ignore /prueba/ "perf interrupt took too long|r8169"
Tipos de archivo soportados
--actionscript .as .mxml --ada .ada .adb .ads --asm .asm .s --batch .bat .cmd --cc .c .h .xs --cfmx .cfc .cfm .cfml --clojure .clj .cljs .cljx --coffee .coffee --cpp .cpp .cc .C .cxx .m .hpp .hh .h .H .hxx --csharp .cs --css .css --delphi .pas .int .dfm .nfm .dof .dpk .dproj .groupproj .bdsgroup .bdsproj --elisp .el --erlang .erl .hrl --fortran .f .f77 .f90 .f95 .f03 .for .ftn .fpp --gettext .po .pot .mo --go .go --groovy .groovy .gtmpl .gpp .grunit --haml .haml --haskell .hs .lhs --hh .h --html .htm .html .shtml .xhtml --ini .ini --jade .jade --java .java .properties --js .js --json .json --jsp .jsp .jspx .jhtm .jhtml --less .less --liquid .liquid --lisp .lisp .lsp --lua .lua --m4 .m4 --make .Makefiles .mk .mak --markdown .markdown .mdown .mdwn .mkdn .mkd .md --mason .mas .mhtml .mpl .mtxt --matlab .m --mercury .m .moo --objc .m .h --objcpp .mm .h --ocaml .ml .mli .mll .mly --octave .m --parrot .pir .pasm .pmc .ops .pod .pg .tg --perl .pl .pm .pm6 .pod .t --php .php .phpt .php3 .php4 .php5 .phtml --plone .pt .cpt .metadata .cpy .py --python .py --rake .Rakefiles --rs .rs --ruby .rb .rhtml .rjs .rxml .erb .rake .spec --rust .rs --salt .sls --sass .sass .scss --scala .scala --scheme .scm .ss --shell .sh .bash .csh .tcsh .ksh .zsh --smalltalk .st --sql .sql .ctl --stylus .styl --swift .swift --tcl .tcl .itcl .itk --tex .tex .cls .sty --tt .tt .tt2 .ttml --vala .vala .vapi --vb .bas .cls .frm .ctl .vb .resx --verilog .v .vh .sv --vhdl .vhd .vhdl --vim .vim --xml .xml .dtd .xsl .xslt .ent --yaml .yaml .yml
Ejemplos de uso de Ag (The Silver Searcher)
Señalar con colores en tiempo real patrones de texto en un fichero de log
tail -f file.log | ag --passthrough --stats "perf interrupt took too long|r81[3-6]..0" [53491.479471] ag:18165 conflicting memory types f7800000-f7c00000 uncached-minus<->write-combining [53491.479475] reserve_memtype failed [mem 0xf7800000-0xf7bfffff], track uncached-minus, req uncached-minus [90621.726661] r8169 0000:02:00.0 enp2s0: link down [90754.138154] r8169 0000:02:00.0 enp2s0: link up [90768.535810] r8169 0000:02:00.0 enp2s0: link down [90798.978197] r8169 0000:02:00.0 enp2s0: link up [95513.515165] capability: warning: `VirtualBox' uses 32-bit capabilities (legacy support in use) [95526.938865] device enp2s0 entered promiscuous mode [126961.783618] perf interrupt took too long (2502 > 2495), lowering kernel.perf_event_max_sample_rate to 50100
Ejecutar comandos sobre los ficheros que tengan un determinado patrón de texto (“arreglar”).
ag -l arreglar *.txt | xargs file ext4pocho.txt: UTF-8 Unicode text ext4pocho2.txt: UTF-8 Unicode text # Sin usar --null y xargs -0 (No funciona porque espera el separador "0"). ag -l arreglar *.txt | xargs -0 file ext4pocho.txt ext4pocho2.txt : cannot open "ext4pocho.txt\012ext4pocho2.txt\012" (No such file or directory) # Usando --null y xargs -0 (Funciona). ag --null -l arreglar *.txt | xargs -0 file ext4pocho.txt: UTF-8 Unicode text ext4pocho2.txt: UTF-8 Unicode text
Buscar código con caracteres especiales en ficheros.
# No funcionará ya que interpreta la cadena como un expresión regex ag 'for var1 in "$@"' prueba.sh # Este sería el uso correcto, si se quieren sacar estadísticas --stats. ag -Q 'for var1 in "$@"' prueba.sh --stats 5:for var1 in "$@" 1 matches 1 files searched 118 bytes searched 0.010859 seconds