एक फ़ाइल की कुछ सामग्री को पकड़ो


9

इसलिए मुझे पता है कि इस समस्या के लिए उपकरण मौजूद हैं क्योंकि मैंने उनके बारे में सुना है, लेकिन मुझे नहीं पता कि वे क्या हैं।

मैं सभी डेटा को फ़िल्टर करना चाहता हूं, लेकिन उपयोगकर्ता नाम / etc / passwd में।

उदाहरण के लिए, मैं निम्नलिखित फाइल से user1, user2 और user3 को हथियाना चाहता हूं। इस मामले में, तर्क "फ़ाइल के प्रत्येक पंक्ति पर पहले ':' टेक्स्ट को पकड़ो 'हो सकता है।

user1:x:1:4
user2:x:2:5
user3:x:3:6

उत्पादन होगा:

user1
user2
user3

जवाबों:


19

cutइस उद्देश्य के लिए मौजूद है। -dझंडा सीमांकक निर्दिष्ट करती है और -fनिर्दिष्ट करता है जो उत्पादन के लिए फ़ील्ड:

cut -d: -f1 /etc/passwd

तर्क -fकुछ ऐसा हो सकता है जैसे 1,3पहले और तीसरे क्षेत्र 1-3को दिखाना , या पहले तीन को दिखाना; यह भी देखते हैं -bऔर -cबाइट्स और पात्रों के बजाय खेतों को पढ़ने के लिए झंडे। यदि आपको कुछ अधिक लचीला चाहिए, तो आम तौर पर awkचाल चलेगी ( मैथ्यू का जवाब देखें )


13

हर बार जब आप सारणीबद्ध इनपुट से डेटा निकालना चाहते हैं, तो आपको अजीब विचार करना चाहिए । यह लगभग हर यूनिक्स प्रणाली पर उपलब्ध है, इसलिए इसे लेना एक अच्छी आदत है:

awk -F':' '{print $1}' /etc/passwd 
  • -F':': परिभाषित करता है ":" स्तंभ परिसीमन के रूप में।
  • '{}': प्रत्येक पंक्ति के लिए इस निर्देश को निष्पादित करें।
  • print $1: स्क्रीन पर पहले कॉलम को प्रिंट करें।

3
रैंडम ध्यान दें: awkतो तुम पाइप छोड़ें और बस कर सकते हैं, एक फ़ाइल नाम लेता हैawk -F: '{print $1}' /etc/passwd
माइकल Mrozek

मुझे हमेशा लगता है कि awk एक फ़ाइल नाम लेता है, मैं हमेशा इसे पाइपलाइन में उपयोग करने के लिए लगता है ... कुछ sed जैसा लगता है | awk etc ...
मैथ्यू ब्रैनिगन

फ़ाइलों के साथ काम करने वाली लगभग हर चीज़ एक फ़ाइल नाम लेती है ( trऔर atकुछ चीज़ों के जोड़े उदाहरण हैं जो नहीं)।
अगली सूचना तक रोक दिया गया।


1

Perl और awk के नीचे, ऐसी नौकरियों के लिए एक तीसरा उपकरण है, जो sed है:

sed 's/:.*//' FILE 

यह प्रतिस्थापन कमांड है: बृहदान्त्र से स्थानापन्न:, इसके बाद एक डॉट, जो कि किसी भी प्रकार के वर्णों के लिए एक जोकर है, किसी भी गिनती (*) के साथ, कुछ भी नहीं है।

यह खाली होने के साथ 's (ubstitute) / FROM / TO /' है, जिसका अर्थ है कि 'पहले से सब कुछ हटा दें (क्योंकि sed डिफ़ॉल्ट लालची है) कोलन (लाइन के अंत तक, क्योंकि sed पूरी लाइनों के साथ अच्छी तरह से काम करता है)।

बेशक cutएक अच्छी कमांड है, लेकिन मैं एक अलग परिवार से कहूंगा।


1

आपके उदाहरण में, सभी 3 नाम समान लंबाई के हैं। ऐसे मामलों में - जो हो सकता है, लेकिन / etc / passwd के साथ ऐसा होने की संभावना नहीं है - आप colrm का भी उपयोग कर सकते हैं:

echo "user1:x:1:4
> user2:x:2:5
> user3:x:3:6" | colrm 6
user1
user2
user3

या, बिल्कुल

cat FILE | colrm 6 

(एक दुर्लभ मामला जहां useless use of catलागू नहीं होता है, क्योंकि आप पैरामीटर के रूप में कार्य करने के लिए एक फ़ाइल को कोलर नहीं कर सकते हैं।)


catअभी भी वहाँ बेकार है colrm 6 < FILE:।
मैनटवर्क

ठीक है, हाँ, लेकिन यह बेकार नहीं है, जैसा कि कॉलिंग में है cat foo | grep bar
उपयोगकर्ता अज्ञात

1

पूर्णता के लिए, बाहरी आदेशों की कोई आवश्यकता नहीं है, शेल (बॉर्न शेल या संगत) इसे अकेले संभाल सकता है:

while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file

बेशक, यह संभवतः सभी संभावित समाधानों में सबसे धीमा है, इसलिए बड़ी फ़ाइलों के लिए दूसरे को चुनना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.