Giriş klasörü / home olan tüm kullanıcıları listelemek için / etc / passwd dosyasını işle


10

Ben böyle bir örnek / etc / passwd dosyası var:

tom:x:1000:1000:Work:/home/tom:/bin/bash
george:x:1000:1000:Work:/home/george:/bin/bash
bla:x:1000:1000:Work:/home/bla:/bin/bash
boo:x:1000:1000:Work:/home/boo:/bin/bash
bee:x:1000:1000:Work:/root/list:/bin/bash

Giriş klasörü olan tüm kullanıcıları listelemeye çalışıyorum /home/.

yazdım

cat ~/Desktop/e.txt |awk -F ":" '{if ($6 ~/^/home/) print $1;}'

burada e.txt buraya kopyaladığım metindir.

Ben bir kaçış karakteri olan ters eğik çizgi ile ilgili bir sorun olduğunu anlıyorum, ama bunları nasıl bir komutun bir satırında listeleyebilirim?


11
Cevaplar yanında genel danışma (arada sadece bir saniye ile geliyor!): Bu kılan neredeyse hiç hissinin catve boru gibi araçlara awkya sedya, onlar gibi bir argüman olarak dosya adı verilebilir olarak.
Philippos

1
kedi e.txt | grep ana sayfa | cut -d ":" -f 1
Arpit Agarwal

3
Tüm kullanıcıların 1000 UID'si olduğu için biraz zor olabilir.
StrongBad

1
@ArpitAgarwal grep home e.txt | cut -d ":" -f 1. UUOC ödülünüz için tebrikler. Ancak, bu iyi bir çözüm değildir. Ya daemondan sonra adlandırılan ayrı bir kullanıcı altında çalışan bir hizmet "homebackups" varsa? Bu yanlış bir pozitif.
NieDzejkob

2
@Philippos re "Dosya adı argüman olarak verilebilen araçlara kedi ve boru takmak neredeyse hiç mantıklı değil" - Genellikle cat > toolbu tür komut satırlarının varyantını kullanıyorum çünkü soldan sağa akışı koruyarak netliği artırabilir boru zincirinin girdi-işleme-çıktısının. Bu ise ancak hemen hemen her zaman minimal böylece, daha az verimli. Aynı zamanda (tıpkı değiştirilmesi için ilgili ve kullanışlı etkileşimli çok belirgin çalışan bir ilerleme çubuğu ekleyerek yapar catile pvyüklü ise).
David Spillett

Yanıtlar:


11

Aşağıda gösterildiği gibi eğik çizgilerden kaçabilirsiniz:

awk -F':' '$6~/^\/home\//{ print $1 }' ~/Desktop/e.txt

Başka bir hile karmaşık alan ayırıcı kullanmak olacaktır:

awk -F'[:/]' '$7=="home"{ print $1 }' ~/Desktop/e.txt
  • -F'[:/]'- her ikisini de tedavi edin :ve /alan ayırıcısı olun

2
Yorum alanının (giriş dizininden hemen önce) eğik çizgi içermesine izin verildiğine inanıyorum.

12

/Kaçmaktan kaçınmak için normal ifade yerine tırnak işaretleri kullanabilirsiniz /:

awk -F: '$6 ~ "^/home/" {print $1}' ~/Desktop/e.txt

Ile awk, {if (foo) ... }genellikle sadece basitleştirilebilir foo {...}.


8

Varsayarsak e.txtaslında /etc/passwdgerçekte kullanmalısınız, getent passwdbunun yerine kullanıcı hesabı bilgileri belirtilen birden çok yerde saklanabilir beri dosyayı ayrıştırma /etc/nsswitch.confLDAP gibi.

getent passwd | awk -F ':' '$6 ~ "^/home"'

printKoşul doğru olduğunda ifadenin ima edildiğini unutmayın . Bu bütün çizgiyi basacaktır. Bu yalnızca kullanıcı adını yazdırır:

getent passwd | awk -F ':' '$6 ~ "^/home" {print $1}'

4

Awk sevmeyenlerimiz için alternatif:

grep -E '^([^:]*:){5}/home/' ~/Desktop/e.txt | cut -d: -f1

Açıklama:

  • grep -E birkaç genişletilmiş düzenli ifade özelliğinin kullanılmasını sağlar
  • İfade ([^:]*:), aşağıdaki ':' ayırıcıyı içeren bir sütunla eşleşir
  • ^([^:]*:){5} her satırın ilk beş sütunuyla eşleşir
  • ^([^:]*:){5}/home/ 6. sütunun '/ home /' ile başladığı her satırla eşleşir
  • cut -d: -f1:sütun ayırıcı olarak kullanarak girdisinin yalnızca ilk sütununu seçer

3

Ayrıca , dize başlangıcı indexgibi sabit dize eşleşmesi için grep -Fkullanabilir ve dizenin başlangıcıyla eşleştiğinden emin olmak için dönüş değerini kullanabilirsiniz

$ awk -F: 'index($6,"/home/")==1{print $1}' ip.txt
tom
george
bla
boo

veya normal ifade gerekiyorsa, ortam değişkeni olarak iletin

$ r='^/home/' awk -F: '$6 ~ ENVIRON["r"]{print $1}' ip.txt
tom
george
bla
boo

3

Sadece çeşitlilik için

$ perl -F: -lane 'print $F[0] if m(/home/)' e.txt
tom
george
bla
boo

açıklama

-F:     use ":" as field separator  
-lane
    l   add newline line-ending to every print statement
    a   auto-split input lines into @F array
    n   apply expression line by line to named file (or STDIN)
    e   evaluate perl commands given on command line

print $F[0]   print (only) the first field of each line
if m(/home/)  but only if the line contains the text /home/

Nerede Varyasyon Eğer seçici olmak istiyorsanız /home/bulunursa

perl -F: -lane 'print $F[0] if $F[5] =~ m(^/home/)' e.txt
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.