Grep tek bir sütunda nasıl çalıştırılır?


42

Komutumun çıktısını grep etmek istiyorum ls -l:

-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

grep rahmuYalnızca $ 3 sütununda çalışmak istiyorum , bu nedenle grepkomutumun çıktısı şöyle görünmelidir:

-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

Bunu yapmanın en basit yolu nedir? Bu sorunun cevabı birçok Linux'ta taşınabilir olmalı, tercihen Linux ve Solaris'e odaklanmalıdır.

Not: Belirli bir kullanıcıya ait tüm dosyaları bulmak için bir yol aramıyorum. Bu örnek sadece sorumu daha açık hale getirmek için verildi.


5
O Not çıktısını ayrıştırma lsdoğal olarak kırılgandır (- ve evet, bu bazı platformlarda olur bir kullanıcı adı boşluk içeriyorsa ne olur düşünün). Yerine findkullanın.
Gilles 'SO durdurma varlık kötülük'

Bu başlık soruya cevap vermez, ama o söz edeceğiz --printfseçenek için statbaşka türlü ayrıştırma düşünebilirsiniz yerlerde kullanışlı gelebilir ls. Ancak genellikle findistediğiniz şeydir (@Gilles’in dediği gibi).
Joker

Yanıtlar:


49

Bir kez daha awkgünü kurtarır!

İşte nispeten basit bir sözdizimi ile bunu yapmanın basit bir yolu:

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

veya daha da basit: (Yorumlardaki Peter.O için teşekkürler)

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

9
Veya: ls -l | awk '$3=="rahmu"'... ve bu arada, açılış (dirseği sonra olmalı if...awk '{if($3 ...'
Peter.O

3
@ Peter.O +1 benden. Komutunuz daha özlü, doğru, çünkü baskı bir awk eşleşmesi için varsayılandır.
bsd

Yerelleştirme sorunlarından kaçınmak için (tarih formatı sütun sırasını etkiler) genellikle standart format ve dilin sağlanması önerilir:LANG=C ls -l | awk ...
fheub


11

Sütun ile, sabit boyutlu sütunu kastediyorsanız, şunları yapabilirsiniz:

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

burada ^satırın başlangıcı, .herhangi bir karakter ve bir \{15\}önceki karakterin tam olarak 15 tekrarı (bu durumda herhangi bir karakter) anlamına gelir.


2

Partiye geç kaldığımı biliyorum, ancak bu sorunun çok genel bir çözümünün şöyle ifadeleri kullanarak awk kullanmak olduğuna inanıyorum:

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

'//' ile çevrelenen kısım her türlü düzenli ifade olabilir.


1

Tek kullanıcı adı sütununu temel alarak (ve sadece dosyaları yazdırmak için) deneyebilirsiniz:

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

Dizinleri için, değiştirmek -içine dher türlü çıkarma işleminde, -.

Temelde \S\+\s\+boşluk içermeyen bir karakterin ardından gelen boşluk karakterleri ile eşleşen her bir sütunu seçer , bu nedenle ilk önce üç sütunu ve ardından kullanıcı adını eşleştiririz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.