Posso usar o grep para extrair um padrão específico de um arquivo / número de arquivos, usando regex talvez?

0

Eu tenho um arquivo com uma carga de erros. Eu usei o grep para extrair todos os erros JSONExcpetion e salvá-los em um novo arquivo como este:

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

Agora eu tenho um arquivo com muito JSONExceptions nele. Algumas dessas exceções contêm códigos. Eu gostaria de retirar os ID's e salvá-los em outro arquivo.

No meu código Java, eu uso o seguinte regex para identificar a formatação correta do ID em String :

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

Posso usar algo semelhante com o grep para obter IDs de jsonexception.txt e salvá-los em outro arquivo?

Uma amostra do log:

2016-02 / server-2016-02-11-3.log: 17425: 11 / Fev / 2016 12: 08: 35,519 [ERROR] [Thread-3] - WorkerRunnable: Trabalhador 2: Ocorreu uma JSONException, em a string: {"DEVICE": [{" ID ":" 32584305d2ff32051d06dfff "}, {" TimeStamp ": 1455185304," Evento ":" Boot "," BuildDate ":" 11 de fevereiro de 2016 "," BuildTime ":" 10:48:00 "," Razão ":" Power on Reset "," 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, "Auto OnPeriod ": 43200," AutoOnDuration ": 10," MaxOnTime ": 14400," FlowSensitivity ": 50," LidSwitches ": 1," UvFluxWarn ": 70," UvFluxInsufficient ": 40," Firm Servidor ":" ^ A. ^ B ^ B. ^ P ^ K ^ G ^ C JF ^ M H O zp ^ HI ^ C ^ G ^ C ^ M B ^ N ^ 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," Event ":" 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": "TESTE1 "," RSSI ": - 52," Versão ":" 4.75 "," AP-MAC ":" ac: 9e: 17: ea: 0f: 3c "}, {" Fim ": 100}]} ^ M

    
por bot_bot 13.05.2016 / 15:49

1 resposta

2

Se o seu grep suportar -o , você pode usar o seguinte:

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

A primeira parte extrai apenas a parte "ID":"..." , a segunda seleciona a quarta coluna, usando " como o separador, ou seja, o id em si.

É muito mais seguro incluir o "ID": na consulta, caso contrário, você poderá corresponder acidentalmente a uma parte diferente da linha.

    
por 13.05.2016 / 16:07