2009-06-09 4 views
0

Suchen Sie nach einem Shell-Skript, das in allen Dateien des aktuellen Verzeichnisses nach einem Attribut (einer Zeichenfolge) sucht und die Attributwerte zusammen mit dem Dateinamen speichert.Shell-Skript zum Suchen von Attribut und Speichern von Werten zusammen mit Dateiname

zB File1.txt

abc xyz = "PQR"

Datei2.txt

abc xyz = "klm"

Hier Datei1 und Datei2 enthält gewünschten Zeichenfolge "abc xyz" und haben Werte "pqr" und "klm". möchte ich so etwas wie dies zur Folge haben: File1.txt: pqr Datei2.txt: klm

Antwort

0

Bitte nicht Bash Scripting für diese.

Es gibt viel Platz für kleine Verbesserungen im Code,
, aber in 20 Zeilen macht das verdammte Ding den Job.

Hinweis: Der Code geht davon aus, dass "abc xyz" am Anfang der Zeile steht.

#!/usr/bin/python 

import os 
import re 

MYDIR = '/dir/you/want/to/search' 

def search_file(fn): 
    myregex = re.compile(r'abc xyz = \"([a-z]+)\"') 
    f = open(fn, 'r') 
    for line in f: 
     m = myregex.match(line) 
     if m: 
      yield m.group(1) 

for filename in os.listdir(MYDIR): 
    if os.path.isfile(os.path.join(MYDIR, filename)): 
     matches = search_file(os.path.join(MYDIR, filename)) 
     for match in matches: 
      print filename + ':' + match, 

Dank David Beazley, A.M. Kuchling und Mark Pilgrim für ihr umfangreiches Wissen zu teilen.
Ich hätte so etwas nicht ohne euch Jungs tun können.

1

Nun, das hängt davon ab, wie Sie ein 'Shell-Skript' definieren. Hier sind 3 einzeilige Lösungen:

  • Mit grep/sed:

    egrep -o "abc xyz =" * " '* | sed -e' s/abc xyz =" (.. *) "/ \ 1/'

  • Mit awk:

    awk'/abc xyz = "()"/ {print FILENAME ":.". gensub ("abc xyz = \"() \ "", "\ 1", 1)} '*

  • Verwendung von Perl-Einzeiler:

    perl -ne 'if (s/abc xyz = "(*)."/$ ARGV: $ 1 /) {print}' *

Ich persönlich würde geh mit dem letzten.

+0

@abbot: Ihre Antwort ist viel besser. In meiner Arbeit neige ich dazu, meine Skripte wiederzuverwenden und zu erweitern; Python ist also ideal. Aber das scheint eine einmalige Aufgabe zu sein. Kudos auf den knappen Einzeilern. Lass es mich wissen, wenn du denkst, ich sollte meine Antwort löschen. – bernie

+0

Keine Notwendigkeit, es zu löschen. Allerdings könnte eine Python-Version viel kompakter gemacht werden, siehe http://gist.github.com/126323 – abbot

+0

Ziemlich heftige Kompressionsrate, die Sie dort bekommen haben! Danke, dass du dieses Juwel teilst. – bernie

Verwandte Themen