Grep zum Filtern und Anzeigen nur des Zeilenanfangs

Grep zum Filtern und Anzeigen nur des Zeilenanfangs

(verwende MacOSX und konvertiere dies möglicherweise in ein Perl-Skript). Ich bin ziemlich neu bei Linux/Unix-Befehlen und meine Google-Suche war erfolglos.

Ich erstelle ein Skript, um schnell nach Trainingsaufzeichnungen einer Person suchen zu können. Ich mache das so, dass ich die Trainingsaufzeichnungen der Person in einer Zeile aufliste (vielleicht gibt es einen besseren Weg?). Wenn ich Grep verwende, um nach einem bestimmten Namen, einer Ausbildungsposition oder einem Datum zu suchen, wird die gesamte Zeile angezeigt. Ich möchte mit Grep nach einer bestimmten Zeichenfolge suchen und nur den Anfang der Zeile anzeigen, d. h. die ersten beiden Wörter (Vorname / Nachname).

Die Datei Training.txt sieht ungefähr so ​​aus:

Ivie, Shawn Kassierer 24.05.2016 Lager 02.12.2016 Service-Desk 31.11.2016

Allen, Adam Kassierer 10.05.2016 Lagerraum 13.12.2016

Martinez, Jessica Kassiererin 20.05.2017 Lager 29.10.2016 Vorgesetzte 23.01.2016

Der Befehl, den ich jetzt verwende, ist: grep "Cashier" Training.txt

das alle 3 Datensätze zurückgibt, den gesamten Zeileninhalt aller Datensätze.

Ich habe es versucht: grep -E -o ".{0,0}Cashier.{0,5}" Training.txt

das (in diesem Beispiel alle 3 Datensätze) zurückgibt, aber vor „Kasse“ null Zeichen und danach 5 Zeichen anzeigt.

Cashier 5/10

Wie kann ich ein Grep (oder vielleicht einen Perl-Befehl) einbinden, um beispielsweise nach „Supervisor“ zu suchen und nur die ersten beiden Wörter (Namen) anzuzeigen? Zweitens: Irgendwelche Ideen, die diesen Vorgang einfacher machen könnten? (Eine Tabellenkalkulation ist in diesem Fall einfach nicht hilfreich).

Antwort1

Dies ist perfekt für awk:

awk '/Supervisor/ { print $1, $2 }' /path/to/inputfile

Sie können die Suche sogar auf das dritte Feld beschränken, damit Sie für jemanden mit dem Namen „Supervisor Bob“ kein falsches Positiv erhalten:

awk '$3 ~ /Supervisor/ { print $1, $2 }' /path/to/inputfile

Antwort2

Sie können grepes bei Perlaktiviertem Modus verwenden:

grep -oP '^(\S+,?\s+){2}(?=Cashier\s)'

Ergebnisse

Ivie, Shawn
Allen, Adam
Martinez, Jessica

Arbeiten

  • Im Perl-Modus sucht grep nach zwei Feldern (\S+) vom Zeilenanfang.
  • Und wenn wir am Ende des Leerzeichens des zweiten Felds einen Kassierer gefolgt von einem Leerzeichen sehen, haben wir unsere Übereinstimmung gefunden. Da die Zeichenfolge „Kassierer“ als Lookaround dient, wird sie nicht in die Übereinstimmung einbezogen.

verwandte Informationen