grep nur in spezieller Spalte

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
uname
Beiträge: 12474
Registriert: 03.06.2008 09:33:02

grep nur in spezieller Spalte

Beitrag von uname » 27.04.2012 08:53:58

Hallo,

ich hatte mal wieder ein kleines Problem. Ich habe eine Zeichenkette gesucht, die an der 7. Stelle getrennt durch Leerzeichen zu stehen hatte. In "awk" mache ich das so wobei ich immer mal wieder die Syntax vergesse.

Code: Alles auswählen

awk '$7 =="gesucht" {print $0}' datei.txt
Nun frage ich mich ob "grep" evtl. in Verbindung mit "cut" das auch kann. Ich möchte aber immer die ganze Zeile ausgeben. Vielleicht gibt es auch andere Programme.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: grep nur in spezieller Spalte

Beitrag von rendegast » 27.04.2012 13:07:48

Bei grep müßte das wohl über den regulären Ausdruck gemacht werden.
Vielleicht
'^([^ ]* *){6}muster'
sei 6 Gruppen aus nicht-Leerzeichen, durch beliebige Leerzeichen getrennt, dann das Muster
(Ungetestet, zBsp. bzgl. Quoting der Klammern, natürlich auch bzgl. posix)
awk ist einfacher.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
Meillo
Moderator
Beiträge: 9267
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: grep nur in spezieller Spalte

Beitrag von Meillo » 27.04.2012 14:35:08

rendegast hat geschrieben:Bei grep müßte das wohl über den regulären Ausdruck gemacht werden.
Vielleicht
'^([^ ]* *){6}muster'
sei 6 Gruppen aus nicht-Leerzeichen, durch beliebige Leerzeichen getrennt, dann das Muster
(Ungetestet, zBsp. bzgl. Quoting der Klammern, natürlich auch bzgl. posix)
Achtung, der Stern beinhaltet auch nullmaliges Anwenden des zuvorstehenden Ausdrucks, d.h. dein Ausdruck passt auch wenn die Zeile mit `muster' beginnt.

Mit grep -E geht laut POSIX:

Code: Alles auswählen

grep -E '^([^ ]+ +){6}gesucht'
Allerdings unterstuetzen manche alten `grep -E'/egrep-Implementierungen
die geschweiften Klammern nicht. Eine POSIX-Implementierung aber immer.

Mit reinem grep (also mit BREs) wird die RE halt etwas laenger:

Code: Alles auswählen

grep '^\([^ ][^ ]*  *\)\{6\}gesucht'
(Da sind zwei Leerzeichen vor dem zweiten Stern.)

awk ist einfacher.
Definitiv und da `{print $0}' die default Action ist, reicht schon

Code: Alles auswählen

awk '$7 == "gesucht"'
um ein ``Spalten-grep'' zu implementieren.
Use ed once in a while!

Antworten