Como extrair dados depois de um campo em um arquivo

0

Eu tenho o seguinte texto em um arquivo

 "rules": [
        "/Common/Tetration_TCP_L4_ipfix",
        "/Common/_sys_https_redirect"
    ],
    "rulesReference": [
        {
            "link": "https://localhost/mgmt/tm/ltm/rule/~Common~Tetration_TCP_L4_ipfix?ver=12.0.0"
        }

deseja extrair algo dentro de "rules": [] atualmente é

/Common/Tetration_TCP_L4_ipfix
/Common/_sys_https_redirect

A saída deve se parecer com

Tetration_TCP_L4_ipfix
_sys_https_redirect

mas, novamente, isso pode ser qualquer coisa.

    
por Sanjay Shitole 30.05.2018 / 08:13

3 respostas

4

Se o seu arquivo de entrada contiver JSON não completo, mas apenas o fragmento interno (embora estruturalmente válido), você poderá recuperar as partes "externas" que faltam para obter uma estrutura JSON completa válida.

Solução

sed + jq :

jq -r '.rules[] | sub("/Common/"; "")' <(sed '1 s/^/{/; $ s/$/]}/' file)

A saída:

Tetration_TCP_L4_ipfix
_sys_https_redirect

É claro que, se você tiver um JSON válido, basta ignorar o processamento sed e usar:

jq -r '.rules[] | sub("/Common/"; "")' file
    
por 30.05.2018 / 09:31
3

Se este for um arquivo JSON bem formado:

$ jq -r '..|select(type=="object" and has("rules")).rules|map(split("/")|.[-1])|.[]' file.json
Tetration_TCP_L4_ipfix
_sys_https_redirect

Isso usará jq para encontrar recursivamente todos os objetos JSON que possuem uma chave rules . Para todos os valores de matriz dessas chaves, ele dividirá o valor em / e retornará o último componente dele.

    
por 30.05.2018 / 08:31
3

Usando o AWK:

awk -F '[/"]' '/"rules": /,/],/{if(/"rules": |],/) next; print $(NF-1)}' file.txt
    
por 30.05.2018 / 08:34