उन सभी उपयोगकर्ताओं को सूचीबद्ध करने के लिए प्रक्रिया / etc / passwd फ़ाइल, जिनके घर फ़ोल्डर / घर में है


10

मेरे पास इस तरह का एक उदाहरण / etc / passwd फ़ाइल है:

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

मैं सभी उपयोगकर्ताओं को एक होम फ़ोल्डर के साथ सूचीबद्ध करने का प्रयास कर रहा हूं /home/

मैंने लिखा

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

जहाँ e.txt पाठ मैंने यहाँ कॉपी किया है।

मैं समझता हूं कि बैकस्लैश के साथ एक समस्या है जो पलायन चरित्र है, लेकिन मैं इसे कैसे ठीक करूं ताकि मैं उन्हें एक कमांड की एक पंक्ति में सूचीबद्ध कर सकूं?


11
उत्तरों के अलावा एक सामान्य सलाह (जो बीच में सिर्फ एक सेकंड के साथ आ रही है!): यह लगभग कभी भी catऔर जैसे awkया जैसे टूल को पाइप नहीं करता है sed, क्योंकि उन्हें एक तर्क के रूप में फ़ाइल नाम दिया जा सकता है।
फिलीपोस

1
बिल्ली e.txt | घर घर | cut -d ":" -f 1
अर्पित अग्रवाल

3
जैसा कि सभी उपयोगकर्ताओं के पास 1000 चीजों का यूआईडी है, थोड़ा मुश्किल हो सकता है।
स्ट्रॉन्गबैड

1
@ArpitAgarwal grep home e.txt | cut -d ":" -f 1। आपके यूयूओसी पुरस्कार के लिए बधाई। हालांकि, यह एक अच्छा समाधान नहीं है। क्या होगा अगर एक सेवा "होमबैकअप" है जो डेमॉन के नाम पर एक अलग उपयोगकर्ता के तहत चलती है? वह झूठा सकारात्मक है।
निएडजेककोब

2
@Philippos फिर से "यह लगभग कभी भी बिल्ली और पाइप को औजार नहीं बनाता है [कि] को एक तर्क के रूप में फाइलनाम दिया जा सकता है" - मैं आमतौर पर cat > toolइस तरह की कमांड लाइनों के प्रकार का उपयोग करता हूं क्योंकि यह बाएं से दाएं प्रवाह को बनाए रखने से स्पष्टता में सुधार कर सकता है पाइप श्रृंखला के इनपुट-प्रोसेसिंग-आउटपुट के। यह है कम कुशल, लेकिन लगभग हमेशा न्यूनतम इसलिए। यह एक प्रगति पट्टी को भी जोड़ता है जहां अंतःक्रियात्मक रूप से बहुत स्पष्ट रूप से चलने के दौरान प्रासंगिक और उपयोगी होता है (बस अगर यह स्थापित है तो उसके catसाथ बदलें pv)।
डेविड स्पिलेट

जवाबों:


11

आप आगे दिखाए गए स्लैश से बच सकते हैं:

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

एक अन्य चाल जटिल क्षेत्र विभाजक का उपयोग होगी:

awk -F'[:/]' '$7=="home"{ print $1 }' ~/Desktop/e.txt
  • -F'[:/]'- इलाज दोनों :और /एक क्षेत्र विभाजक होने के लिए

2
मेरा मानना ​​है कि टिप्पणी क्षेत्र (होम निर्देशिका से पहले) को स्लैश में रखने की अनुमति है।

12

आप /से बचने के लिए regex के बजाय उद्धरण का उपयोग कर सकते हैं /:

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

के साथ awk, {if (foo) ... }अक्सर बस के लिए सरलीकृत किया जा सकता है foo {...}


8

मान e.txtलेना वास्तव में /etc/passwd, आपको getent passwdफ़ाइल को पार्स करने के बजाय वास्तव में उपयोग करना चाहिए क्योंकि उपयोगकर्ता खाता जानकारी /etc/nsswitch.confको LDAP में निर्दिष्ट कई स्थानों में संग्रहीत किया जा सकता है ।

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

ध्यान दें कि printकथन सत्य होने पर निहित है। हालांकि यह पूरी लाइन को प्रिंट करेगा। यह केवल उपयोगकर्ता नाम प्रिंट करेगा:

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

4

हम में से उन लोगों के लिए वैकल्पिक जो अभी पसंद नहीं करते हैं:

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

स्पष्टीकरण:

  • grep -E कुछ विस्तारित नियमित अभिव्यक्ति सुविधाओं के उपयोग को सक्षम करता है
  • अभिव्यक्ति ([^:]*:)एक कॉलम से मेल खाती है, जिसमें निम्न शामिल हैं: 'विभाजक'
  • ^([^:]*:){5} प्रत्येक पंक्ति के पहले पाँच स्तंभों से मेल खाता है
  • ^([^:]*:){5}/home/ हर पंक्ति से मेल खाता है जहां 6 वां कॉलम '/ घर /' से शुरू होता है
  • cut -d: -f1:स्तंभ विभाजक के रूप में उपयोग करते हुए, केवल इसके इनपुट के पहले कॉलम का चयन करता है

3

आप indexनिश्चित स्ट्रिंग के मिलान के लिए भी उपयोग कर सकते हैं grep -Fऔर रिटर्न मान का उपयोग करके यह सुनिश्चित कर सकते हैं कि यह स्ट्रिंग की शुरुआत से मेल खाता है

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

या यदि रेगेक्स की आवश्यकता है, तो इसे पर्यावरण चर के रूप में पास करें

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

3

बस विविधता के लिए

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

व्याख्या

-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/

भिन्नता अगर आप चाहते हैं कि जहां /home/मिल जाए, उसके बारे में चुगली करें

perl -F: -lane 'print $F[0] if $F[5] =~ m(^/home/)' e.txt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.