2016-12-02 4 views
3

Ich habe die folgende Beispieldatei:Separate eine Textdatei mit sed

evtlog.161202.002609.debugevtlog.161201.162408.debugevtlog.161202.011046.debugevtlog.161202.002809.debugevtlog.161201.160035.debugevtlog.161201.155140.debugevtlog.161201.232156.debugevtlog.161201.145017.debugevtlog.161201.154816.debug 

Ich möchte die Zeichenfolge trennen und eine neue Zeile nach dem Matching „debug“ wie folgt hinzufügen:

evtlog.161202.002609.debug 
evtlog.161201.162408.debug 

Bisher Ich habe fast alles mit sed versucht, aber es scheint nicht zu tun, was ich will.

sed 's/debug/{G}' latest_evtlogs.out 
sed '/debug/i "SAD"' latest_evtlogs.out 

etc ... sed 's/debug/\n/g' latest_evtlogs.out funktioniert nicht, wenn ich es als Rohr im Skript hinzufügen, aber es funktioniert, wenn ich es manuell ausführen.

Hier ist, wie ich die Datei erzeugen:

printf $(ls -l $EVTLOG_PATH/evtlog|tail -n 10|awk '{printf $8 , "%s\n\n"}'|sed 's/debug/\n/g') >> latest_evtlogs.out 

Zunächst wollte ich nur Newline hinzufügen mit awk, aber es funktioniert auch nicht. Irgendwelche Ideen, warum ich die Schnur nicht mit einer Newline trennen kann?

Ich verwende:

Distributor ID: Debian 
Description: Debian GNU/Linux 5.0.10 (lenny) 
Release:  5.0.10 
Codename:  lenny 
+1

Sind Sie sicher, dass Sie nicht viel Verarbeitung machen, die Sie nicht brauchen? Sie verwenden 'ls -l', um eine vollständige Liste des Verzeichnisses zu erhalten, und verwenden dann Awk, um nur den Dateinamen zu extrahieren und ohne einen Zeilenumbruch zu drucken, und dann versuchen, die Zeilenumbrüche hinzuzufügen. Warum nicht das einfachere "Skript" 'ls $ EVTLOG_PATH/evtlog | tail -n 10 >> latest_evtlogs.out' mach was du willst? –

+0

@ K.A Buhr, ich habe es probiert und es kommt wieder eine einzelne Saite an. –

+0

Der Befehl 'awk', der zum Generieren der Ausgabedatei verwendet wurde, ist falsch. Die Formatzeichenfolge sollte der erste Parameter sein: 'awk '{printf"% s \ n \ n ", $ 8}''. Fragen. A. Buhr schlug vor, es wäre besser, "ls" anstelle von "ls -l" zu verwenden, weil dann "awk" nicht gebraucht würde. – pjh

Antwort

0

Danke allen für die answers.I schließlich tat es wie folgt aus:

echo $(ls -l $EVTLOG_PATH/evtlog|tail -n 10|awk '{printf $8 , "%s\n\n"}'|sed 's/debug/&\n/g') > temp.out 

sed 's/ /\n/g' /share/sqa/dumps/5314577631/checks/temp.out > latest_evtlogs.out 

Es ist überhaupt nicht elegant, aber es funktioniert schließlich.

2

Fügen Sie einfach eine neue Zeile nach debug:

sed 's/debug/&\n/g' file 

Hinweis & druckt den gefundenen Text zurück, so ist es auch ein Weg "debug" zurück zu drucken .

Das gibt:

evtlog.161202.002609.debug 
evtlog.161201.162408.debug 
evtlog.161202.011046.debug 
evtlog.161202.002809.debug 
evtlog.161201.160035.debug 
evtlog.161201.155140.debug 
evtlog.161201.232156.debug 
evtlog.161201.145017.debug 
evtlog.161201.154816.debug 
+0

Nein, ich bekomme immer noch das gleiche: evtlog.161202.052817.debugevtlog.161201.212509.debugevtlog.161202.061126.debugevtlog.161202.062853.debugevtlog.161201.210226.d ebugevtlog.161201.205214.debugevtlog.161202.043057.debugevtlog.161201.205053.debugevtlog.161201.204846.debugevtlog.161201.211047.debugevtlog .161201.205132.debuugevtlog.161201.205527.debuugevtlog.161201.205217.debugevtlog.161202.043335.debuugevtlog.161202.045555.debug –

+0

@VeselinIvanov Entschuldigung in den Kommentaren können wir solche Ausgaben nicht verstehen. Verbessere deine Frage, was dein Ziel ist, da es so aussieht, als ob es ein Teil einer langen Pipeline ist. – fedorqui

+0

Es tut mir leid, es scheint unlesbar zu sein. Was ich meine ist, es ist immer noch eine einzige Zeichenkette und es gibt keine Änderung in der Ausgabe. –

0

Vielleicht Perl ist "glücklicher" als sed auf Ihrem System:

perl -pe 's/debug/&\n/g' < YourLogFile 
0

G et wird anhängen, was in den Haltepuffer zu der Musterraum (Normalerweise wird nur die aktuelle Zeile aus der Eingabedatei gelesen). Dies kann nicht verwendet werden.

i nsert druckt den angegebenen Text auf die Standardausgabe. Das kann also nicht verwendet werden.

Was Sie Sie alle debug mit debug^J zu ersetzen, wo ^J eine neue Zeile ist, abhängig von der sed-Version können Sie entweder tun:

sed 's/debug/&\n/g' input_file 

Aber \n ist - afaik - nicht streng festgelegt in POSIX sed. Man kann jedoch c Strings verwenden:

sed 's/debug/&'$'\n''/g' input_file 

Oder ein Multi-Line-string:

sed 's/debug/&\ 
/g' input_file 
1

Das Problem ist, dass Sie die Ausgabe von sed in einer Befehlserweiterung verwenden. In diesem Kontext ersetzt Ihre Shell alle Zeilenumbrüche durch Leerzeichen.Die Leerzeichen werden dann zum Teilen des Worts verwendet, sodass printf jede Zeile als separates Argument erkennt, wobei die erste Zeile als Formatargument interpretiert wird und der Rest ignoriert wird, da printf -Platzhalter im Format vorhanden sind.

Es sollte funktionieren, wenn Sie die äußere printf $() von Ihrem Befehl löschen und nur die Ausgabe von Ihrer Pipeline zu Ihrer Datei umleiten:

ls -l $EVTLOG_PATH/evtlog|tail -n 10|awk '{printf $8 , "%s\n\n"}'|sed 's/debug/\n/g' >> latest_evtlogs.out 
Verwandte Themen