it-swarm.com.de

Wie starte ich grep für eine einzelne Spalte?

Ich möchte die Ausgabe meines ls -l Befehl:

-rw-r--r--   1 root root       1866 Feb 14 07:47 rahmu.file
-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

Ich möchte rennen grep rahmu nur in Spalte $ 3, daher sollte die Ausgabe meines Befehls grep folgendermaßen aussehen:

-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

Was ist der einfachste Weg, dies zu tun? Die Antwort muss auf viele Unices portierbar sein und sich vorzugsweise auf Linux und Solaris konzentrieren.

NB: Ich suche nicht nach einer Möglichkeit, alle Dateien eines bestimmten Benutzers zu finden. Dieses Beispiel wurde nur gegeben, um meine Frage klarer zu machen.

43
rahmu

Noch einmal awk rettet den Tag!

Hier ist eine einfache Möglichkeit, dies mit einer relativ einfachen Syntax zu tun:

ls -l | awk '{if ($3 == "rahmu") print $0;}'

oder noch einfacher: (Danke an Peter.O in den Kommentaren)

ls -l | awk '$3 == "rahmu"' 
50
rahmu

Wenn Sie nur einen Teil der Zeichenfolge in einer bestimmten Spalte abgleichen möchten, können Sie den Rat von https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partly) verwenden -Matches

some_command | awk '$6 ~ /string/'
17
Colin D

Wenn Sie mit Spalte eine Spalte mit fester Größe meinen, können Sie:

ls -l | grep "^.\{15\}rahmu"

wo ^ bedeutet den Zeilenanfang, . bedeutet ein beliebiges Zeichen und \{15\} bedeutet genau 15 Vorkommen des vorherigen Zeichens (in diesem Fall ein beliebiges Zeichen).

11
jfg956

Ich weiß, dass ich zu spät zur Party komme, aber ich glaube, dass eine sehr allgemeine Lösung für dieses Problem darin besteht, awk mit regulären Ausdrücken wie den folgenden zu verwenden:

awk '$3~/rahmu/{print}' input_file

Der von '//' eingeschlossene Teil kann eine beliebige Art von regulärem Ausdruck sein.

2
PejoPhylo

Um anhand einer einzelnen Benutzernamensspalte zu greifen (und nur Dateien zu drucken), können Sie Folgendes versuchen:

ls -la | grep "^-\S\+\s\+\S\+\s\+rahmu"

Ändern Sie für Verzeichnisse - In d, und entfernen Sie für jeden Typ -.

Grundsätzlich wird jede Spalte mit \S\+\s\+ Ausgewählt, die einem Nicht-Leerzeichen gefolgt von einem Leerzeichen entspricht. Wir stimmen also mit drei ersten Spalten und dann mit dem Benutzernamen überein.

1
kenorb