Ich möchte die Ausgabe meines ls -l
Befehls ü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 rahmu
in Spalte $ 3 ausgeführt werden, daher sollte die Ausgabe meines grep
Befehls 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.
ls
inhärent fragil ist (denken Sie daran, was passiert, wenn ein Benutzername Leerzeichen enthält - und ja, dies passiert auf einigen Plattformen). Verwenden Siefind
stattdessen.--printf
Optionstat
nützlich sein kann, wenn Sie andernfalls das Parsen in Betracht ziehenls
. Aber normalerweisefind
ist es das , was du willst (wie @Gilles erwähnt).Antworten:
Ein weiteres Mal
awk
spart den Tag!Hier ist ein einfacher Weg, dies mit einer relativ einfachen Syntax zu tun:
oder noch einfacher: (Danke an Peter.O in den Kommentaren)
quelle
ls -l | awk '$3=="rahmu"'
... und übrigens sollte die öffnende(
Klammer nachif
...awk '{if($3 ...'
LANG=C ls -l | awk ...
Wenn Sie nur einen Teil der Zeichenfolge für eine bestimmte Spalte abgleichen möchten, können Sie den Rat von https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partly-matches verwenden
quelle
Wenn Sie spaltenweise eine Spalte mit fester Größe meinen, können Sie:
Dabei
^
bedeutet "Zeilenanfang" ein.
beliebiges Zeichen und\{15\}
genau 15 Vorkommen des vorherigen Zeichens (in diesem Fall ein beliebiges Zeichen).quelle
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:
Der von '//' eingeschlossene Teil kann ein beliebiger regulärer Ausdruck sein.
quelle
Um anhand einer einzelnen Benutzernamenspalte zu suchen (und nur Dateien auszudrucken), können Sie Folgendes versuchen:
Wechseln Sie für Verzeichnisse
-
zud
, 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.quelle