web-dev-qa-db-fra.com

Couper la sortie de la commande grep

J'ai utilisé cette commande pour obtenir une sortie, mais je souhaite modifier la sortie pour obtenir un résultat final réduit.

Résultat requis:

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

Commander:

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

Sortie que je vois actuellement:

/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"/>
3
NewtoLinux

La sortie souhaitée peut être réalisée assez facilement avec Python2:

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

Le contenu du 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

Ce qui se passe ici est assez simple. Nous utilisons < pour rediriger le contenu du fichier d'entrée vers un script (dans votre cas, où une entrée provenant de grep utilise le tuyau ...| ./trim_lines.py pour envoyer la sortie de grep au script). Le script parcourt toutes les lignes qui entrent dans son flux stdin, scinde chaque ligne en mots et les filtre en outre à l'aide de quelques modules intégrés, tels que os.path et re. Les deux premières valeurs obtenues utilisent os.path.basename(), et la dernière utilise re.split() pour décomposer la dernière chaîne à plusieurs délimiteurs. Il se passe beaucoup de choses ici, mais croyez-moi, c'est assez simple.

3
Sergiy Kolodyazhnyy

Vous pouvez, par exemple, diriger le résultat dans sed (peut-être pourrions-nous vous donner un moyen plus élégant de connaître votre entrée réelle) - ajoutez ceci à la fin de votre commande grep:

| sed -r 's#.*/(EsbDw[^\.]+).*/([^"]+").*=([^/]+)/>#\1 "\2 \3#'
EsbDwMarkDownAdbSub "CleClient" "3.1"
EsbDwMarkDownAdbSub "Encrypter" "1.0"
  • -r utilise ERE pour ne pas avoir à échapper à () et +
  • s#old#new# remplace old par new
  • .*/ tous les caractères précédant un /
  • (EsbDw[^\.]+) trouve un motif commençant par EsbDw et se terminant par . et enregistre tout avant le .
  • /([^"]+") tous les caractères compris entre / et " - tout enregistrer après /, y compris "
  • =([^/]+)/> enregistrez ce qui se passe entre = et />
  • \1 "\2 \3 les trois modèles enregistrés avec des espaces entre eux (et en ajoutant un ")
3
Zanna