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