Entonces, abrir un archivo con cat
y luego usando grep
obtener líneas coincidentes solo me lleva hasta cierto punto cuando estoy trabajando con el conjunto de registros particular con el que estoy tratando. Necesita una forma de hacer coincidir las líneas con un patrón, pero solo para devolver la parte de la línea después de la coincidencia. La porción antes y después del partido variará constantemente. He jugado usando sed
o awk
, pero no he podido descubrir cómo filtrar la línea para eliminar la parte antes de la coincidencia o simplemente devolver la parte después de la coincidencia, cualquiera funcionará.
Este es un ejemplo de una línea que necesito para filtrar:
2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 }
La porción que necesito es todo después de "estancado".
El trasfondo detrás de esto es que puedo averiguar con qué frecuencia algo se detiene:
cat messages | grep stalled | wc -l
Lo que debo hacer es averiguar cuántas veces se ha estancado un determinado nodo (indicado por la parte antes de cada dos puntos después de "atascado". no se detiene, lo que no me ayuda. Necesito filtrar solo la parte detenida para poder buscar un nodo específico de los que se han estancado.
Para todos los efectos, este es un sistema freebsd con utilidades básicas GNU estándar, pero no puedo instalar nada adicional para ayudar.
Respuesta aceptada:
La herramienta canónica para eso sería sed
.
sed -n -e 's/^.*stalled: //p'
Explicación detallada:
-n
significa no imprimir nada por defecto.-e
va seguido de un comando sed.s
es el comando de reemplazo de patrón.- La expresión regular
^.*stalled:
coincide con el patrón que está buscando, además de cualquier texto anterior (.*
es decir, cualquier texto, con una inicial^
decir que el partido comienza al principio de la línea). Tenga en cuenta que sistalled:
ocurre varias veces en la línea, esto coincidirá con la última aparición. - El partido, es decir, todo en la línea hasta
stalled:
, se reemplaza por la cadena vacía (es decir, eliminada). - La última
p
significa imprimir la línea transformada.
Si desea conservar la parte coincidente, use una referencia inversa:1
en la pieza de repuesto designa lo que hay dentro de un grupo (…)
en el patrón Aquí, podrías escribir stalled:
de nuevo en la pieza de repuesto; esta característica es útil cuando el patrón que está buscando es más general que una cadena simple.
sed -n -e 's/^.*(stalled: )/1/p'
A veces querrá eliminar la parte de la línea después del partido. Puede incluirlo en la coincidencia incluyendo .*$
al final del patrón (cualquier texto .*
seguido del final de la línea $
). A menos que coloque esa parte en un grupo al que hace referencia en el texto de reemplazo, el final de la línea no estará en la salida.
Como ilustración adicional de grupos y referencias inversas, este comando intercambia la parte anterior a la coincidencia y la parte posterior a la coincidencia.
sed -n -e 's/^(.*)(stalled: )(.*)$/321/p'