Wie führe ich grep in einer einzelnen Spalte aus?

42

Ich möchte die Ausgabe meines ls -lBefehls überprüfen :

-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 nur grep rahmuin Spalte $ 3 ausgeführt werden, daher sollte die Ausgabe meines grepBefehls 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

Wie geht das am einfachsten? Die Antwort muss auf viele Unices übertragbar 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.

rahmu
quelle
5
Beachten Sie, dass das Parsen der Ausgabe von lsinhärent fragil ist (denken Sie daran, was passiert, wenn ein Benutzername Leerzeichen enthält - und ja, dies passiert auf einigen Plattformen). Verwenden Sie findstattdessen.
Gilles 'SO- hör auf böse zu sein'
Hiermit wird die Titelfrage nicht beantwortet, aber ich möchte erwähnen, dass die --printfOption statnützlich sein kann, wenn Sie andernfalls das Parsen in Betracht ziehen ls. Aber normalerweise findist es das , was du willst (wie @Gilles erwähnt).
Wildcard

Antworten:

49

Ein weiteres Mal awkspart den Tag!

Hier ist ein einfacher Weg, 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"' 
rahmu
quelle
9
Oder: ls -l | awk '$3=="rahmu"'... und übrigens sollte die öffnende (Klammer nach if...awk '{if($3 ...'
Peter.O
3
@ Peter.O +1 von mir. Ihr Befehl ist prägnanter und korrekter, da der Ausdruck die Standardeinstellung für eine awk-Übereinstimmung ist.
bsd
Um Lokalisierungsprobleme zu vermeiden (das Datumsformat wirkt sich auf die Spaltenreihenfolge aus), wird häufig empfohlen, das Standardformat und die Standardsprache zu verwenden:LANG=C ls -l | awk ...
fheub
11

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

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

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

jfg956
quelle
2

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 folgt zu verwenden:

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

Der von '//' eingeschlossene Teil kann ein beliebiger regulärer Ausdruck sein.

PejoPhylo
quelle
1

Um anhand einer einzelnen Benutzernamenspalte zu suchen (und nur Dateien auszudrucken), können Sie Folgendes versuchen:

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

Wechseln Sie für Verzeichnisse -zu d, und entfernen Sie für jeden Typ -.

Grundsätzlich wird jede Spalte ausgewählt, \S\+\s\+die mit einem Nicht-Leerzeichen gefolgt von einem Leerzeichen übereinstimmt. Daher stimmen wir mit drei ersten Spalten und dann mit dem Benutzernamen überein.

Kenorb
quelle