2012-04-23 15 views
6

मैं वास्तव में बैश के साथ नया हूं, लेकिन यह स्कूल के विषयों में से एक है। अभ्यास में से एक था:बैश: कमांड आउटपुट से grep पैटर्न

फ़ाइल "/ etc/passwd" की लाइन संख्या दें जहां आपके लॉगिन के बारे में जानकारी है।

मान लीजिए USERNAME मेरे अपने लॉगिन आईडी है, मैं इस तरह से पूरी तरह से यह करने के लिए कर रहा था:

cat /etc/passwd -n | grep USERNAME | cut -f1 

जो केवल आवश्यक लाइन नंबर दिया (वहाँ एक और अधिक अनुकूलित तरीका हो सकता है)। हालांकि, मुझे आश्चर्य हुआ कि यदि कमांड को अधिक सामान्य बनाने का कोई तरीका था, तो यह whoami के आउटपुट का उपयोग करता है ताकि grep पैटर्न, स्क्रिप्टिंग के बिना या एक चर का उपयोग कर। दूसरे शब्दों में, यह पढ़ने में आसान-से-एक लाइन आदेश रखने के लिए है, तो जैसे:

cat /etc/passwd -n | grep (whoami) | cut -f1 

क्षमा करता है, तो यह वास्तव में noob सवाल है।

उत्तर

16
cat /etc/passwd -n | grep `whoami` | cut -f1 

`अंक में एक कमांड आसपास यह आदेश निष्पादित और आदेश उस में। bash आदमी पेज में

+0

ठीक है, बैकटीक्स ... बेशक :) धन्यवाद! – MarioDS

+1

एंकरिंग के बिना, यदि आपका लॉगिन नाम लाइन पर कहीं और मेल खाता है तो यह झूठे मैचों का उत्पादन कर सकता है। मेरे पास एक स्थानीय सिस्टम पर एक छोटा लॉगिन नाम होता था जो "सिस्टम ऑपरेटर" का एक सबस्ट्रिंग (मिलान करने वाला) होता था, इसलिए कुछ बेवकूफ सॉफ़्टवेयर सोचा था कि जब मैं नहीं था तो मैं 'रूट' था। – tripleee

9

चेक आदेश प्रतिस्थापन लिपटे है में उत्पादन भेजने बनाता है।

आप वापस `` या $() पर टिक सकते हैं, और व्यक्तिगत रूप से मैं बाद वाले को पसंद करता हूं।

grep -n -e $(whoami) /etc/passwd | cut -f1 -d : 

करने वाले उपयोगकर्ता की /etc/passwd में grep कमान की -e झंडा और पूरे आदेश के उत्पादन के लिए तर्क के रूप में whoami के उत्पादन में विकल्प होगा लाइन नंबर होगा:

अपने प्रश्न के लिए

तो । और अधिक विस्तार में

awk -v me=$(whoami) -F: '$1==me{print NR}' /etc/passwd 

:

+0

+1 क्योंकि यह काम करता है, लेकिन लिन का जवाब पढ़ने के लिए और अधिक स्पष्ट है (कम से कम मेरे जैसे शुरुआती :) :) लेकिन मुझे लगता है कि आपने इंगित किया है कि मुझे इसे कम करने के लिए grep के स्विच का उपयोग करना चाहिए। – MarioDS

+4

+1, मैं '$()' निर्माण को भी पसंद करता हूं, क्योंकि यह घोंसला के लिए इतना आसान है। – paxdiablo

+0

+1 दोनों सिंटैक्स को इंगित करने के लिए :) –

10

आप एक ही awk मंगलाचरण के साथ ऐसा कर सकते हैं

  • -v एक awk चर me कहा जाता है बनाता है और अपने उपयोगकर्ता नाम के साथ भरता है।
  • -F क्षेत्र विभाजक को : पर पासवर्ड फ़ाइल के रूप में सेट करता है।
  • $1==me केवल उन पंक्तियों का चयन करता है जहां पहला फ़ील्ड आपके उपयोगकर्ता नाम से मेल खाता है।
  • print रिकॉर्ड संख्या (लाइन) आउटपुट करता है।
+0

महान स्पष्टीकरण के लिए धन्यवाद, लेकिन अब मेरे लिए ऐसा लगता है कि मैं अपने जैसे कमांड तैयार कर सकूं :) – MarioDS

+3

@ मारियो: जितनी जल्दी आप सीखना शुरू करेंगे, जितनी जल्दी आप करेंगे अपनी विकास सेवाओं के लिए अत्यधिक दरों को चार्ज करने में सक्षम हो :-) – paxdiablo

+0

+1 नोबॉ के लिए अजीब दिखाना –