Saya ingin menerima output dari ls -l
perintah saya :
-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
Saya ingin menjalankan hanya grep rahmu
pada kolom $ 3, sehingga output dari grep
perintah saya akan terlihat seperti ini:
-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
Apa cara paling sederhana untuk melakukannya? Jawabannya harus portabel di banyak Unices, lebih disukai berfokus pada Linux dan Solaris.
NB: Saya tidak mencari cara untuk menemukan semua file milik pengguna tertentu. Contoh ini hanya diberikan untuk membuat pertanyaan saya lebih jelas.
ls
inheren rapuh (pikirkan apa yang terjadi jika nama pengguna berisi spasi putih - dan ya, ini terjadi pada beberapa platform). Gunakanfind
sebagai gantinya.--printf
opsi untukstat
berguna di tempat-tempat di mana Anda mungkin mempertimbangkan untuk parsingls
. Tapi biasanya,find
itulah yang Anda inginkan (seperti yang disebutkan @Gilles).Jawaban:
Sekali lagi
awk
menghemat hari!Berikut cara mudah untuk melakukannya, dengan sintaks yang relatif sederhana:
atau bahkan lebih sederhana: (Terima kasih kepada Peter.O dalam komentar)
sumber
ls -l | awk '$3=="rahmu"'
... dan omong-omong,(
braket pembuka harusnya setelahif
...awk '{if($3 ...'
LANG=C ls -l | awk ...
Jika Anda ingin mencocokkan hanya sebagian dari string pada kolom tertentu, Anda dapat menggunakan saran dari https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partly-matches
sumber
Jika menurut kolom, maksud Anda adalah kolom ukuran tetap, Anda dapat:
di mana
^
berarti awal dari baris,.
berarti karakter apa pun dan\{15\}
berarti persis 15 kemunculan karakter sebelumnya (karakter apa pun dalam kasus ini).sumber
Saya tahu saya terlambat ke pesta, tapi saya percaya solusi yang sangat umum untuk masalah ini adalah menggunakan awk dengan ekspresi reguler seperti:
Bagian yang dilingkupi oleh '//' dapat berupa ekspresi reguler apa pun.
sumber
Untuk mengambil berdasarkan kolom nama pengguna tunggal (dan hanya mencetak file), Anda dapat mencoba:
Untuk direktori, ubah
-
menjadid
, untuk semua jenis hapus-
.Ini pada dasarnya memilih setiap kolom
\S\+\s\+
yang cocok dengan karakter non-spasi diikuti oleh karakter spasi, jadi kami mencocokkan tiga kolom pertama dan kemudian nama pengguna.sumber