Melhor maneira de analisar string com bash?

0

Eu preciso analisar o comando abaixo para extrair namespace & nomes de interface usando um script bash. Eu geralmente faço isso usando o IFS, mas isso parece tedioso para mim. Existe uma maneira melhor de fazer isso sem definir o IFS?

    ovsdb-client dump Open_vSwitch  | grep nw-uplink    
    ffff-fff-ffff-ffff-fffffffff [ffff-fff-ffff-ffff-fffffffff] 10      "v1.1"    {id="ffff-fff-ffff-ffff-fffffffff"}     []              10       {timeout1="180", timeout2="3600", type="", connid2-val="", sat-enabled=no, namespace=default, nw-uplink="tap0", platform=kvm, timer="300", dest=localhost, dest-port="514"} "0.0.0-1-priv" []  {}         RedHatEnterpriseServer "6.6-Sanity"
    
por vindyz 10.03.2016 / 22:23

3 respostas

1

Um feitiço Awk feio:

 awk 'BEGIN{RS=" "; FS="="} {gsub(/,|"/,"")} /namespace/ {name=$2}; /uplink/ {intf=$2} END {print name": "intf}' <(command)
 default: tap0
    
por 10.03.2016 / 22:49
0

Lembre-se de que os shells Unix são interpretadores de comandos , que por conveniência quando lançam juntos algumas linhas para realizar operações mais complexas usam estruturas e variáveis de controle. Eles são não linguagens de programação. Sim, shell scripts são onipresentes, porque são muito portáveis (alguma forma de shell está disponível em todos os lugares) e permitem aproveitar o poder dos pipelines Unix e (muito mais importante) dos comandos de administração do sistema juntos.

Se você quiser fazer algumas manobras mais delicadas, use uma linguagem de script como o Python (a maioria das distribuições do Linux usa para escrever todo tipo de GUIs de administração do sistema, por isso deve estar disponível em quase todos os lugares) ou Perl.

    
por 10.03.2016 / 23:41
0

Você pode fazer isso com o Python e expressões regulares:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

# Copyright © 2016 Martin Ueding <[email protected]>
# Licensed under The MIT License

import sys
import re

def main():
    for line in sys.stdin:
        m1 = re.search(r'namespace=([^,]+)', line)
        if m1:
            print(m1.group(1))
        m2 = re.search(r'nw-uplink=([^,]+)', line)
        if m2:
            print(m2.group(1))


if __name__ == '__main__':
    main()

Apenas canalize a saída e você terá duas linhas com o namespace e a interface.

Como alternativa, também é possível tentar grep --only-matching (ou -o ) para eliminar as partes que estão interessadas.

Por fim, também é possível fazer expressões regulares no Bash com =~ (ou ~= ?) e, em seguida, usar a matriz $BASH_REMATCH para obter os resultados.

    
por 20.03.2016 / 16:03