दो आदेशों की तुलना पाते हैं


12

हाल ही में मुझे यह findएक-लाइनर मिला, लेकिन मैं यह स्पष्ट नहीं कर पा रहा हूं कि नीचे के दो का अंतर कहां से आता है:

उदाहरण 1

[root@centos share]# find . -exec grep -i "madis" {} /dev/null \;

./names:Madison Randy:300:Product Development

उदाहरण 2

[root@centos share]# find . -exec grep -i "madis" {} \;

Madison Randy:300:Product Development

जैसा कि आप देख सकते हैं, पहले एक में विशिष्ट फ़ाइल है जो इस स्ट्रिंग से प्राप्त होती है और अब तक मैं वास्तव में यह पता नहीं कर पा रहा हूं कि ऐसा क्यों हो रहा है।

जवाबों:


17

आप 2 स्थानों को खोजने के लिए grep बता रहे हैं। यदि एकाधिक स्थानों को खोजा जाए तो grep केवल पूर्ण स्थान दिखाता है।

उदाहरण के लिए

touch /tmp/herp /tmp/derp
cd /tmp
echo "foo" > herp
echo "foo" > derp

ध्यान दें कि कैसे मैं सिर्फ 1 फ़ाइल खोजता हूं, grep फ़ाइल नाम को छोड़ देता है

grep -i "foo" /tmp/herp
foo

लेकिन अगर मैं एक से अधिक खोज स्थान निर्दिष्ट करता हूं, तो grep कहता है कि उसे प्रत्येक मैच कहां मिला

grep -i "foo" herp derp
/tmp/derp:foo
/tmp/herp:foo

/dev/nullइसे जोड़ने के लिए 2 तर्क प्रदान करके, पूरे पथ को प्रिंट करने में grep को धोखा देना है।


1
+1 लेकिन आप "स्पष्ट" का उल्लेख करना भूल गए: "जोड़ा गया फ़ाइल का कारण यह /dev/nullसुनिश्चित करना है कि जो भी grep-ed है वह (खाली) /dev/nullफ़ाइल में नहीं मिलेगा , इसलिए केवल सही स्थान ही आउटपुट हैं"
ओलिवियर दुलैक

लेकिन यह भी, /dev/nullआप एक गैर-खाली डमी फ़ाइल के माध्यम से खोज करने में किसी भी समय बर्बाद न करें। और अंत में, /dev/nullइस मुहावरे से परिचित लोगों की खोज का इरादा स्पष्ट है।
एलेक्सिस

5

man grep:

-एच, - विथ-फाइलन

प्रत्येक मैच के लिए फ़ाइल का नाम प्रिंट करें। यह डिफ़ॉल्ट है जब खोज करने के लिए एक से अधिक फ़ाइल है।

दो मामलों में एक या दो फ़ाइल तर्कों के साथ grep के अंतर का परिणाम होता है। जोड़ने के बजाय /dev/nullआप grepतर्क के साथ कॉल कर सकते हैं -H। शायद /dev/nullव्यवहार अधिक व्यापक रूप से समर्थित है।


3
grep -Hपोर्टेबल नहीं है - /dev/nullचाल GNU grep के बिना काम करता है।
क्रिस डाउन

4

पहला उदाहरण findअभिव्यक्ति के परिणामस्वरूप मिली प्रत्येक फ़ाइल के लिए दो फ़ाइलों पर grep चलाने के बराबर है । उदाहरण के लिए, यदि findतीन फ़ाइलें मिलती हैं a.txt, b.txtऔर c.txtफिर के grepरूप में चलेंगी

grep -i "madis" a.txt /dev/null
grep -i "madis" b.txt /dev/null 
grep -i "madis" c.txt /dev/null

जिसके grepलिए फ़ाइलनाम दिखाएगा जिसके लिए आउटपुट मेल खाता है। चूँकि कुछ भी / dev / null से मेल नहीं खाता है, यह गारंटी है कि यदि यह मेल खाता है तो पहली फ़ाइल का फ़ाइल नाम मुद्रित किया जाएगा।

जबकि, दूसरा उदाहरण इसके समकक्ष है

grep -i "madis" a.txt
grep -i "madis" b.txt 
grep -i "madis" c.txt 

जिस स्थिति में फ़ाइलनाम मैचों के लिए मुद्रित नहीं किया जाएगा, क्योंकि सिर्फ एक तर्क है।

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