Estoy usando awk para eliminar información útil de los archivos de registro. Así es como se ve mi archivo de registro:
2016-02-19 20:18:46,861 115971,100126017,524,523,1,[144115198332971054] 2016-02-19 20:18:46,874 95496,100126019,5,5,0,[] 2016-02-19 20:18:46,883 115974,100126025,57,57,0,[] 2016-02-19 20:18:46,891 115975,100126026,4,4,0,[] 2016-02-19 20:18:46,918 115976,100126027,122,122,0,[] 2016-02-19 20:18:47,688 115978,100126029,11656,11641,15,[144115198334490817,144115197319238988,144115197291063350,144115198332904743,144115197318718547,144115197319714394,144115197306930902,144115197250548791,144115198320676757,14411519 7253880518,144115197289305237,144115198083289344,144115197319697491,144115198273784435,144115198081583082] 2016-02-19 20:18:47,731 99590,100126032,12,12,0,[] 2016-02-19 20:18:47,832 115982,100126034,1397,1396,1,[144115198273784435] 2016-02-19 20:18:47,849 106705,100126035,31,31,0,[] 2016-02-19 20:18:47,860 107469,100126036,16,16,0,[] 2016-02-19 20:18:47,927 115983,100126037,824,824,0,[] 2016-02-19 20:18:47,985 115985,100126039,564,564,0,[] 2016-02-19 20:18:48,048 115986,100126040,338,338,0,[] 2016-02-19 20:18:48,108 115987,100126041,259,259,0,[] 2016-02-19 20:18:48,187 115989,100126043,693,692,1,[144115198273784435] Uso "," para la variable FS ; Necesito el contenido completo entre los corchetes [] , así que traté de configurar RS como "]" :
awk 'BEGIN { FS=","; RS="]";} { print $2 ,$3, $6 ,$7}' removed-apply.log.2016-02-19pero el resultado es incorrecto:
861 115971 100126017 1 [144115198332971054] 874 95496 100126019 0 [] 883 115974 100126025 0 [] 891 115975 100126026 0 [] 918 115976 100126027 0 [] 688 115978 100126029 15 [144115198334490817 731 99590 100126032 0 [] 832 115982 100126034 1 [144115198273784435] 849 106705 100126035 0 [] 860 107469 100126036 0 [] 927 115983 100126037 0 [] 985 115985 100126039 0 [] 048 115986 100126040 0 [] 108 115987 100126041 0 [] 187 115989 100126043 1 [144115198273784435] Parece que el RS sigue siendo el salto de línea.
Actualización : pensándolo bien, puede salirse con la suya con una sola expresión regular de separador de campo de entrada (especificada a través de la opción -F , que se traduce en la variable FS ):
awk -F ',\\[?|\\]' '{ print $2 ,$3, $6 ,$7 }' removed-apply.log.2016-02-19 Tenga en cuenta la necesidad de duplicar \ instancias para producir el carácter que las sigue como un literal en el contexto de una expresión regular . Por ejemplo, \\[ se convierte en \[ literal por el análisis de cadena inicial de awk , que el análisis de expresiones regulares ve como \[ , lo que resulta en la interpretación como literal [ . En resumen: string ,\\[?|\\] da como resultado regex ,\[?|\] .
Respuesta original (como se acepta):
Su entrada todavía está claramente orientada a la línea , por lo que no hay razón para cambiar RS , el separador de registro de entrada.
En su lugar, analice cada línea en dos pasos:
FS para dividir inicialmente la entrada en 2 campos: antes de [ y entre [...] .[][] , es un conjunto de caracteres ( [...] ) que contiene 2 caracteres literales, ] y [ ; es conceptualmente equivalente a \[|\] .split() para dividir cada campo , en subcampos almacenados en matrices : awk ' BEGIN { FS="[][]" } # split into $1 (before "[") and $2 (between "[...]") { split($1, fa1, ",") # split $1 into subfields by "," and store in array fa1 split($2, fa2, ",") # split $2 into subfields by "," and store in array fa2 # Output fields of interest print fa1[2], fa1[3], fa2[1], fa2[2] }' removed-apply.log.2016-02-19Usar "]" como RS parece ser un paso en la dirección equivocada. (¿Cómo distinguiría la diferencia entre un archivo de entrada que consta de "[abc]" y uno que consta de "[abc"?)
Suponiendo que el texto que desea está entre corchetes en la misma línea, lo siguiente podría manejar el tipo de entrada que describe:
grep '\[.*\]' | sed -e 's/^[^[]*\[\(.*\)\].*/\1/'Es posible que deba modificar esto según los detalles de sus requisitos. También sería fácil traducir esto a awk.
Si sus requisitos son más complejos de lo que puede manejar lo anterior, por favor elaborelos.