Tengo una aplicación que producirá una gran cantidad de datos que no deseo almacenar en el disco. La aplicación genera principalmente datos que no deseo utilizar, pero un conjunto de información útil que debe dividirse en archivos separados. Por ejemplo, dada la siguiente salida:
JUNK
JUNK
JUNK
JUNK
A 1
JUNK
B 5
C 1
JUNK
Podría ejecutar la aplicación tres veces así:
./app | grep A > A.out
./app | grep B > B.out
./app | grep C > C.out
Esto me daría lo que quiero, pero tomaría demasiado tiempo. Tampoco quiero volcar todas las salidas en un solo archivo y analizarlo.
¿Hay alguna forma de combinar las tres operaciones que se muestran arriba de tal manera que solo necesito ejecutar la aplicación una vez y aún obtener tres archivos de salida separados?
./app | tee >(grep A > A.out) >(grep B > B.out) | grep C > C.out
grep
.Puedes usar
awk
fuente
También puedes usar las habilidades de combinación de patrones de tu caparazón :
O incluso:
Una forma más segura de lidiar con barras invertidas y líneas que comienzan con
-
:Como @StephaneChazelas señala en los comentarios, esto no es muy eficiente. La mejor solución es probablemente @ AurélienOoms ' .
fuente
-n
,-e
... También va a ser terriblemente ineficiente, ya que significa varias llamadas al sistema por línea (unoread(2)
por personaje, el archivo está abierto, la escritura cerrado para cada línea ...). Generalmente, usarwhile read
bucles para procesar texto en shells es una mala práctica.-n
etc. ahora. Por lo que puedo decir, ambas versiones funcionan bien con espacios en blanco, ¿me equivoco?printf
es el formato. No hay razón para dejar variables sin citar allí.Si tiene varios núcleos y desea que los procesos estén en paralelo, puede hacer lo siguiente:
Esto generará tres procesos en núcleos paralelos. Si desea que haya algún resultado en la consola o un archivo maestro, tiene la ventaja de mantener el resultado en algún orden, en lugar de mezclarlo.
La utilidad gnu paralela de Ole Tange puede obtenerse de la mayoría de los repositorios bajo el nombre paralelo o moreutils . La fuente se puede obtener de Savannah.gnu.org . También hay un video instructivo introductorio aquí .
Apéndice
Usando la versión más reciente de paralelo (no necesariamente la versión en su repositorio de distribución), puede usar la construcción más elegante:
Lo que logra el resultado de ejecutar uno ./app y 3 procesos grep paralelos en núcleos o subprocesos separados (según lo determinado por el mismo paralelo, también considere que -j3 es opcional, pero se proporciona en este ejemplo con fines instructivos).
La versión más nueva de paralelo se puede obtener haciendo:
Luego, el desempaquetado habitual, cd to parallel- {date}, ./configure && make, sudo make install. Esto instalará paralelo, página de manual paralela y página de manual paralelo_tutorial.
fuente
Aquí hay uno en Perl:
fuente
... si
<in
es legible, los tres archivos se truncarán antes de que se les escriba algo.fuente