Hallo an die Scripting Experten unter Euch,
wie kann ich elegant bzw. überhaupt folgende Aufgabe lösen: Gegeben ist eine Datei mit folgendem Inhalt (Auszug) < component: NetXtreme BCM5719 Gigabit Ethernet PCIe rev 01 (eth7) component type: Firmware current version: 7.8.16 = repository version: 7.8.16 Package name: Network_Firmware_T3TVN_LN_7.8.16.BIN Applicability: Package cannot be applied ----------------------------- component: iDRAC7 component type: Firmware current version: 1.51.51 > repository version: 1.46.45 Package name: ESM_Firmware_JYX4C_LN32_1.46.45_A00.BIN Applicability: Package can be applied
In der Ausgabe sollen die Werte für component, current version, repository version und Package name pro Komponente in jeweils einer Zeile erscheinen. Diese sollen im Idealfall Felder darstellen, die mit awk erfasst werden können ($1, $n). Hintergrund: Es soll ein Soll-Ist Vergleich der installierten Firmware eines DELL Servers mit einem Firmware Repository durchgeführt werden mit der Angabe: Komponente A braucht ein Update auf Version x, Komponente B ist aktuell.
Habe schon diverse awk und sed Konstrukte probiert, leider ohne durchschlagenden Erfolg da sich meine Kenntnisse der genannten Tools arg in Grenzen hält ;-(
Wie könnte man das machen?
Gruß Thomas
Hi Thomas,
On Thu, Feb 27, 2014 at 21:01:51 +0100, Thomas Müller wrote:
Gegeben ist eine Datei mit folgendem Inhalt (Auszug)
[...]
component: NetXtreme BCM5719 Gigabit Ethernet PCIe rev 01 (eth7) component type: Firmware current version: 7.8.16 = repository version: 7.8.16 Package name: Network_Firmware_T3TVN_LN_7.8.16.BIN Applicability: Package cannot be applied
component: iDRAC7 component type: Firmware current version: 1.51.51 > repository version: 1.46.45 Package name: ESM_Firmware_JYX4C_LN32_1.46.45_A00.BIN Applicability: Package can be applied
[...]
Hintergrund: Es soll ein Soll-Ist Vergleich der installierten Firmware eines DELL Servers mit einem Firmware Repository durchgeführt werden mit der Angabe: Komponente A braucht ein Update auf Version x, Komponente B ist aktuell.
Dummer Ansatz mit grep und zwei Zeilen Kontext um das gefundene Muster:
grep -C 2 "^current version:.*[0-9] =" all.txt > uptodate.txt
grep -C 2 "^current version:.*[0-9] >" all.txt > needsupdate.txt
Die Ausgabe ist zwar nicht einzeilig pro Datensatz, filtert aber zwei Listen heraus.
Gruss, Chris
Hallo,
hier ist mein Vorschlag:
#!/bin/bash grep "component:" test280214.txt >ausgabedatei280214.txt grep "current version:" test280214.txt | paste ausgabedatei280214.txt -
ausgabedatei280214.txt
sed -i '1,2d' ausgabedatei280214.txt sed -i 's/ (repository version:)/\t\1/' ausgabedatei280214.txt grep "Package name:" test280214.txt | paste ausgabedatei280214.txt -
ausgabedatei280214.txt
sed -i '1,2d' ausgabedatei280214.txt
Vielleicht geht es noch einfacher. Ich bin kein Scripting Experte.
Viele Grüße Frank
Am Donnerstag, den 27.02.2014, 21:01 +0100 schrieb Thomas Müller:
Hallo an die Scripting Experten unter Euch,
wie kann ich elegant bzw. überhaupt folgende Aufgabe lösen: Gegeben ist eine Datei mit folgendem Inhalt (Auszug) < component: NetXtreme BCM5719 Gigabit Ethernet PCIe rev 01 (eth7) component type: Firmware current version: 7.8.16 = repository version: 7.8.16 Package name: Network_Firmware_T3TVN_LN_7.8.16.BIN Applicability: Package cannot be applied
component: iDRAC7 component type: Firmware current version: 1.51.51 > repository version: 1.46.45 Package name: ESM_Firmware_JYX4C_LN32_1.46.45_A00.BIN Applicability: Package can be applied
In der Ausgabe sollen die Werte für component, current version, repository version und Package name pro Komponente in jeweils einer Zeile erscheinen. Diese sollen im Idealfall Felder darstellen, die mit awk erfasst werden können ($1, $n). Hintergrund: Es soll ein Soll-Ist Vergleich der installierten Firmware eines DELL Servers mit einem Firmware Repository durchgeführt werden mit der Angabe: Komponente A braucht ein Update auf Version x, Komponente B ist aktuell.
Habe schon diverse awk und sed Konstrukte probiert, leider ohne durchschlagenden Erfolg da sich meine Kenntnisse der genannten Tools arg in Grenzen hält ;-(
Wie könnte man das machen?
Gruß Thomas
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
Hallo Christian und Frank,
danke für die Anregungen, ich probiers mal. "paste" hatte ich nicht auf dem Radar bzw. kannte es gar nicht :-)
Am 28. Februar 2014 09:46 schrieb Frank Hasterok < frank.hasterok.lug-dd@clfh.de>:
Hallo,
hier ist mein Vorschlag:
#!/bin/bash grep "component:" test280214.txt >ausgabedatei280214.txt grep "current version:" test280214.txt | paste ausgabedatei280214.txt -
ausgabedatei280214.txt
sed -i '1,2d' ausgabedatei280214.txt sed -i 's/ (repository version:)/\t\1/' ausgabedatei280214.txt grep "Package name:" test280214.txt | paste ausgabedatei280214.txt -
ausgabedatei280214.txt
sed -i '1,2d' ausgabedatei280214.txt
Vielleicht geht es noch einfacher. Ich bin kein Scripting Experte.
Viele Grüße Frank
Am Donnerstag, den 27.02.2014, 21:01 +0100 schrieb Thomas Müller:
Hallo an die Scripting Experten unter Euch,
wie kann ich elegant bzw. überhaupt folgende Aufgabe lösen: Gegeben ist eine Datei mit folgendem Inhalt (Auszug) < component: NetXtreme BCM5719 Gigabit Ethernet PCIe rev 01 (eth7) component type: Firmware current version: 7.8.16 = repository version: 7.8.16 Package name: Network_Firmware_T3TVN_LN_7.8.16.BIN Applicability: Package cannot be applied
component: iDRAC7 component type: Firmware current version: 1.51.51 > repository version: 1.46.45 Package name: ESM_Firmware_JYX4C_LN32_1.46.45_A00.BIN Applicability: Package can be applied
In der Ausgabe sollen die Werte für component, current version, repository version und Package name pro Komponente in jeweils einer Zeile erscheinen. Diese sollen im Idealfall Felder darstellen, die mit awk erfasst werden können ($1, $n). Hintergrund: Es soll ein Soll-Ist Vergleich der installierten Firmware eines DELL Servers mit einem Firmware Repository durchgeführt werden mit der Angabe: Komponente A braucht ein Update auf Version x, Komponente B ist aktuell.
Habe schon diverse awk und sed Konstrukte probiert, leider ohne durchschlagenden Erfolg da sich meine Kenntnisse der genannten Tools arg in Grenzen hält ;-(
Wie könnte man das machen?
Gruß Thomas
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
Hat funktioniert, danke an alle. Für's Protokoll: habe ein Script zum Erstellen des Files und ein zweites Script zum Parsen gebastelt, was alles tut wie ich möchte
create.sh #!/bin/bash srcfile=suu-compare compfile=component.lst version=version filename=files.lst dstfile=result.lst grep "component:" $srcfile | cut -b 12- | sed -e 's/ //g' > $compfile grep "current version:" $srcfile | awk '{print $3"|"$7}' > $version grep "Package name:" $srcfile | awk '{print $3}' > $filename paste -d| $compfile $version $filename > $dstfile
compare.sh #!/bin/bash compfile=result.lst while read file; do cm=$(echo $file | cut -d | -f1) cv=$(echo $file | cut -d| -f2) rv=$(echo $file | cut -d| -f3) echo "Komponente "$cm echo "Current Version "$cv echo "Repository Version "$rv if [ $cv = $rv ]; then echo "OK" else echo "needs Update" fi done < $compfile
Am 28. Februar 2014 10:49 schrieb Thomas Müller thomas@mueller-meissen.de:
Hallo Christian und Frank,
danke für die Anregungen, ich probiers mal. "paste" hatte ich nicht auf dem Radar bzw. kannte es gar nicht :-)
Am 28. Februar 2014 09:46 schrieb Frank Hasterok < frank.hasterok.lug-dd@clfh.de>:
Hallo,
hier ist mein Vorschlag:
#!/bin/bash grep "component:" test280214.txt >ausgabedatei280214.txt grep "current version:" test280214.txt | paste ausgabedatei280214.txt -
ausgabedatei280214.txt
sed -i '1,2d' ausgabedatei280214.txt sed -i 's/ (repository version:)/\t\1/' ausgabedatei280214.txt grep "Package name:" test280214.txt | paste ausgabedatei280214.txt -
ausgabedatei280214.txt
sed -i '1,2d' ausgabedatei280214.txt
Vielleicht geht es noch einfacher. Ich bin kein Scripting Experte.
Viele Grüße Frank
Am Donnerstag, den 27.02.2014, 21:01 +0100 schrieb Thomas Müller:
Hallo an die Scripting Experten unter Euch,
wie kann ich elegant bzw. überhaupt folgende Aufgabe lösen: Gegeben ist eine Datei mit folgendem Inhalt (Auszug) < component: NetXtreme BCM5719 Gigabit Ethernet PCIe rev 01 (eth7) component type: Firmware current version: 7.8.16 = repository version: 7.8.16 Package name: Network_Firmware_T3TVN_LN_7.8.16.BIN Applicability: Package cannot be applied
component: iDRAC7 component type: Firmware current version: 1.51.51 > repository version: 1.46.45 Package name: ESM_Firmware_JYX4C_LN32_1.46.45_A00.BIN Applicability: Package can be applied
In der Ausgabe sollen die Werte für component, current version, repository version und Package name pro Komponente in jeweils einer Zeile erscheinen. Diese sollen im Idealfall Felder darstellen, die mit awk erfasst werden können ($1, $n). Hintergrund: Es soll ein Soll-Ist Vergleich der installierten Firmware eines DELL Servers mit einem Firmware Repository durchgeführt werden mit der Angabe: Komponente A braucht ein Update auf Version x, Komponente B ist aktuell.
Habe schon diverse awk und sed Konstrukte probiert, leider ohne durchschlagenden Erfolg da sich meine Kenntnisse der genannten Tools arg in Grenzen hält ;-(
Wie könnte man das machen?
Gruß Thomas
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
-- Freundliche Grüße
Thomas Müller Systemingenieur (IT) Hainstrasse 6 01662 Meißen eMail: thomas@mueller-meissen.de tmueller@itm-meissen.de http://www.mueller-meissen.de
Hallo Thomas,
ich habe noch einen zweiten Vorschlag.
Es geht auch nur mit sed und in einer Zeile. Wer sich richtig mit sed auskennt, könnte den zweiten Vorschlag bestimmt noch vereinfachen:
sed -n '{/component:/p; /current version:/p; /Package name:/p}' test280214.txt | sed -e '/component:/{ N ; N ; s/\n/\t/g}' -e 's/ (repository version:)/\t\1/' >ausgabe-280214.txt
viele Grüße Frank
Am Freitag, den 28.02.2014, 10:49 +0100 schrieb Thomas Müller:
Hallo Christian und Frank,
danke für die Anregungen, ich probiers mal. "paste" hatte ich nicht auf dem Radar bzw. kannte es gar nicht :-)
Am 28. Februar 2014 09:46 schrieb Frank Hasterok frank.hasterok.lug-dd@clfh.de: Hallo,
hier ist mein Vorschlag: #!/bin/bash grep "component:" test280214.txt >ausgabedatei280214.txt grep "current version:" test280214.txt | paste ausgabedatei280214.txt - >>ausgabedatei280214.txt sed -i '1,2d' ausgabedatei280214.txt sed -i 's/ \(repository version:\)/\t\1/' ausgabedatei280214.txt grep "Package name:" test280214.txt | paste ausgabedatei280214.txt - >>ausgabedatei280214.txt sed -i '1,2d' ausgabedatei280214.txt Vielleicht geht es noch einfacher. Ich bin kein Scripting Experte. Viele Grüße Frank Am Donnerstag, den 27.02.2014, 21:01 +0100 schrieb Thomas Müller: > Hallo an die Scripting Experten unter Euch, > > wie kann ich elegant bzw. überhaupt folgende Aufgabe lösen: > Gegeben ist eine Datei mit folgendem Inhalt (Auszug) > < > component: NetXtreme BCM5719 Gigabit Ethernet PCIe rev 01 (eth7) > component type: Firmware > current version: 7.8.16 = repository version: 7.8.16 > Package name: Network_Firmware_T3TVN_LN_7.8.16.BIN > Applicability: Package cannot be applied > ----------------------------- > component: iDRAC7 > component type: Firmware > current version: 1.51.51 > repository version: 1.46.45 > Package name: ESM_Firmware_JYX4C_LN32_1.46.45_A00.BIN > Applicability: Package can be applied > > > > In der Ausgabe sollen die Werte für component, current version, > repository version und Package name pro Komponente in jeweils einer > Zeile erscheinen. > Diese sollen im Idealfall Felder darstellen, die mit awk erfasst werden > können ($1, $n). > Hintergrund: Es soll ein Soll-Ist Vergleich der installierten Firmware > eines DELL Servers mit einem Firmware Repository durchgeführt werden mit > der Angabe: Komponente A braucht ein Update auf Version x, Komponente B > ist aktuell. > > Habe schon diverse awk und sed Konstrukte probiert, leider ohne > durchschlagenden Erfolg da sich meine Kenntnisse der genannten Tools arg > in Grenzen hält ;-( > > Wie könnte man das machen? > > Gruß Thomas > > > > > > > _______________________________________________ > Lug-dd maillist - Lug-dd@mailman.schlittermann.de > https://ssl.schlittermann.de/mailman/listinfo/lug-dd _______________________________________________ Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
-- Freundliche Grüße
Thomas Müller Systemingenieur (IT)
Hainstrasse 6
01662 Meißen eMail: thomas@mueller-meissen.de _______________________________________________ Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
Hallo Frank,
das sieht natürlich "geeky" aus :-) Mal sehen was der Kunde besser findet, ich probier's auf jeden Fall mal aus und versuch's zu verstehen :-)
Am 28. Februar 2014 12:33 schrieb Frank Hasterok < frank.hasterok.lug-dd@clfh.de>:
Hallo Thomas,
ich habe noch einen zweiten Vorschlag.
Es geht auch nur mit sed und in einer Zeile. Wer sich richtig mit sed auskennt, könnte den zweiten Vorschlag bestimmt noch vereinfachen:
sed -n '{/component:/p; /current version:/p; /Package name:/p}' test280214.txt | sed -e '/component:/{ N ; N ; s/\n/\t/g}' -e 's/ (repository version:)/\t\1/' >ausgabe-280214.txt
viele Grüße Frank
Am Freitag, den 28.02.2014, 10:49 +0100 schrieb Thomas Müller:
Hallo Christian und Frank,
danke für die Anregungen, ich probiers mal. "paste" hatte ich nicht auf dem Radar bzw. kannte es gar nicht :-)
Am 28. Februar 2014 09:46 schrieb Frank Hasterok frank.hasterok.lug-dd@clfh.de: Hallo,
hier ist mein Vorschlag: #!/bin/bash grep "component:" test280214.txt >ausgabedatei280214.txt grep "current version:" test280214.txt | paste ausgabedatei280214.txt - >>ausgabedatei280214.txt sed -i '1,2d' ausgabedatei280214.txt sed -i 's/ \(repository version:\)/\t\1/' ausgabedatei280214.txt grep "Package name:" test280214.txt | paste ausgabedatei280214.txt - >>ausgabedatei280214.txt sed -i '1,2d' ausgabedatei280214.txt Vielleicht geht es noch einfacher. Ich bin kein Scripting Experte. Viele Grüße Frank Am Donnerstag, den 27.02.2014, 21:01 +0100 schrieb Thomas Müller: > Hallo an die Scripting Experten unter Euch, > > wie kann ich elegant bzw. überhaupt folgende Aufgabe lösen: > Gegeben ist eine Datei mit folgendem Inhalt (Auszug) > < > component: NetXtreme BCM5719 Gigabit Ethernet PCIe rev 01 (eth7) > component type: Firmware > current version: 7.8.16 = repository version: 7.8.16 > Package name: Network_Firmware_T3TVN_LN_7.8.16.BIN > Applicability: Package cannot be applied > ----------------------------- > component: iDRAC7 > component type: Firmware > current version: 1.51.51 > repository version: 1.46.45 > Package name: ESM_Firmware_JYX4C_LN32_1.46.45_A00.BIN > Applicability: Package can be applied > > > > In der Ausgabe sollen die Werte für component, current version, > repository version und Package name pro Komponente in jeweils einer > Zeile erscheinen. > Diese sollen im Idealfall Felder darstellen, die mit awk erfasst werden > können ($1, $n). > Hintergrund: Es soll ein Soll-Ist Vergleich der installierten Firmware > eines DELL Servers mit einem Firmware Repository durchgeführt werden mit > der Angabe: Komponente A braucht ein Update auf Version x, Komponente B > ist aktuell. > > Habe schon diverse awk und sed Konstrukte probiert, leider ohne > durchschlagenden Erfolg da sich meine Kenntnisse der genannten Tools arg > in Grenzen hält ;-( > > Wie könnte man das machen? > > Gruß Thomas > > > > > > > _______________________________________________ > Lug-dd maillist - Lug-dd@mailman.schlittermann.de > https://ssl.schlittermann.de/mailman/listinfo/lug-dd _______________________________________________ Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
-- Freundliche Grüße
Thomas Müller Systemingenieur (IT)
Hainstrasse 6
01662 Meißen eMail: thomas@mueller-meissen.de _______________________________________________ Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
Thomas Müller thomas@mueller-meissen.de (Do 27 Feb 2014 21:01:51 CET):
Hallo an die Scripting Experten unter Euch,
wie kann ich elegant bzw. überhaupt folgende Aufgabe lösen: Gegeben ist eine Datei mit folgendem Inhalt (Auszug)
Elegant ist anders, aber es geht aus so:
#! /usr/bin/perl use 5.014; use warnings; use English qw(-no_match_vars);
$OFS = "\t";
$_ = do { local $RS = undef; <> };
while ( /^component:\s+(?<component>.+?(?=\Q$RS\E)) .*? ^current\sversion:\s+(?<current>\S+) \s[<=>]\s repository\sversion:\s(?<avail>\S+) .*? ^package\sname:\s(?<package>.+?(?=\Q$RS\E)) /ixmgs ) { die "output field separator '$OFS' found in values" if /\Q$OFS\E/ ~~ [values %+]; say @+{qw(component current avail package)};
}
Best regards from Dresden/Germany Viele Grüße aus Dresden Heiko Schlittermann
Hallo Heiko,
perl fällt leider aus, ist im DELL DTK nicht drin...
Trotzdem danke für die Anregung. Gruß Thomas
2014-02-28 22:21 GMT+01:00 Heiko Schlittermann hs@schlittermann.de:
Thomas Müller thomas@mueller-meissen.de (Do 27 Feb 2014 21:01:51 CET):
Hallo an die Scripting Experten unter Euch,
wie kann ich elegant bzw. überhaupt folgende Aufgabe lösen: Gegeben ist eine Datei mit folgendem Inhalt (Auszug)
Elegant ist anders, aber es geht aus so:
#! /usr/bin/perl use 5.014; use warnings; use English qw(-no_match_vars); $OFS = "\t"; $_ = do { local $RS = undef; <> }; while ( /^component:\s+(?<component>.+?(?=\Q$RS\E)) .*? ^current\sversion:\s+(?<current>\S+) \s[<=>]\s repository\sversion:\s(?<avail>\S+) .*? ^package\sname:\s(?<package>.+?(?=\Q$RS\E)) /ixmgs ) { die "output field separator '$OFS' found in values" if /\Q$OFS\E/ ~~ [values %+]; say @+{qw(component current avail package)}; } Best regards from Dresden/Germany Viele Grüße aus Dresden Heiko Schlittermann
-- SCHLITTERMANN.de ---------------------------- internet & unix support - Heiko Schlittermann, Dipl.-Ing. (TU) - {fon,fax}: +49.351.802998{1,3} - gnupg encrypted messages are welcome --------------- key ID: 7CBF764A - gnupg fingerprint: 9288 F17D BBF9 9625 5ABC 285C 26A9 687E 7CBF 764A - (gnupg fingerprint: 3061 CFBF 2D88 F034 E8D2 7E92 EE4E AC98 48D0 359B)-
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
lug-dd@mailman.schlittermann.de