Ähnlich wie bei awk kann man perl das Programm auf der Konsole direkt übergeben. Dazu ruft man perl mit der Option -e auf. Das Programm muss dann in Hochkommata eingeschlossen werden.
Beispiel:
perl -e 'print "Hello World!\n"'
Um jede print-Anweisung mit einem “newline” abzuschließen, kann man zusätzlich die Option -l benutzen:
perl -l -e 'print "Hello World!"; print "Hello Ubuntuusers!"'
Um eine Datei Zeile für Zeile durchzugehen, gibt es die Option -n. Das Program beschreibt dann ähnlich wie bei awk was mit jeder Zeile geschehen soll:
perl -n -l -e 'print $_ if $_ =~ /foo/"' datei.txt
gibt alle Zeilen aus, die “foo” enthalten.
Die Option -n entspricht folgendem Code:
while(<>){ # Der Code, der übergeben wird }
Die Option -a bringt perl noch einen Schritt näher zu awk. Damit werden die Wörter einer Zeile (die durch Leerzeichen getrennt sind) in das Array @F geladen. Den Worttrenner kann man mit der Option -F setzen:
perl -n -a -F; -e 'print $F[$#F]' datei.csv
gibt von jeder Zeile das letzte Element einer csv (Comma Separated Value) Datei aus.
Dies entspricht folgendem Code:
while(<>){ @F = split($pattern); # Der übergebene Code }
wobei $pattern das mit -F übergebene Pattern (im obigen Beispiel ";") ist. Dadurch sind auch reguläre Ausdrücke wie -F/[0-9]+/ möglich.
Es können auch die Schlüsselwörter BEGIN und END gesetzt werden um einen Block vor oder nach der Hauptschleife auszuführen:
perl -n -l -a -e 'BEGIN{$x=0} {$x+=$F[$#F]} END{print $x}' preisliste.txt
errechnet den Gesammtpreis einer Preisliste, in der am Ende jeder Zeile der Preis steht. Es wird also von jeder Zeile das letzte Wort addiert. Man könnte das Programm jetzt auch noch etwas kürzer schreiben:
perl -nlae '$x+=$F[$#F]; END{print $x}' preisliste.txt
Dies entspricht dem awk-Programm:
awk '{x+=$NF} END{print x}' preisliste.txt
Für das Suchen und Ersetzen mit Regulären Ausdrücken eignet sich die Option -p. Diese Funktioniert genau wie -n mit dem Unterschied, dass jede Zeile automatisch ausgegeben wird. So kann man wie mit sed Dateien ändern:
perl -pe 's/foo/bar/g' datei.txt > datei_new.txt
ersetzt jedes Vorkommen von “foo” durch “bar” und schreibt das Ergebnis in die Datei “datei_new.txt”.
Um die Datei direkt zu ändern, kann man die Option -i verwenden. Dieser kann optional ein String mitgegeben, der an den verwendeten Dateinamen angehängt den Dateinamen einer anzulegenden Sicherheitskopie ergibt:
perl -pi -e 's/foo/bar/g' *.txt perl -pi.orig -e 's/foo/bar/g' datei.txt
Beim ersten Befehl jede Text-Datei im aktuellen Verzeichnis direkt geändert. Beim zweiten wird die “datei.txt” nach “datei.txt.orig” kopiert bevor jedes Vorkommen von “foo” durch “bar” ersetzt wird. (Man kann natürlich auch mit dem 2. Befehl beliebig viele Dateien bearbeiten, wenn man * benutzt.)
Module
Die Option -M erlaubt es einem beliebige Module einzubinden, die dann im Programm benutzt werden können. So kann man z.B. mit dem folgenden Befehl mit dem Modul LWP::Simple eine Webite laden und den HTML-Code ausgeben:
ls | perl -MLWP::Simple -e 'getprint("http://zinformatik.de")'
Mit dem folgenden Befehl werden von allen iso Dateien im Verzeichnis MD5-Summen erstellt:
ls *.iso | perl -MDigest::MD5 -nle 'open(FILE,$_); $d=Digest::MD5->new; $d->addfile(FILE); print $d->hexdigest'
Fazit
Für kleinere kosmetische Änderungen eines Textes oder einer Ausgabe sowie zum extrahieren von Informationen daraus ist awk meist besser geeignet. Bei komplexeren Aufgabenstellungen ist die Mächtigkeit von perl jedoch vorteilhafter.
Vor allem durch die Möglichkeit der Dateioperationen sollen manche Aktionen beschleunigt werden können:
Statt des Aufrufs:
find -name "*.bak" -exec rm "{}" \;
der für jede gefundene Datei einen neuen Prozess startet um sie zu löschen kann man folgenden Befehl nutzen:
find -name "*.bak" -print | perl -nle 'unlink'
Es ist jedenfalls nicht verkehrt beides zu kennen, ganz nach dem Motto: Für jeden Zweck die richtige Programmiersprache.
[UPDATE]Mehr informationen liefert der Befehl perldoc perlrun (perldoc muss installiert sein) oder die Seite http://p3rl.org/perlrun[/UPDATE]
Folgende Beiträge könnten Dich auch interessieren:
Schlagworte: Einzeiler, Konsole, perl








perldoc gibt’s auch online. Für perlrun ist es z.B. http://p3rl.org/perlrun
Hallo Renée,
vielen Dank für den Hinweis. Das kannte ich noch gar nicht.
Werde es mit in den Artikel aufnehmen.
Viele Grüße
zimon