• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[SOLVED] zusätzliche Zeilen nach 'grep' mit ausgeben

Hallo zusammen,

ich bastle in Thema für Superkaramba, wo RAIDs dynamisch abgefragt und dazugehörige Infos ausgegeben werden sollen. Bin schon weiter gekommen, doch habe ein kleines Problem.

Bei dem Thema ist auch Python im Einsatz.

Ich möchte
Code:
dma@Phenom940:~> cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] 
md4 : active raid10 sdk1[0] sdl1[1]
      976760672 blocks super 1.0 2 near-copies [2/2] [UU]
      bitmap: 2/466 pages [8KB], 1024KB chunk

md3 : active raid10 sdi1[0] sdj1[1]
      976760672 blocks super 1.0 2 near-copies [2/2] [UU]
      bitmap: 2/466 pages [8KB], 1024KB chunk

md2 : active raid10 sdb1[0] sdd1[1]
      625130336 blocks super 1.0 2 near-copies [2/2] [UU]
      bitmap: 5/299 pages [20KB], 1024KB chunk

md1 : active raid10 sda4[0] sdc4[1]
      576781536 blocks super 1.0 2 near-copies [2/2] [UU]
      bitmap: 2/5 pages [8KB], 65536KB chunk

md0 : active raid10 sda3[0] sdc3[1]
      46138592 blocks super 1.0 2 near-copies [2/2] [UU]
      bitmap: 1/1 pages [4KB], 65536KB chunk
schön auswerten.

Jeder RAID-Verbund wird über Python automatisch angezeigt.

(Ausschnitt)
Code:
    for RAIDS in NumberOfRAIDS:
	
#...set the RAID Box and show name of this RAID Array (mdX)...	
	#box
	karamba.createImage(widget, 72, Base_y_RAID+35, RAID_Box)
	#RAID name
	RAID = karamba.createText(widget, 75, Base_y_RAID+35+texty, 140,40, RAIDS)
        karamba.changeTextColor(widget, RAID, Red_Topic, Green_Topic, Blue_Topic)
        karamba.changeTextSize(widget,RAID,18)
        
    
        
#...and set RAID icons and Infos in boxes
	if "md" in RAIDS:
	 karamba.createImage(widget, 80, Base_y_RAID+65, "img/RAIDok.png")
	 RAID_Devices_Title_Text=karamba.createText(widget, 120, Base_y_RAID+35+texty, 140,40, 'RAID Devices:')
	 RAID_Devices_Typ=os.popen("cat /proc/mdstat |grep "+str(RAIDS)+"|sed 's/"+str(RAIDS)+" : //g'|awk '{print $2}'").read()
	 RAID_Devices=os.popen("cat /proc/mdstat |grep "+str(RAIDS)+"|sed 's/"+str(RAIDS)+" : //g'|awk '{print $3,$4,$5,$6}'").read()
	 RAID_Devices_Text=karamba.createText(widget, 120, Base_y_RAID+50+texty, 200,40, RAID_Devices)
	 RAID_Devices_Typ_Text=karamba.createText(widget, 120, Base_y_RAID+62+texty, 140,40, RAID_Devices_Typ)
	 
	 RAID_Chunk_Text=karamba.createText(widget, 120, Base_y_RAID+75+texty, 140,40, 'Chunk:')
	else:
	 pass
	RAID_list.append(RAID)

Ich bekomme dann für jedes Kästchen aus der ersten Zeile:
Code:
mdX : active raidX sdkX sdlX

FRAGE:
Wie komme ich auf folgende 2 Zeilen bei jedem RAID???

Also ich brauche so etwas als Ausgabe (von mir aus in einer Zeile)
Code:
md4 : active raid10 sdk1[0] sdl1[1]
      976760672 blocks super 1.0 2 near-copies [2/2] [UU]
      bitmap: 2/466 pages [8KB], 1024KB chunk



auf die erste Zeile komme ich mit
-Python
Code:
RAID_Devices=os.popen("cat /proc/mdstat |grep "+str(RAIDS)+"|sed 's/"+str(RAIDS)+" : //g'|awk '{print $3,$4,$5,$6}'").read()

-Bash (zB. md4)
Code:
cat /proc/mdstat |grep md4|sed 's/md4 : //g'|awk '{print $3,$4,$5,$6}'

Das ist wichtig, um dann je nach mdX Stati für UU, U_, _U oder __ abfragen zu können.

Das Ganze soll so aussehen
RAID-Karamba.png
 
OP
dma67
GELÖST!
Für die Nachwelt

Hier http://linux.byexamples.com/archives/304/grep-multiple-lines/
ist die Lösung:
You can grep “DMA” with -B 1 and -A2

Nach 'grep' wird 1 Zeile Ausgegeben. Wir können aber xZeilen VOR und NACH dem Muster der Ausgabe hinzufügen.

Beispiel:
1. "ALLES"
Code:
dma@Phenom940:~> cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] 
md4 : active raid10 sdk1[0] sdl1[1]
      976760672 blocks super 1.0 2 near-copies [2/2] [UU]
      bitmap: 2/466 pages [8KB], 1024KB chunk

md3 : active raid10 sdi1[0] sdj1[1]
      976760672 blocks super 1.0 2 near-copies [2/2] [UU]
      bitmap: 2/466 pages [8KB], 1024KB chunk

md2 : active raid10 sdb1[0] sdd1[1]
      625130336 blocks super 1.0 2 near-copies [2/2] [UU]
      bitmap: 4/299 pages [16KB], 1024KB chunk

md1 : active raid10 sda4[0] sdc4[1]
      576781536 blocks super 1.0 2 near-copies [2/2] [UU]
      bitmap: 2/5 pages [8KB], 65536KB chunk

md0 : active raid10 sda3[0] sdc3[1]
      46138592 blocks super 1.0 2 near-copies [2/2] [UU]
      bitmap: 1/1 pages [4KB], 65536KB chunk

unused devices: <none>

2. Suche nach 'md4'
Code:
md4 : active raid10 sdk1[0] sdl1[1]

3. LÖSUNG meines Problems:
Code:
dma@Phenom940:~> cat /proc/mdstat |grep md4 -A1
md4 : active raid10 sdk1[0] sdl1[1]
      976760672 blocks super 1.0 2 near-copies [2/2] [UU]
wobei A wohl für AFTER und B für BEVORE steht

Und zuallerletzt Status des RAIDs sortiert nach mdX (hier md4)
Code:
dma@Phenom940:~> cat /proc/mdstat |grep md4 -A1 |awk '/blocks/{print $8}'
[UU]
 
OP
dma67
tatsächlich...
Code:
dma@Phenom940:~> grep md4 -A1 /proc/mdstat |awk '/blocks/{print $8}'
[UU]
bin Anfänger...
 
Stimmt, aber nach meiner Erfahrung hat subprocess manchmal Probleme bei komplexen Shell-Befehlen. Ich verwende es eher, wenn ich über einen längeren Zeitraum einen anderen Prozeß steuern, bzw. länger mit diesem kommunizieren will. Wenn os.popen() so klappt, kann man's IMHO ruhig noch verwenden.
 
abgdf schrieb:
Stimmt, aber nach meiner Erfahrung hat subprocess manchmal Probleme bei komplexen Shell-Befehlen. Ich verwende es eher, wenn ich über einen längeren Zeitraum einen anderen Prozeß steuern, bzw. länger mit diesem kommunizieren will. Wenn os.popen() so klappt, kann man's IMHO ruhig noch verwenden.

Wenn es os.popen nicht mehr gibt, dann hast du aber viele Scripte zu ändern. Was sind den für dich komplexe Shell- Befehle?
 
spoensche schrieb:
abgdf schrieb:
Stimmt, aber nach meiner Erfahrung hat subprocess manchmal Probleme bei komplexen Shell-Befehlen. Ich verwende es eher, wenn ich über einen längeren Zeitraum einen anderen Prozeß steuern, bzw. länger mit diesem kommunizieren will. Wenn os.popen() so klappt, kann man's IMHO ruhig noch verwenden.
Wenn es os.popen nicht mehr gibt, dann hast du aber viele Scripte zu ändern. Was sind den für dich komplexe Shell- Befehle?
Zur Zeit gibt es "os.popen()" ja noch. Ich glaube, das bleibt auch so, denn es gibt in den C-Bibliotheken "system();" und "popen();" (siehe "man 3 popen"). Ich denke, "os.popen()" ruft einfach diese C-Funktionen auf. Wenn man "os.popen()" wirklich aus Python herausnimmt, würde man Umsteiger von C und Perl verärgern. Ich glaube nicht, daß man das ohne Not tun wird.

Komplexe Shell-Befehle sind für mich solche, die eine Menge Pipes und I/O-Umleitungen (sowohl ">" als auch "<") mit z.B. 4 oder 5 nacheinandergeschalteten Einzelbefehlen verwenden. Ich bin nicht sicher, ob subprocess das sauber verarbeiten kann (trotz "stdin = ...", "shell = ", usw.). Soweit ich das sehe, wird bei "os.popen()" die Befehlskette dagegen einfach über die C-Funktion an die Shell durchgereicht. Daß die das verarbeiten kann, ist ja bekannt.
Im Prinzip müßte das subprocess-Modul also wohl die ganze Shell nachbilden. Ich glaube, das schafft es (noch) nicht ganz.

Um einen einzelnen Unterprozeß über längere Zeit zu steuern, ist "subprocess" aber schon eine gute Sache, die ich dafür ja auch verwende, wie Du z.B. hier sehen kannst, wo ich das mp3-Abspielprogramm "mpg321" damit steuere. Trotzdem: Um mal schnell den Output eines Shell-Befehls abzugreifen, ist "os.popen()" IMHO immer noch eine gute Wahl.

Gruß
 
Oben