Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: grep, sed, python hulp  (gelezen 690 keer)

grep, sed, python hulp
« Gepost op: 2008/04/18, 11:37:20 »
ik wil mijn grep opdracht wat verkorten omdat hij bijna hetzelfde 3 maal achtereen moet doen en dat levert een cpu verbruik piek op.

het is geen text-file die gelezen moet worden, daarom dat die piek er is, nuja, hier wat moet gelezen worden:
$ /usr/sbin/dellLEDCtl -i
Libsmbios version      : 0.13.10
dellLEDCtl version: 0.1.0
LED Info:
Current zone 1: Aquamarine
Current zone 2: Off
Current zone 3: Aquamarine
Current zone 4: Ruby
Current intensity 7
CMOS zone 1: Aquamarine
CMOS zone 2: Off
CMOS zone 3: Aquamarine
CMOS zone 4: Ruby
CMOS intensity 7
Touchpad/Media Key LED Info not supported on this system.
de bedoeling is om current zone 1, 2 en 3 uit te lezen. dit doe ik zo:
#!/usr/bin/env python

import commands

cz1 = '"Current zone 1"'
cz2 = '"Current zone 2"'
cz3 = '"Current zone 3"'

a = commands.getoutput('/usr/sbin/dellLEDCtl -i | grep ' + cz1 + ' | sed s/.*:.//')
b = commands.getoutput('/usr/sbin/dellLEDCtl -i | grep ' + cz2 + ' | sed s/.*:.//')
c = commands.getoutput('/usr/sbin/dellLEDCtl -i | grep ' + cz3 + ' | sed s/.*:.//')

print "Fans are " + a
print "Speakers are " + b
print "Backpanel is " + c
dat werkt dus prima, ik krijg mooi de output die ik wil.

nu wil ik dus dat het commando '/usr/sbin/dellLEDCtl -i' maar 1 maal word uitgevoerd, maar dat ik toch de 3 outputs krijg.

grep, sed, python hulp
« Reactie #1 Gepost op: 2008/04/18, 12:54:20 »
blijkbaar was het niet zo heel moeilijk, gewoon een optie van grep, namelijk:
commands.getoutput('/usr/sbin/dellLEDCtl -i | grep -A2 ' + cz1 + ' | sed s/.*:.//')

dan krijg ik ze mooi ondereen:
Aquamarine
Off
Aquamarine

maar ik heb de 3 woorden apart nodig. nuja, ik zit zelf rond te kijken, maar het zoekt niet zo makkelijk.

Offline Rulus

  • Lid
grep, sed, python hulp
« Reactie #2 Gepost op: 2008/04/18, 14:37:57 »
Ik heb het zo opgelost. Je gebruikt best niet te veel rechtstreekse commando's als grep (wat als er iemand geen grep heeft?), je kan die dingen ook gewoon in Python doen.

import commands

def getZoneInfo(string):
    """
    Haal zone informatie uit de string en sla ze op in een dictionary.

    @param string   (str)    De output van '/usr/sbin/dellLEDCtl -i'
    @return         (dic)    Dictionary met als keys de zones en als values de informatie.
    """
    zoneInfo = {}   #Construeer een lege dictionary.
    for line in string.splitlines():    #Splits de output op in lijnen en overloop ze een voor een
        if 'Current zone' in line:    #Als er 'Current zone' in de lijn staat moeten we de volgende stap ook doen

            zoneInfo[int(line.strip().split(' ')[2][0])] = line.split(':')[1].strip()
            #Werkt als volgt: zoneInfo[key] = value

            #key is hier: int(line.strip().split(' ')[2][0])
            #  van binnen naar buiten:
            #    line.strip() neemt de lijn en haalt de spaties aan het begin en het einde weg
            #    line.strip().split(' ') splits de lijn op aan de hand van de spaties, je krijgt dan een lijst
            #    line.strip().split(' ')[2] neemt het derde element van die lijst
            #    line.strip().split(' ')[2][0] neemt het eerste karakter van dat element (zonder : dus)
            #    int(line.strip().split(' ')[2][0]) maakt van dit karakter een int (een getal) ipv een string

            #value is hier: line.split(':')[1].strip()
            #    line.split(':') splitst de lijn op basis van het dubbelpunt
            #    line.split(':')[1] neemt het tweede element van de lijst (het deel achter het dubbelpunt dus)
            #    line.split(':')[1].strip() haalt van dit element de spaties aan het begin en het einde weg

    return zoneInfo
    # retourneert de dictionary: die ziet er zo uit (waarden kunnen verschillen uiteraard)
    #  {1 : 'Aquamarine',
    #   2 : 'Off',
    #   3 : 'Aquamarine',
    #   4 : 'Ruby'}

dellLedOutput = commands.getoutput('/usr/sbin/dellLEDCtl -i')   #Voert het commando uit en slaat de output op
zoneDic = getZoneInfo(dellLedOutput)   #Converteert deze output naar een dictionary (zie boven)

print "Fans are %s" % zoneDic[1]      #Print de waarde voor Fans (zone 1), zoneDic[1] is de value van key 1
print "Speakers are %s" % zoneDic[2]  #Analoog
print "Backpanel is %s" % zoneDic[3]  #Analoog
Ik heb er wat uitleg bijgeschreven, zonder werkt het ook uiteraard.