Sed ist ein Stream EDitor, der auch ohne Weiteres in Bashskripten verwendet werden kann. An sich liest sed immer nur einzelne Zeilen ein, aber kann sehr wohl auch mehrere auf einmal verarbeiten.
sed '1n;N;N;s/\n/;/g' datei.txt
Fügt jeweils 3 Zeilen der datei.txt zusammen, wobei die erste Zeile ausgelassen wird.
Die Einträge werden durch Strichpunkt getrennt. Die Ausgabe erfolgt nach stdout.
egrep '(Suchbegriff1|Suchbegriff2|Suchbegriff3)' datei.txt | sed 'N;N;s/\n/;/g' > neuedatei.csv
Sucht mit egrep die Zeilen mit den gewünschten Suchbegriffen und baut daraus eine csv-Datei mit Strichpunkt als Feldtrennzeichen, die z.B. mit OpenOffice weiter verarbeitet werden kann.
Details
N;N; sed liest eine Zeile (das tut er immer), dann noch eine und noch eine, also 3 auf einmal
s/\n/;/g sed ersetzt (s=substitute) den Zeilenumbruch (\n) durch Strichpunkt, und zwar global (g) in der gesamten Eingabe (im obigen Beispiel datei.txt)
Beispiel 1
Ich habe eine umfangreiche Textdatei, in der über mehrere Zeilen verteilt Werte stehen, die ich gegenüberstellen möchte:
Eins
Zwei
Drei
Vier
Fünf
Sechs
Sieben
Acht
Neun
sed 'N;N;s/\n/;/g' datei.txt
Das erzeugt folgende Ausgabe:
Eins;Zwei;Drei
Vier;Fünf;Sechs
Sieben;Acht;Neun
Beispiel 2
Ich möchte aus dem lokalen Mailordner meines Emailprogrammes (pop3) eine Liste aller Mails, die ich vor mindestens 400 Tagen versendet habe, und zwar nur Datum, an wen und der Betreff. Ich wechsle also in den "gesendet" Ordner und:
find . -ctime +400 > /tmp/ollemails.txt
egrep '(^Date: |^To: |^Subject: )' $(cat /tmp/ollemails.txt) | cut -d":" -f 3- | sed 'N;N;s/\n/ | /g'
Ich gehe hier den Umweg über eine temporäre Datei. Diese wird dann on-the-fly mit cat geöffnet und an egrep verfüttert. Mit cut sortiere ich die ersten (unnützen) Felder aus, sed fügt je 3 Zeilen zusammen (Trennzeichen |).
Das Ergebnis ist eine Übersichtsliste mit allen gesendeten Mails.
...
Fri, 25 May 2007 09:44:12 +0200 | user@domain.com | testmail
...
Beispiel 3
Ist Beispiel 2 ähnlich, verzichtet aber auf egrep (sed kann das auch selbst) und fügt nach Suchmuster zusammen und nicht nur nach Zeilenanzahl, was ein Vorteil ist, wenn z.B. ein Feld/eine Zeile mal fehlen würde.
find . -ctime +400 > /tmp/ollemails.txt
sed '/^Date: |^To: |^Subject: /!d' $(cat /tmp/ollemails.txt) | sed '/Date: /N;N; s/\n/ | /g' > /tmp/uebersicht.txt
Die Übersichtsliste (in diesem Fall eine Datei) sieht etwas anders aus:
...
Date: Fri, 25 May 2007 09:44:12 +0200 | To: user@domain.com | Subject: testmail
...
Es mag übrigens auch sinnvollere Beispiele geben