User Tools

Site Tools


the_silver_searcher_el_grep_para_programadores

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.

  1. Más rápido de Ack y grep (hasta 10 veces más).
  2. Ignora los patrones de .gitignore y .hgignore.
  3. Patrones de ficheros a evitar por ag se definen en .agignore.
  4. Tiene las mismas posibilidades que Ack.
  5. Número de linea, resultados coloreados y recursivo por defecto.
  6. 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
the_silver_searcher_el_grep_para_programadores.txt · Last modified: 2020/12/25 22:57 by 127.0.0.1