===== 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