Pregunta

Creo que AWK será la solución a mi problema. Mis herramientas son limitadas porque estoy usando BusyBox en ESXI 4.0U1. Tengo un archivo de registro de un programa de copia de seguridad de VM (Ghettovcb). Necesito escanear este archivo para la expresión

"No se pudo clonar el disco: no hay suficiente espacio en el sistema de archivos para la operación seleccionada"

En mi archivo, esta está alrededor de la línea '43'. El campo anterior (en AWK Vocab) representa el nombre de VM que quiero print a un archivo de texto de salida. En mi ejemplo, el nombre de VM es TEST12-RH4-AtlassianTest.

awk 'RS=""
/There is not enough space/ { 
print $17
} '

print $17 está codificado y no quiero esto. Quiero encontrar el campo que es menos que el primer campo en la línea devuelto por el Regex anterior. Se agradecen cualquier sugerencia.Archivo de entrada AWK

¿Fue útil?

Solución

Actualización (versión optimizada)

awk 'NR==1{print $NF}' RS="Failed to clone" input-awk.txt

Prueba de concepto

$ awk 'NR==1{print $NF}' RS="Failed to clone" input-awk.txt
TEST12-RH4-AtlassianTest

Actualización 2 (Súper versión optimizada)

Técnicamente, lo siguiente sería el súper Versión optimizada, pero deja demasiadas posibilidades de éxitos falsos en el separador de registros, aunque funciona para su entrada de muestra.

awk 'NR<2{print $NF}' RS="Fa" input-awk.txt`

ACTUALIZACIÓN 3 (Ultimate Mega-Kill Optimized Version)

No usaría esto en el código de producción, pero solo muestra que siempre hay una manera de simplificarlo. Si alguien puede vencer esto por Código de golf Propósitos, ¡sin duda me gustaría verlo!

awk '!a++,$0=$NF' RS="Fa" input-awk.txt

Original

Suponiendo que su nombre de VM sea siempre el último campo en el registro que desea imprimir, esto funciona:

awk '/not enough space/{split(pre,a);print a[pNF]}{pre=$0;pNF=NF}' input-awk.txt

Otros consejos

Entonces no podrías usar algo como

'{if it matches, print foo; foo=$17}'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top