AWK कमांड में मल्टीपल सर्च कैसे जोड़ें


10

Im जून, जुलाई और अगस्त महीनों में बनाई गई फ़ाइलों की खोज करने की कोशिश कर रहा हूं। मैंने इस विधि का उपयोग किया

ls -lrth|awk '/[Jun][Jul][Aug]/ {print}'

लेकिन यह काम नहीं कर रहा है।


1
रिकॉर्ड के लिए, [...]निर्माण एक एकल चरित्र से मेल खाता है, जो कि कोष्ठक के बीच के पात्रों में से कोई भी हो सकता है। आपकी अभिव्यक्ति से मेल खाता है तो JJA या Jug( Jसे [Jun], uसे [Jul], और gसे [Aug]महीने के संक्षिप्त रूपों आप मैच के लिए उम्मीद कर रहे थे), लेकिन नहीं।
ट्रिपलए

जवाबों:


12

आप कई पैटर्न पर मेल कर सकते हैं जैसे:

awk '/Jun/ || /July/ || /Aug/' <(ls -lrh)

यह जून, जुलाई, या अगस्त के लिए सभी मैचों को लौटाता है। आपको printकथन की आवश्यकता नहीं है क्योंकि यह awkडिफ़ॉल्ट क्रिया है।


1
awk विस्तारित regexps समझता है, इतना आसान के रूप में है कि आप इसे लिख सकता है के रूप में के रूप में एक पैटर्न के लिए awk '/Jun|Jul|Aug/'याawk '/Ju[nl]|Aug/'
कैस

5

एक सामान्य नियम के रूप में, ls के आउटपुट को पार्स करना बहुत बुरा विचार है । आप जो चाहते हैं वह करने का एक बेहतर तरीका है

stat -c "%n %y" * | grep 2013-0[678]

वैकल्पिक रूप से, केवल उस अंतिम केस की जांच करें, जिसमें उस असंभावित मामले से बचाव के लिए जहां फ़ाइल का नाम ही एक तारीख है:

stat -c "%n %y" *| awk '$NF ~ /2013-0[678]/' 

से man stat:

   -c  --format=FORMAT
          use the specified FORMAT instead of the default; output  a  new
          line after each use of FORMAT

   %y     time of last modification, human-readable
   %n     file name

यह एक अच्छा उदाहरण भी है। मैंने पहले कभी STAT की जाँच नहीं की। महान जानकारी के लिए धन्यवाद
OmiPenguin

हो सकता है कि ... | awk '$NF ~ /2013-0[678]/'अंतिम आउटपुट फ़ील्ड की जाँच करने के लिए ... (असंभावित?) यहां तक ​​कि उस फ़ाइल का नाम regex से मेल खाता हो, जब दिनांक नहीं है।
12

3

lsएक मानव पठनीय में फ़ाइलों के बारे में जानकारी प्रदर्शित करने के लिए एक आदेश है। लिपियों में इसका प्रयोग न करें

एक निर्देशिका ट्री में फ़ाइलें खोजने के लिए कमांड कुछ मापदंड से मेल खाती है find। यदि आपके पास जीएनयू (यानी गैर-एम्बेडेड लिनक्स या सिगविन) या फ्रीबीएसडी (यानी फ्रीबीएसडी या ओएसएक्स) है, तो आप उन -newermtफाइलों से मिलान करने के लिए उपयोग कर सकते हैं जो एक निश्चित तिथि के बाद अंतिम रूप से संशोधित किए गए थे।

find . -newermt '1 June' ! -newermt '1 September' -print

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

यदि आपका खोज कार्यान्वयन नहीं है -newermt, तो आपको इसके साथ करना होगा -newer, जो उस फ़ाइल की तिथि की तुलना करता है जो findएक निश्चित फ़ाइल के साथ मिली है। का उपयोग touchतारीख है कि आप एक सीमा के रूप में उपयोग करना चाहते हैं के साथ अस्थायी फ़ाइलों को बनाने के लिए।

dir=$(mktemp -d)
touch -d 201306010000 "$dir/from"
touch -d 201309010000 "$dir/to"
find . -newer "$dir/from" ! -newer "$dir/to" -print
rm -r "$dir"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.