Pregunta ¿Puedo usar grep para extraer un patrón particular de un archivo / número de archivos, usando regex quizás?


Tengo un archivo con muchos errores en él. Usé grep para sacar todo JSONExcpetion Errores y guárdelos en un nuevo archivo como este:

sudo grep -Hrn "JSONException" 2016-* >> jsonexception.txt

Ahora tengo un archivo con mucha JSONExceptions en eso. Algunas de esas excepciones contienen ID. Me gustaría sacar los ID y guardarlos en otro archivo.

En mi código Java, utilizo la siguiente expresión regular para identificar el formato de ID correcto en una String:

^([A-Fa-f0-9]{24})$

¿Puedo usar algo similar con grep para extraer identificaciones de jsonexception.txt y guardarlos en otro archivo?

Una muestra del registro:

2016-02 / server-2016-02-11-3.log: 17425: 11 / Feb / 2016 12: 08: 35,519 [ERROR] [Thread-3] - WorkerRunnable: Worker 2: se ha producido una excepción JSON, en la cadena: {"DISPOSITIVO":[{" CARNÉ DE IDENTIDAD":"32584305d2ff32051d06dfff"}, {" TimeStamp ": 1455185304," Evento ":" Boot "," BuildDate ":" Feb 11 2016 "," BuildTime ":" 10:48:00 "," Reason ":" Reinicio de encendido ", "FSHigh": 485, "FSLow": 475 , "VerMajor": 0, "VerMinor": 9, "VerRevision": 2, "VerPatch": 2, "MAC": "00: 06: 66: 3a: 26: 5c", "WlanVersion": "4.75" , "WlanModuleType": "RN131", "BoardRev": "RevD1", "DisinfectSeconds": 0}, { "TimeStamp": 1455185316, "Evento": "CurrentSettings", "IssuedTime": 0, "FSHigh": 535, "FSLow": 425, "Duty": 100, "Frequency": 1000, "Current": 80, "IdlePeriod": 30, "StillOnPeriod": 20, "Automático OnPeriod ": 43200," AutoOnDuration ": 10," MaxOnTime ": 14400," FlowSensitivity ": 50," LidSwitches ": 1," UvFluxWarn ": 70," UvFluxInsufficient ": 40," Firm Servidor ":" A. ^ A. ^ B ^ B. ^ P ^ K ^ G ^ C JF ^ M H Opzp ^ HI ^ C ^ G ^ C ^ ^ ^ ^ ^ ^ R O ^ B pG ^ D "," FirmPort: 1, "DeviceTypeName": "", "WlanTimeZone": 25, "LedRegArray ": [{" Bo ardId ":" A "," LedNo ": 0," RegState ":" Regular "}, {" BoardId ":" A "," LedNo ": 1," RegState ":" Regular "}]}, {" TimeStamp ": 1455185316," Evento ":" CurrentWlanSettings "," SettingsArray ": [{" WlanSettingsId ": 1}, {" WlanSettingsId ": 2}, {" WlanSettingsId ": 3}]}}, {" TimeStamp ": 145518531 5, "Evento": "Conectar", "WlanSettingsId": 1, "MAC": "00: 06: 66: 3a: 26: 5c", "IP": "192.168.1.125", "WLAN": "TEST1 "," RSSI ": - 52," Versión ":" 4.75 "," AP-MAC ":" ac: 9e: 17: ea: 0f: 3c "}, {" End ": 100}]} ^ M


0


origen


¿Puedes mostrar una línea del archivo que quieres grep? - choroba
He agregado una línea arriba, la ID que quiero grep está en negrita, es una cadena hexadecimal de 24 caracteres. - bot_bot


Respuestas:


Si tu grep apoyos -o, puedes usar lo siguiente:

grep -o '"ID":"[a-f0-9]\{24\}"' | cut -d\" -f4

La primera parte extrae solo el "ID":"..." parte, el segundo selecciona la cuarta columna, usando " como el separador, es decir, la propia identificación.

Es mucho más seguro incluir el "ID": en la consulta, de lo contrario, puede coincidir accidentalmente con una parte diferente de la línea.


2



Muchas gracias por esto! - bot_bot
Su solución no funcionó para mí cuando usé el texto de muestra de OP. sin embargo grep -Eo "(ID\":\"[0-9a-zA-Z]*\")" funcionó para mí Podría agregarlo al suyo como una posible solución adicional en caso de que el primero falle. - Yokai