एकल कॉलम पर grep कैसे चलाएं?


42

मैं अपनी ls -lकमांड का आउटपुट प्राप्त करना चाहता हूं :

-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

मैं grep rahmuकॉलम $ 3 पर ही चलना चाहता हूं , इसलिए मेरी grepकमांड का आउटपुट इस तरह दिखना चाहिए:

-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

इसे करने का सबसे सरल तरीका क्या है? उत्तर कई यूनियनों में पोर्टेबल होना चाहिए, अधिमानतः लिनक्स और सोलारिस पर ध्यान केंद्रित करना।

NB: मैं किसी दिए गए उपयोगकर्ता से संबंधित सभी फ़ाइलों को खोजने के लिए एक रास्ता नहीं ढूंढ रहा हूं। यह उदाहरण केवल मेरे प्रश्न को स्पष्ट करने के लिए दिया गया था।


5
ध्यान दें कि आउटपुट को पार्स करना lsस्वाभाविक रूप से नाजुक है (सोचें कि क्या होगा यदि किसी उपयोगकर्ता के नाम में व्हॉट्सएप है - और हां, कुछ प्लेटफार्मों पर ऐसा होता है)। findइसके बजाय उपयोग करें ।
गिलेस एसओ- बुराई को रोकना '

यह शीर्षक प्रश्न का उत्तर नहीं देता है, लेकिन मैं उल्लेख करूँगा कि --printfविकल्प उन statजगहों पर काम में आ सकता है जहाँ आप अन्यथा विचार कर सकते हैं ls। लेकिन आमतौर पर, findआप क्या चाहते हैं (जैसा कि @Gilles उल्लेख किया गया है)।
वाइल्डकार्ड

जवाबों:


49

एक और समय awkदिन बचाता है!

यहाँ यह करने के लिए एक सरल तरीका है, एक अपेक्षाकृत सरल वाक्यविन्यास के साथ:

ls -l | awk '{if ($3 == "rahmu") print $0;}'

या और भी सरल: (टिप्पणी में पीटर। के लिए धन्यवाद)

ls -l | awk '$3 == "rahmu"' 

9
या: ls -l | awk '$3=="rahmu"'... और वैसे, उद्घाटन (ब्रैकेट के बाद होना चाहिए if...awk '{if($3 ...'
पीटर

3
@ पीटर.ओ 1 मुझसे। आपका आदेश अधिक रसीला है, सही है, क्योंकि प्रिंट एक awk मैच के लिए डिफ़ॉल्ट है।
bsd

स्थानीयकरण के मुद्दों (दिनांक स्वरूप स्तंभ क्रम को प्रभावित करता है) से बचने के लिए अक्सर मानक प्रारूप और भाषा सुनिश्चित करने का सुझाव दिया जाता है:LANG=C ls -l | awk ...
fheub

16

यदि आप किसी दिए गए कॉलम पर स्ट्रिंग के केवल भाग का मिलान करना चाहते हैं, तो आप https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partumn-matches से सलाह का उपयोग कर सकते हैं

some_command | awk '$6 ~ /string/'

1
यह शीर्ष उत्तर होना चाहिए
PejoPhylo

11

यदि कॉलम के अनुसार, आप निश्चित आकार के कॉलम का मतलब है, आप कर सकते हैं:

ls -l | grep "^.\{15\}rahmu"

जहां ^लाइन की शुरुआत का .मतलब है , किसी भी चरित्र का \{15\}मतलब है और पिछले चरित्र की 15 घटनाओं का मतलब है (इस मामले में कोई भी चरित्र)।


2

मुझे पता है कि मुझे पार्टी में देरी हो रही है, लेकिन मेरा मानना ​​है कि इस समस्या का एक बहुत ही सामान्य समाधान है कि आप नियमित भावों के साथ awk का उपयोग करें:

awk '$3~/rahmu/{print}' input_file

'//' द्वारा संलग्न भाग किसी भी प्रकार की नियमित अभिव्यक्ति हो सकती है।


1

एकल उपयोगकर्ता नाम कॉलम के आधार पर grep करने के लिए (और केवल फ़ाइलों को प्रिंट करें), आप कोशिश कर सकते हैं:

ls -la | grep "^-\S\+\s\+\S\+\s\+rahmu"

निर्देशिका के लिए, बदलने -में dकिसी भी प्रकार को निकालने के लिए, -

यह मूल रूप से प्रत्येक कॉलम का चयन करता है \S\+\s\+जिसके द्वारा एक गैर-वर्ण वर्णों से मेल खाता है जिसके बाद एक अंतरिक्ष वर्ण होता है, इसलिए हम तीन पहले कॉलम और फिर उपयोगकर्ता नाम से मेल खाते हैं।

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