Trim saída do comando grep

3

Eu usei este comando para obter a saída, mas eu quero podar a saída para ver um resultado final reduzido

Resultado necessário:

EsbDwMarkDownAdbSub "CleClient" "3.1"
EsbDwMarkDownAdbSub "Encrypter" "1.0"

Comando:

grep --color -H -r "__GLOBAL_SUBSTITUTION_VARIABLE__Environment/LibraryVersions" /opt/tibco/product/tra/domain/WFM-DEV 2>/dev/null

Saída que vejo atualmente:

/opt/tibco/product/tra/domain/WFM-DEV/data/EsbDwMarkDownAdbSub.dat:       <instanceInfoPropertyname="__GLOBAL_SUBSTITUTION_VARIABLE__Environment/LibraryVersions/CleClient" value="3.1"/>
/opt/tibco/product/tra/domain/WFM-DEV/data/EsbDwMarkDownAdbSub.dat:    <instanceInfoProperty name="__GLOBAL_SUBSTITUTION_VARIABLE__Environment/LibraryVersions/Encrypter" value="1.0"/>
    
por NewtoLinux 19.12.2016 / 18:23

2 respostas

3

Você poderia, por exemplo, canalizar o resultado em sed (talvez possamos fornecer uma maneira mais elegante de saber sua entrada real) - adicione isso ao final do comando grep :

| sed -r 's#.*/(EsbDw[^\.]+).*/([^"]+").*=([^/]+)/># " #'
EsbDwMarkDownAdbSub "CleClient" "3.1"
EsbDwMarkDownAdbSub "Encrypter" "1.0"
  • -r usa o ERE, por isso não precisamos escapar de () e +
  • s#old#new# replace old com new
  • .*/ quaisquer caracteres antes de um /
  • (EsbDw[^\.]+) encontra um padrão começando com EsbDw e terminando com . e salva tudo antes do .
  • /([^"]+") todos os caracteres entre / e " - salva tudo depois de / incluindo "
  • =([^/]+)/> salve o que estiver entre = e />
  • " os três padrões salvos com espaços entre eles (e adicionando um " )
por Zanna 19.12.2016 / 20:07
3

A saída desejada pode ser feita facilmente com o Python2:

$ ./trim_lines.py < input.txt                                                                                            
EsbDwMarkDownAdbSub "CleClient" "3.1"
EsbDwMarkDownAdbSub "Encrypter" "1.0"

O conteúdo do script trim_lines.py :

#!/usr/bin/env python
import sys,os,re

for line in sys.stdin:
    words=line.strip().split()
    val1 = os.path.basename(words[0]).split(".")[0]
    val2 = '"' + os.path.basename(words[2])
    val3 = re.split("[=/]",words[-1])[1]
    print val1,val2,val3

O que acontece aqui é bastante simples. Usamos < para redirecionar o conteúdo do arquivo de entrada para o script (no seu caso, onde a entrada proveniente do grep usa o canal ...| ./trim_lines.py para enviar a saída de grep para o script). O script faz um loop em todas as linhas que chegam ao fluxo de stdin, divide cada linha em palavras e, além disso, filtra essas palavras usando alguns módulos internos, como os.path e re . Os dois primeiros valores que obtemos usam os.path.basename() e o último usa re.split() para dividir a última string em vários delimitadores. Há muitas coisas acontecendo aqui, mas acredite - é bem simples.

    
por Sergiy Kolodyazhnyy 23.12.2016 / 09:42