Quiero ejecutar ack o grep en archivos HTML que a menudo tienen líneas muy largas. No quiero ver filas muy largas que se envuelven repetidamente. Pero quiero ver solo esa parte de una línea larga que rodea una cadena que coincide con la expresión regular. ¿Cómo puedo obtener esto usando cualquier combinación de herramientas Unix?
90
ack
? ¿Es un comando que usa cuando no le gusta algo? Algo comoack file_with_long_lines | grep pattern
? :-)ack
(conocido comoack-grep
Debian) usagrep
esteroides. También tiene la--thpppt
opción (no es broma). betterthangrep.com--thpppt
característica es algo controvertido, la ventaja clave parece ser que puede utilizar expresiones regulares Perl directamente, no un loco[[:space:]]
y personajes como{
,[
, etc. cambiando el significado con el-e
y-E
cambia de una manera que es imposible recordar.Respuestas:
Puede usar la opción grep
-o
, posiblemente en combinación con cambiar su patrón".{0,10}<original pattern>.{0,10}"
para ver algo de contexto a su alrededor:..o
-c
:fuente
$ echo "eeeeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwwwrrrrrrrrrrrrrrrrrrrrr" > fileonelongline.txt && grep -oE ".{0,20}MYSTRING.{0,20}" ./fileonelongline.txt
impresionesqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwww
oE ".{0,20}mysearchstring.{0,20}"
se pierde el resaltado de la cadena "original" interna en el contexto, porque todo se convierte en el patrón de búsqueda. Me encantaría encontrar una manera de mantener un contexto no resaltado alrededor de los resultados de búsqueda, para un escaneo visual y una interpretación de resultados mucho más fáciles.-oE ".{0,x}foo.{0,x}"
enfoque (dondex
está el número de caracteres del contexto) - append `| grep foo `hasta el final. Funciona para soluciones ack o grep. Más soluciones también aquí: unix.stackexchange.com/questions/163726/…Transmita sus resultados
cut
. También estoy considerando agregar un--cut
interruptor para que pueda decir--cut=80
y obtener solo 80 columnas.fuente
| cut=c1-120
al grep, funcionó para mí (aunque no sé cómo cortar el texto coincidente)| cut=c1-120
no funcionó para mí, necesitaba hacerlo| cut -c1-120
| cut -c 1-100
stackoverflow.com/a/48954102/1815624--no-wrap
opción que usa$COLUMNS
?Podría usar menos como buscapersonas para ack y cortar líneas largas:
ack --pager="less -S"
esto retiene la línea larga pero la deja en una línea en lugar de envolverla. Para ver más de la línea, desplácese hacia la izquierda / derecha en menos con las teclas de flecha.Tengo la siguiente configuración de alias para que ack haga esto:
fuente
--pager
comando en su archivo ~ / .ackrc, si siempre quiere usarlo.ack
.ack
es prácticamente igualgrep
, solo que más simple en los casos más comunesobtiene caracteres del 1 al 100.
fuente
Tomado de: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/
El enfoque sugerido
".{0,10}<original pattern>.{0,10}"
es perfectamente bueno, excepto que el color de resaltado a menudo está desordenado. Creé un script con una salida similar, pero el color también se conserva:#!/bin/bash # Usage: # grepl PATTERN [FILE] # how many characters around the searching keyword should be shown? context_length=10 # What is the length of the control character for the color before and after the # matching string? # This is mostly determined by the environmental variable GREP_COLORS. control_length_before=$(($(echo a | grep --color=always a | cut -d a -f '1' | wc -c)-1)) control_length_after=$(($(echo a | grep --color=always a | cut -d a -f '2' | wc -c)-1)) grep -E --color=always "$1" $2 | grep --color=none -oE \ ".{0,$(($control_length_before + $context_length))}$1.{0,$(($control_length_after + $context_length))}"
Suponiendo que la secuencia de comandos se guarda como
grepl
, entoncesgrepl pattern file_with_long_lines
debería mostrar las líneas coincidentes pero con solo 10 caracteres alrededor de la cadena coincidente.fuente
Esto es lo que hago:
En mi .bash_profile, que anulan grep para que se ejecute automáticamente
tput rmam
antes ytput smam
después de que personas con discapacidad envoltura y luego re-habilita.fuente
En la situación inusual en la que no puede usar
-E
, puede usar:fuente
Puse lo siguiente en mi
.bashrc
:Luego puede usar
grepl
en la línea de comando con cualquier argumento que esté disponible paragrep
. Utilice las teclas de flecha para ver la cola de las líneas más largas. Úseloq
para salir.Explicación:
grepl() {
: Defina una nueva función que estará disponible en cada (nueva) consola bash.$(which grep)
: Obtenga la ruta completa degrep
. (Ubuntu define un alias paragrep
eso es equivalente agrep --color=auto
. No queremos ese alias sino el originalgrep
).--color=always
: Colorea la salida. (--color=auto
el alias no funcionará yagrep
que detecta que la salida se coloca en una tubería y no la coloreará en ese momento).$@
: Pon todos los argumentos dados a lagrepl
función aquí.less
: Muestra las líneas usandoless
-R
: Mostrar coloresS
: No rompa largas filasfuente