Estoy usando gradle runpara iniciar un servidor REST. La salida del servidor REST se ve así:
XXX.XXX.XX.XXX - <moreinfo>
randomtext
randomtext
XXX.XXX.XX.XXX - <moreinfo>
XXX.XXX.XX.XXX - <moreinfo>
randomtext
XXX.XXX.XX.XXX - <moreinfo>
XXX.XXX.XX.XXXAquí hay una dirección IP, el texto aleatorio son mensajes de error. Toda la salida se dirige a stdout, lamentablemente.
¿Cómo puedo dirigir todas las líneas que comienzan con una dirección IP a un archivo llamado err.logy todas las demás líneas all.log?
Desafortunadamente, gradle runsolo se puede iniciar una vez y no se detiene, ya que es un servidor REST.
Tal vez utilizar una tee, grepcombinación?
fuente

err.logestá vacío y toda la salida se redirige alall.loguso delteecomando anterior.err.logexiste, el comando se ejecutó pero no salió nada.grep -Econ la expresión utilizada en el comando awk debería coincidir, o lo hace aquí.all.logno contenga las líneas coincidentes en la expresión grep?all.logyerr.logcon un viejo comando. Perdón por la confusion. Gracias, eres increíble :)) !!Por lo tanto, parece que
gradle runno cumpla contee,pee,grepy io-redirección. Siempre deja de leer después de 4096 bytes.Para evitar este problema,
readcada línea degradle run. Todavía no lo probé, pero supongo que la lectura de una línea de más de 4k caracteres también fallará.De todos modos, aquí está el código para resolver mi pregunta específicamente:
fuente
read -r lineyprintf '%s\n' "$line"para evitar algunos bordes casos rompiendo cosas.