Herramienta destacada para buscar en archivos de texto estructurados con sangría.
Inspirado en ogrep de Matt Brubeck. Ese ogrep es compacto y hermoso, pero no tiene muchas funciones.
Véase también ogrep: versión de esta herramienta escrita en Python (para ser sinceros, fue la primera).
ogrep
es muy parecido grep
, ambos pueden buscar coincidencias y mostrar su contexto. Pero el contexto en grep
es "N líneas antes/después de la coincidencia", y en ogrep
es "líneas superiores coincidentes con una sangría inferior".
Déjame explicarte. Utilizo esta herramienta principalmente cuando trabajo con archivos de compilación GN, por lo que usaré un archivo BUILD.gn grande como ejemplo. La tarea habitual es buscar el nombre del archivo fuente y comprender qué destino incluye este archivo y bajo qué condiciones.
Busquemos menciones del archivo “arena.cc”:
# grep arena.cc BUILD.gn
"base/arena.cc",
Ok, ahora sabemos que nuestro archivo está aquí, pero no conocemos el destino. Preguntemos algo de contexto:
# grep -C2 arena.cc BUILD.gn
"base/address_tracker_linux.cc",
"base/address_tracker_linux.h",
"base/arena.cc",
"base/arena.h",
"base/backoff_entry.cc",
No, no es tan útil. Probemos ogrep
:
ogrep arena.cc BUILD.gn
102: component("net") {
385: if (!is_nacl) {
386: sources += [
409: "base/arena.cc",
¡Eso sí que es útil! Inmediatamente sabemos que el archivo está incluido en el destino "net" bajo la condición "!is_nacl".
Es aún mejor, porque ogrep
puede usar colores, aquí hay una imagen:
Instale Rust and Cargo, si aún no lo ha hecho, entonces
cargo install ogrep
Instale Homebrew, luego
brew install kriomant/ogrep-rs/ogrep-rs
Lo siento, todavía no, pero estoy trabajando en ello. Utilice Cargo por ahora.
Hay muchas opciones disponibles, ejecútelas con --help
para enumerarlas.
La herramienta es útil no sólo para archivos estrictamente basados en sangría (como el código fuente de Python) o archivos de compilación GN, sino también para una amplia gama de archivos de texto, porque incluso los que no están basados en sangría suelen estar formateados para mayor comodidad.
Incluso hay incorporados algunos trucos relacionados con C.
Aquí hay una breve lista de características:
El patrón es texto fijo de forma predeterminada, pero puede usar una expresión regular arbitraria con -e
.
Los habituales -w
(coincidencia de palabras completas) y -i
(búsqueda que no distingue entre mayúsculas y minúsculas) están disponibles.
La herramienta conserva algunas líneas en blanco entre coincidencias, ya que ayuda a separar visualmente grupos de coincidencias relacionadas; puedes desactivarla con --no-breaks
.
A veces es útil ver si había otras líneas entre las que coinciden. Utilice --ellipsis
para eso.
Si integra otool
con herramientas externas, las opciones --print-filename
pueden ser útiles, le indica que imprima el nombre del archivo si se encuentra alguna coincidencia.
De forma predeterminada, las ramas "if-else" se tratan de forma especial: las ramas if se conservan para que puedas conocer las condiciones incluso cuando se encuentra una coincidencia en la rama "else":
El contexto tradicional (que muestra N líneas iniciales y/o finales alrededor de una coincidente) también es compatible con las opciones --context/-C
, --before-context/-B
y --after-context/-A
.
# ./ogrep filename_util_icu BUILD.gn
102: component("net") {
2106: if (!is_nacl) {
2210: if (use_platform_icu_alternatives) {
2222: } else {
2228: sources += [
2229: "base/filename_util_icu.cc",
Esto se puede desactivar con --no-smart-branches
.
--no-ignore-preprocessor
.Está previsto un manejo más inteligente de las instrucciones del preprocesador (contexto paralelo).
otool
está destinado a buscar en un solo archivo. Y no es tan rápido para buscar entre muchos archivos. Pero puedes integrarlo con otras herramientas de búsqueda como esta:
grep -l cache_used -r . --include='*.cc' | xargs -n1 ogrep --print-filename cache_used
git grep
ogrep
tiene integración incorporada con git grep
: cuando se proporciona la opción -g
, el segundo argumento se pasa a git grep
como especificación de ruta. Todas las opciones relevantes ( -w
, -i
, etc.) también se pasan a git grep
automáticamente, se fuerza --print-filename
.
ogrep -g cache_used '*.cc'