Chcę grepować wyjście mojego ls -l
polecenia:
-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
Chcę uruchomić tylko grep rahmu
w kolumnie $ 3, więc wynik mojej grep
komendy powinien wyglądać następująco:
-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
Jak najprościej to zrobić? Odpowiedź musi być przenośna na wiele Uniksów, najlepiej na Linuksie i Solarisie.
NB: Nie szukam sposobu na znalezienie wszystkich plików należących do danego użytkownika. Ten przykład został podany tylko w celu wyjaśnienia mojego pytania.
ls
jest z natury delikatne (pomyśl, co się stanie, jeśli nazwa użytkownika zawiera spacje - i tak, dzieje się to na niektórych platformach). Użyjfind
zamiast tego.--printf
opcja tastat
może się przydać w miejscach, w których w innym przypadku można rozważyć analizęls
. Ale zwyklefind
jest to, czego chcesz (jak wspomniano @Gilles).Odpowiedzi:
Jeszcze jeden czas
awk
oszczędza dzień!Oto prosty sposób na zrobienie tego ze stosunkowo prostą składnią:
lub nawet prościej: (Dzięki Peter.O w komentarzach)
źródło
ls -l | awk '$3=="rahmu"'
... a przy okazji,(
klamra otwierająca powinna być poif
...awk '{if($3 ...'
LANG=C ls -l | awk ...
Jeśli chcesz dopasować tylko część ciągu w danej kolumnie, możesz skorzystać z porady ze strony https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partly-matches
źródło
Jeśli przez kolumnę rozumiesz kolumnę o stałym rozmiarze, możesz:
gdzie
^
oznacza początek linii,.
oznacza dowolny znak i\{15\}
oznacza dokładnie 15 wystąpień poprzedniego znaku (w tym przypadku dowolny znak).źródło
Wiem, że jestem spóźniony na imprezę, ale uważam, że bardzo ogólnym rozwiązaniem tego problemu jest użycie awk z wyrażeniami regularnymi:
Część ujęta w „//” może być dowolnym wyrażeniem regularnym.
źródło
Aby grepować na podstawie pojedynczej kolumny nazwy użytkownika (i drukować tylko pliki), możesz spróbować:
W przypadku katalogów zmień
-
nad
, usuń dowolny typ-
.Zasadniczo wybiera każdą kolumnę, według
\S\+\s\+
której pasują znaki spacji, a następnie spacje, więc dopasowujemy trzy pierwsze kolumny, a następnie nazwę użytkownika.źródło