
Ich muss also ein Protokoll durchgehen, das mir per E-Mail zugeschickt wurde (in Windows), nach einer Zeile suchen, um die Seriennummer des Modells zu ermitteln. Ich dachte, das ließe sich ganz einfach bewerkstelligen, indem ich ein hässliches Batch-Skript schreibe, um die MSG-Datei so zu konvertieren, dass ich die Datei lesen kann. Beispiel:
cat "*Pre*.msg" | strings2 > agrep.txt
cat agrep.txt | grep "D24" > a21s.txt
cat a21s.txt | cut -d" " -f7 > Air21Serials.txt
damit bleiben mir drei eindeutige Zahlen. Wie füge ich ALPHA zu Zeile 1, BETA zu Zeile 2 und GAMMA zu Zeile 3 mit einem Leerzeichen oder einem : als Trennzeichen hinzu?
Aktualisieren:Die Datei a21s.txt
ähnelt
0 1 BXP_0 AIR21B4AB2P KRC118046/1 R3B D240090254 20140416
0 1 BXP_1 AIR21B4AB2P KRC118046/1 R3B D240088108 20140414
0 1 BXP_2 AIR21B4AB2P KRC118046/1 R3B D240090208 20140414
Antwort1
Es gibt viele Möglichkeiten, das zu tun, was Sie suchen, nur einige Beispiele.
awk
und eine maßgeschneiderte Lösung
Eine auf Ihr Beispiel zugeschnittene Lösung besteht awk
darin, 3 Variablen zu verwenden und zu übergeben. Dies ist nicht allgemeingültig, denn wenn Sie 4 Zeilen haben, müssen Sie 4 Variablen übergeben und so weiter ...
Der awk
Befehl bietet die einfache Möglichkeit, die Spalten über ihre Nummer zu verwalten ( $1
, $2
… $NF
die letzte).
Um das Lesen hier einfacher zu gestalten, verwende ich Ihre alte Zwischendatei
a21s.txt
awk -v s1="ALPHA" -v s2="BETA" -v s3="GAMMA" ' NR==1 {print s1,$7} ; NR==2 {print s2,$7} ; NR==3 {print s3,$7} ; ' a21s.txt
- In der ersten Zeile übergibst du 3 Variablen
awk
mit der Option-v
. - In den folgenden Zeilen verwenden Sie die interne VariableNR, zählt die Nummer der Zeile. Sie können also die Variable druckenStufe 1, nur wenn Sie die erste Zeile haben, dies2mit dem zweiten ... und so weiter.
- In der letzten Zeile danach
'
können Sie den Dateinamen angeben, sodass Sie dencat
Prozess nicht aufrufen und an diesen weiterleiten müssenawk
. - Wenn die Variablen (ALPHA, BETA ...) mit einem Mechanismus generiert werden können (z. B. „Serial01, Serial02“), können Sie sie anstelle der Steuerelemente auf der Zeilennummer und der externen Variablen platzieren.
- In der ersten Zeile übergibst du 3 Variablen
Praxishinweis:unter *nix können SieKommandozügeDurch Weiterleiten (
|
) einer Ausgabe an die folgende, ohne dass Zwischendateien erstellt werden müssen.
In Ihrem Beispiel könnten Sie also direkt Folgendes verwenden:cat "*Pre*.msg" | strings2 | grep "D24" | cut -d" " -f7 > Air21Serials.txt
Stattdessen
cut
können Sie in diesem Fall denawk
Befehl verwendencat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt
.
Eine allgemeinere Lösung: paste
+awk
Nehmen wir an, Sie haben Ihre a21s.txt
Datei und eine weitere ( b.txt
) mit der gleichen Zeilenanzahl und innerhalb der Zeichenfolgen (jeweils ein Wort), die Sie mit einem Präfix versehen möchten (wie im Folgenden).
ALPHA
BETA
GAMMA
Sie können einfach verwenden
paste b.txt a21.txt | awk '{print $1,$8}' > Air21Serials.txt
Beachten Sie, dass die Spalte Ihrer Seriennummer jetzt die 8. ist, da Sie zuvor per Einfügen eine weitere hinzugefügt haben.
Notiz
Fragen Sie Linux selbst nach weiteren Informationen zu man awk
undman paste
:-)
Antwort2
echo ALPHA>agreep.txt ; Katze "Vor.msg" | Zeichenfolgen2>>agrep.txt
das ist vielleicht nicht die genaue Linie .. das Konzept ist, dass SieErstemöchte das Wort „Alpha“ in die Datei einfügen.. mit einem >-Symbol wird die Datei erstellt, und mit einem >> wird an die Datei angehängt. Ohne „Newline“ sollte das Wort ALPHA dort eingefügt und dann die erste Nachricht angehängt werden.
Sie müssen möglicherweise ein wenig herumspielen, bis der Code genau funktioniert.
EDIT: Suche ergabKatzeUnddruckenfsind bessere Optionen als Echo, da Echo je nach Betriebssystem unterschiedlich sein kann
zB: Katze ("ALPHA: ") > agrep.txt ; Katze "Vor.msg" | Zeichenfolgen2>>agrep.txt
Und für einen „Einzeiler“-Befehl hätte die erste Pipe ein ; oder && sein sollen.
; zwischen Befehlen wird immer der nächste Befehl ausgeführt && zwischen Befehlen wird der nächste Befehl nur ausgeführt, wenn der vorherige erfolgreich war und || (Doppelpix) wird der nächste Befehl nur ausgeführt, wenn der vorherige fehlgeschlagen ist
Antwort3
Ich bin mir nicht sicher, was strings2
das tut oder wie Ihre Eingabe aussieht, daher kann ich nicht 100 % sicher sein, dass dies wie erwartet funktioniert. Aber vielleicht weist es Sie zumindest in die richtige Richtung. cat
kann Eingaben von stdin akzeptieren. Sie könnten also auch Folgendes tun:
echo ALPHA: | cat - "*Pre*.msg" | strings2 > agrep.txt
echo BETA: | cat - agrep.txt | grep "D24" > a21s.txt
echo GAMMA: | cat - a21s.txt | cut -d" " -f7 > Air21Serials.txt