Saltar al contenido

¿Cómo dividir una salida en dos archivos con grep?

Estate atento porque en este tutorial vas a hallar la contestación que buscas.

Solución:

Hay muchas formas de lograr esto.

Usando awk

Lo siguiente envía cualquier línea que coincida coolregex para archivar1. Todas las demás líneas van al archivo2:

./mycommand.sh | awk '/[coolregex]/print>"file1";next 1' >file2

Cómo funciona:

  1. /[coolregex]/print>"file1";next

    Cualquier línea que coincida con la expresión regular coolregex se imprimen a file1. Luego, omitimos todos los comandos restantes y saltamos para comenzar de nuevo en el next línea.

  2. 1

    Todas las demás líneas se envían a stdout. 1 es la abreviatura críptica de awk para imprimir la línea.

También es posible dividir en múltiples flujos:

./mycommand.sh | awk '/regex1/print>"file1" /regex2/print>"file2" /regex3/print>"file3"'

Uso de la sustitución de procesos

Esto no es tan elegante como la solución awk pero, para completar, también podemos usar múltiples greps combinados con la sustitución de procesos:

./mycommand.sh | tee >(grep 'coolregex' >File1) | grep -v 'coolregex' >File2

También podemos dividirnos en múltiples flujos:

./mycommand.sh | tee >(grep 'coolregex' >File1) >(grep 'otherregex' >File3) >(grep 'anotherregex' >File4) | grep -v 'coolregex' >File2

sed -n -e '/pattern_1/w file_1' -e '/pattern_2/w file_2' input.txt

w filename – escribe el espacio del patrón actual en el nombre del archivo.

Si desea que todas las líneas coincidentes vayan a file_1 y todas las líneas que no coinciden con file_2, tu puedes hacer:

sed -n -e '/pattern/w file_1' -e '/pattern/!w file_2' input.txt

o

sed -n '/pattern/!p;d; w file_1' input.txt > file_2

Explicación

  1. /pattern/!p;d;
    • /pattern/! – negación – si una línea no contiene pattern.
    • p – imprime el espacio del patrón actual.
    • d – eliminar el espacio del patrón. Iniciar el siguiente ciclo.
    • por lo tanto, si una línea no contiene un patrón, imprime esta línea en la salida estándar y selecciona la siguiente línea. La salida estándar se redirige a la file_2 en nuestro caso. La siguiente parte de la sed texto (w file_1) no alcanza mientras la línea no coincide con el patrón.
  2. w file_1 – si una línea contiene un patrón, el /pattern/!p;d; parte se salta (porque se ejecuta sólo cuando el patrón no coincide) y, por lo tanto, esta línea va a la file_1.

Nos puedes ayudar nuestra tarea exponiendo un comentario o dejando una valoración te estamos agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *