Hallo
Bin gut beim kopieren und ausprobieren, immer und immer wieder, bis das Ergebnis stimmt.
Das Resultat ist oft ein langer und komplizierte Befehl den ich kaum verstehe.
Könnt ihr mir helfen diesen Befehl zu vereinfachen und den awk Teil erklären.
megacli -PDlist -aALL -NoLog | egrep 'Slot|state|Error Count|flagged' | awk '/Slot/{if (x)print x;x="";}{x=(!x)?$0:x " | "$0;}END{print x;}' | sed 's/ Number//g' | sed 's/ Count//g' | sed 's/Firmware state: //g' | sed 's/Drive has flagged a S.M.A.R.T/SMART/g' | column -t
Besten Dank.
Befehl vereinfachen und erklären
Re: Befehl vereinfachen und erklären
Beginne von links, führe megacli mit den Parametern aus (und schau in der manpage bzw megacli -h oder so nach, was sie bedeuten!). Dann verstehe, was egrep tut. Schritt für Schritt. awk ist sicher etwas komplizierter, und wenn du soweit bist, erklärt dir sicher jemand (mit gegebener Ein- und Ausgabe!), was und warum das passiert.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nicht • Don't break debian! • Wie man widerspricht
Windows ist doof, Linux funktioniert nicht • Don't break debian! • Wie man widerspricht
Re: Befehl vereinfachen und erklären
Der awk-Befehl sammelt die Inhalte aller Zeilen auf. Wenn eine Slot-Zeile kommt wird der Inhalt ausgegeben und dann wieder neu mit Aufsammeln begonnen. Das awk-Programm ist etwas verworren geschrieben. Letztlich gruppiert es jeden Slot-Abschnitt auf jeweils eine Zeile.
Use ed once in a while!
Re: Befehl vereinfachen und erklären
egrep sollte nicht mehr verwendet werden, fliegt vermutlich irgendwann raus, nimm grep -E.
Das awk in lesbar:
Das awk hat drei Blöcke, der erste wird nur auf Zeilen die "Slot" enthalten angewandt. Und dann, wenn x gesetzt ist, x ausgegeben und anschließend geleert.
Der zweite Block wird immer ausgeführt, das ist nur ne hässliche Form von if-then-else, $0 ist die jeweils bearbeitete Eingabe, im Normalfall die aktuelle Zeile der Eingabe, das 'x " | " $0' ist ne einfache Stringkonkatenation, bei awk schreibst die Variablen hintereinander. Plus oder Punkt, wie oft in anderen Sprachen gewohnt, nicht nötig.
Der dritte Block ist durch das vorangestellte END besonders, sowas wird in der Regel nur einmal, ganz am Ende der Eingabe, ausgeführt. Das gibt dann noch abschließend den Wert von x aus, also das, was in den Durchläufen der anderen Blöcke zuvor eingesammelt wurde, aber bisher nicht ausgegeben wurde.
Schau Dir einfach mal an, was passiert, wenn Du einzelne Stücke von dem Code weglässt. Und vergleiche die Ausgaben mit der Ausgabe des Befehls ohne Modifikationen.
Vermutlich kann man die Darstellungsanpassung komplett in (schönerem) awk machen, dafür müsstest mal zeigen, was der erste Befehl, ohne egrep und co., ausgibt und wissen, was Du gerne haben willst.
Das awk in lesbar:
Code: Alles auswählen
/Slot/{
if (x) print x;
x="";
}
{
x=(!x)?$0:x " | "$0;
}
END{
print x;
}
Der zweite Block wird immer ausgeführt, das ist nur ne hässliche Form von if-then-else, $0 ist die jeweils bearbeitete Eingabe, im Normalfall die aktuelle Zeile der Eingabe, das 'x " | " $0' ist ne einfache Stringkonkatenation, bei awk schreibst die Variablen hintereinander. Plus oder Punkt, wie oft in anderen Sprachen gewohnt, nicht nötig.
Der dritte Block ist durch das vorangestellte END besonders, sowas wird in der Regel nur einmal, ganz am Ende der Eingabe, ausgeführt. Das gibt dann noch abschließend den Wert von x aus, also das, was in den Durchläufen der anderen Blöcke zuvor eingesammelt wurde, aber bisher nicht ausgegeben wurde.
Schau Dir einfach mal an, was passiert, wenn Du einzelne Stücke von dem Code weglässt. Und vergleiche die Ausgaben mit der Ausgabe des Befehls ohne Modifikationen.
Vermutlich kann man die Darstellungsanpassung komplett in (schönerem) awk machen, dafür müsstest mal zeigen, was der erste Befehl, ohne egrep und co., ausgibt und wissen, was Du gerne haben willst.