2008-10-20 17 views
5

क्या awk (gawk) को अनदेखा या अनुपलब्ध फ़ाइलों को छोड़ने का कोई तरीका है? यही है, फ़ाइलों को कमांड लाइन पर पारित किया गया है जो फ़ाइल सिस्टम में मौजूद नहीं है (उदा।/Proc/[1-9] * के अंतर्गत फ़ाइलों को तेजी से प्रकट/गायब करना)।क्या उन फ़ाइलों को छोड़ सकते हैं जो अस्तित्व में नहीं हैं, रेस-फ्री?

BEGIN { MISSING_FILES_ARE_FATAL = 0 } # <- Wishful thinking! 
     { count++ } 
END { print count } 

एक आवरण स्क्रिप्ट फ़ाइलें की जाँच नहीं कर सकते हैं:

डिफ़ॉल्ट रूप से, एक लापता फ़ाइल :-(

एक गंभीर त्रुटि मैं कुछ इस तरह के बराबर करने के लिए सक्षम होने के लिए चाहते हैं अस्तित्व में मौजूद है क्योंकि वे चेक किए गए समय के बीच गायब हो सकते हैं और अजीब तो उन्हें खोलने की कोशिश करते हैं, यानी, यह एक दौड़ की स्थिति है। (यह भी अजीब के भीतर जांच-और-खुली जांच करने की दौड़ की स्थिति है, हालांकि समय कठिन है)

उत्तर

0

बेहतरीन परंपरा में ओएनएस, मैं एक पर्ल कार्यक्रम के साथ अपने अजीब सवाल का जवाब दूंगा।

#!/usr/bin/perl -w 

for my $file (@ARGV) { 
    open my $fh, $file or next; 
    while(<$fh>) { 
     ...do your thing here... 
    } 
} 

(यह awk नहीं है, लेकिन यह एक दौड़ शर्त के बिना ही समाधान है।)

1

यहां तक ​​कि अपनी awk स्क्रिप्ट के चारों ओर एक पर्ल या खोल आवरण चिपके हुए, मुझे लगता है कि वहाँ अभी भी एक रेस स्थिति होने वाला है । उदाहरण के लिए, निपुण के अन्यथा ठीक खोल स्निपेट का उपयोग कर:

[ -r "$filename" ] && awk -f ... $filename 

-r और समय awk के बीच दूर जा रहा से प्रक्रिया को रोकने में कुछ भी नहीं है चारों ओर फ़ाइल खोलने का प्रयास करने के लिए हो जाता है ...

केवल उत्तर मैं सोच सकता हूं कि अजीब के लिए सिस्टम ओपन कॉल को प्रतिस्थापित करने के लिए LD_PRELOAD का उपयोग करना है, ताकि अगर फ़ाइल गुम हो, तो इसके बजाय/dev/null पर एक पठन फ़ाइल डिस्क्रिप्टर खोला जाता है।

कि काम हो सकता है ...

1

वैसे आप ARGV की सामग्री पर सिस्टम कॉल के साथ जांच कर सकते हैं, तो getline के माध्यम से उन्हें संसाधित करते हैं।

if (system("test -r " ARGV[1]) == 0) 
    while ((getline aline < ARGV[1]) >0) 
    # process ARGV[1] via `aline` instead of $0 

...

फिर ARGV की प्रक्रिया [2], आदि HTH

0

ओह, माफ करना। मेरे पिछले जवाब को रद्द करें। यहाँ एक और सुझाव है:

cat /proc/[1-9]* 2>/dev/null | awk .... 

बिल्ली सभी फाइलों को हडप जाना होगा, याद आ रही है और एक जैसे मौजूदा, बिल्ली की त्रुटि गुमनामी के लिए फेंक दिया हो जाएगा (लापता फ़ाइल बिल्ली के लिए गैर-गंभीर त्रुटि है), और awk में सक्षम हो wil परिणाम को संसाधित करने के लिए।

1

मुझे लगता है कि "MISSING_FILES_ARE_FATAL = 0" सुविधा अगली गॉक रिलीज का हिस्सा होगी। ---

शुक्र अगस्त 22 14:43:49 2008 अर्नोल्ड डी

कटाव ---: वर्तमान gawk स्थिर स्रोत कोड के चैंज फ़ाइल देखेंरॉबिंस

* io.c (nextfile): Users Strong In The Ways Of The Source can use 
non-existant files on the command line without it being a fatal error. 

--- कटाव ---

http://cvs.savannah.gnu.org/viewvc/gawk-stable/ChangeLog?revision=1.87&root=gawk&view=markup

हरमन

2

gawk 4 BEGINFILE है जिसमें आप ERRNO के लिए परीक्षण और एक nextfile अगर ERRNO खाली नहीं है कर (कर सकते हैं यह दर्शाता है कि फ़ाइल खोला नहीं जा सका)।

संबंधित मुद्दे

 संबंधित मुद्दे