GNU/Linux >> Tutoriales Linux >  >> Linux

¿Devolver solo la parte de una línea después de un patrón coincidente?

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 si stalled: 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.

Relacionado:Sed:¿imprime solo la primera aparición de una coincidencia de patrón?

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'

Linux
  1. ¿Cómo detener el comando Buscar después de la primera coincidencia?

  2. ¿Insertar un archivo en otro archivo después de la primera aparición de un patrón?

  3. ¿Reemplazar el patrón después de encontrar la enésima coincidencia en cada línea?

  4. Sed:¿Imprimir solo la primera aparición de una coincidencia de patrón?

  5. ¿Cómo contar el número de líneas en un archivo después de una coincidencia Grep?

¿Cuál es ese total en la primera línea después de ls -l?

sed para insertar solo en la primera coincidencia

El concepto de 'Espacio de espera' y 'Espacio de patrón' en sed

sed - insertar línea después de X líneas después del partido

Cómo hacer que el comando grep devuelva la línea coincidente completa

¿Cómo obtener la línea n-th después de una grepped?