Befehl vereinfachen und erklären

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Nobodywolf
Beiträge: 3
Registriert: 25.04.2022 15:38:07

Befehl vereinfachen und erklären

Beitrag von Nobodywolf » 14.05.2022 10:57:13

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.

Benutzeravatar
TRex
Moderator
Beiträge: 7240
Registriert: 23.11.2006 12:23:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: KA

Re: Befehl vereinfachen und erklären

Beitrag von TRex » 14.05.2022 11:19:26

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 nichtDon't break debian!Wie man widerspricht

Benutzeravatar
Meillo
Moderator
Beiträge: 7471
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Befehl vereinfachen und erklären

Beitrag von Meillo » 14.05.2022 15:20:05

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(1) once in a while!

eggy
Beiträge: 3269
Registriert: 10.05.2008 11:23:50

Re: Befehl vereinfachen und erklären

Beitrag von eggy » 14.05.2022 18:21:51

egrep sollte nicht mehr verwendet werden, fliegt vermutlich irgendwann raus, nimm grep -E.
Das awk in lesbar:

Code: Alles auswählen

 /Slot/{
       if (x) print x;
       x="";
       }
         
  {
       x=(!x)?$0:x " | "$0;
  }
 
  END{ 
       print x;
  }
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.

Antworten