Unterschiede in grep für Unix und Linux

RedXon

Lt. Commander
Registriert
März 2010
Beiträge
1.148
Hallo zusammen

Ich habe eine kleine Frage an alle, die sich mit grep und egrep auskennen.
Ich verwende derzeit sehr viel grep, da ich momentan an der Uni auch noch einen Computerlinguistik Kurs besuche. Diese Frage konnte mir bis jetzt allerdings weder der Professor, noch die Tutoren erklären.

Es geht darum, dass wir momentan sehr viel mit dem Befehl grep und egrep arbeiten. Der Professor arbeitet allerdings mit einem Mac, was ja demzufolge Unix ist. Ich hatte hier angenommen, dass die Terminal Module von Unix und Linux dieselben sind, was leider nicht so ist. Vor allem aufgefallen ist mir dies mit grep.

Z.B. ist der Standart grep auf Linux nicht in der Lage, reguläre Ausdrücke zu verarbeiten, auf Unix allerdings schon. Ein grep 'Baum\t' filename.txt wird in Unix also korrekterweise nach dem Wort Baum gefolgt von einem Tabulator suchen, unter Linux wird allerdings nach dem Ausdruck "Baum\t" gesucht. Einen Teil der Probleme konnte ich mit egrep und dem Paramter grep -P beheben, allerdings tun sich dadruch einige andere Probleme auf, weil offenbar auch einige andere Befehle unter egrep oder grep -P sich anders verhalten als nur unter grep oder eben grep auf Unix.

Nun, lange Rede kurzer Sinn, ich habe leider bei Google noch nichts gefunden, aber weiss jemand, wie genau sich die beiden "greps" von einander unterscheiden bzw. kennt eine Webseite wo alle Befehle schön aufgelistet sind, welche anders funktionieren?

Vielen Dank fürs druchlesen und für jegliche Hilfe.
 
Mit der im relevanten Standard für grep beschriebenen Funktionalität kannst du relativ sicher überall rechnen. Versuche damit auszukommen. Darüber hinaus gibts allerlei Erweiterungen, die oft nützlich aber eben systemspezifisch sind.

egrep = grep -E = grep mit erweiterten RegExps. Was die genau können, ist auf o.g. Seite verlinkt.

\t steht weder in normalen noch extended RegExps für den Tabulator. Um nach Tabs zu suchen musst du also wirklich einen Tab im Suchmuster angeben statt der "\t"-Umschreibung. Oder Perl-RegExps (PCRE, grep -P bei GNU-grep) nutzen. Da steht \t tatsächlich fürs Tab. Nur kennt eben nicht jedes grep PCREs.

Mit "man grep" bekommst du Hilfe zum grep auf dem jeweiligen Rechner. Immer erst die mitgelieferte Doku lesen, bevor du wild im Web suchst oder fragst.
 
Zuletzt bearbeitet:
GNU grep ist nicht GNU egrep ist nicht BSD/UNIX egrep ist nicht BSD/UNIX grep.

BSD grep/egrep: manpage (OpenBSD*)
GNU grep/egrep: manpage

* Es ist nicht auszuschließen, dass es in verschiedenen Betriebssystemen verschiedene Parameter gibt, da grep zwar POSIX-standardisiert ist, aber es immer wieder Anpassungen gibt, zum Beispiel, um Kompatibilität herzustellen.
 
Zuletzt bearbeitet:
Danke für die Hilfe. Natürlich habe ich die Manuals schon konsultiert, bevor ich wild hier den Beitrag erstellt habe. Jedoch hat mir dies offenbar nicht genug geholfen...

Ich fand halt einfach merkwürdig, dass unter Unix (OSX im Beispiel) das normale grep Parameter wie \t o.ä. verwendet werden konnten, unter Linux jedoch nicht. Und da in der Vorlesung ja offenbar keiner der Dozenten Erfahrung mit Linux hatte, war das eher mühsam. Denn auch da habe ich, vor allem am Anfang einfach nicht gemerkt, wieso dieser und jener Befehl bei mir nicht funktioniert, wenn doch der Dozent vorne sauber vorzeigt wie es geht. Dass die beiden greps nicht gleich sind, habe ich dann relativ schnell bemerkt. Dazu haben wir ja auch schöne Anleitungen erhalten, wie man alles erreichen sollte, jedoch eben immer auf BSD grep bezogen, womit man eben mit dem GNU Grep einen erheblichen Mehraufwand betreiben muss.

Daher, als ich gestern nach 8 Stunden an der ersten Übungsaufgabe (welche mit ca. 2 Stunden betitelt war) noch nicht alles erreichen konnte, kam mir halt der Gedanke, doch mal im Forum nachzufragen, da hier wohl eher jemand bescheid wusste, nachdem mir die Tutoren, Mitstudenten und Google nicht weiterhelfen konnten.
 
Ich halte es für kaputt, wenn Apples grep ohne Option oder mit -E die Abkürzung "\t" auf ein Tab matcht. Ein standardkonfomes Unix darf sowas IMHO nicht tun.

Ich mal etwas gegraben. Grep ruft für den Vergleich recomp(3) auf. Das Format der REs ist in re_format(7)) beschrieben und dort steht u.a. folgendes drin:

ENHANCED FEATURES
When the REG_ENHANCED flag is passed to one of the regcomp() variants, additional features are acti-vated. activated.
vated. Like the enhanced regex implementations in scripting languages such as perl(1) and python(1),
these additional features may conflict with the IEEE Std 1003.2 (``POSIX.2'') standards in some ways.
Use this with care in situations which require portability (including to past versions of the Mac OS X
using the previous regex implementation).
...
Literal Sequences (available for both enhanced basic and enhanced extended REs)
...
\t The ``horizontal-tab'' character (ASCII code 9).

Wenn ein Programm recomp() mit dem diesem Flag REG_ENHANCED aufrufen würde, würde es das vor dir beschriebene Verhalten erklären. Grep darf das Flag aber nicht nutzen, weil das Programm damit mehr standardkonform arbeiten würde.

Kurze Googelei führt zu einem überraschenden Blogpost. Seit MacOS Version 10.8 hat Apple auf ein anderes grep umgestellt, was in IN VOREINSTELLUNG regcomp() mit dem Flag REG_ENHANCED aufruft. Damit wäre die Ursache des kaputten Verhaltens geklärt.

Apple-Software benutzen ist eben keine gute Idee.
 
mensch183 schrieb:
Ich halte es für kaputt, wenn Apples grep ohne Option oder mit -E die Abkürzung "\t" auf ein Tab matcht. Ein standardkonfomes Unix darf sowas IMHO nicht tun.

Was sagt der Standard dazu?
 
Heute hoffentlich nichts anderes, als ich gestern in #3 beschrieben und verlinkt habe.
 
Zurück
Oben