2011-12-18 11 views
5

मैं घर के काम के असाइनमेंट पर काम कर रहा हूं। सवाल यह है:लिनक्स एडब्ल्यूके सहायता। एक अजीब समय

एक awk स्क्रिप्ट लिखें .conf के साथ समाप्त /etc में सभी नियमित फ़ाइलें (निर्देशिका नहीं या लिंक) का चयन करने के सबसे बड़ा करने के लिए छोटी से आकार से परिणाम को सॉर्ट, फ़ाइलों की संख्या की गणना, और दो कॉलम में फ़ाइल नामों और आकारों के बाद फ़ाइलों की संख्या मुद्रित करें। फ़ाइल नाम और आकार के लिए शीर्षलेख पंक्ति शामिल करें। अपने स्क्रिप्ट और उत्तर क्षेत्र में इसके आउटपुट दोनों को पेस्ट करें।

मैं वास्तव में अजीब उपयोग के माध्यम से काम करने की कोशिश कर रहा हूं। यहां मैं क्या आया था।

ls -lrS /etc/*.conf |wc –l 

संख्या 33 जो फ़ाइलें निर्देशिका में .conf फ़ाइलों की संख्या है वापस आ जाएगी।

ls -lrS /etc/*.conf |awk '{print "File_Size"": " $5 " ""File_Name and Size"": " $9}' 

इस नाम और निर्देशिका में .conf फ़ाइल के आकार के साथ 2 कॉलम कर देगा।

यह काम करता है, लेकिन मुझे नहीं लगता कि वह यही चाहता है। मेरे पास एक अजीब समय है।

+3

मुझे लगता है यह बहुत AWD कि आपका इंस्टाक्चर आपको यूनिक्स इतिहास में इस देर के युग में अजीब सिखा रहा है। पठनीय स्क्रिप्ट लिखने के कई बेहतर तरीके हैं, और यदि आपका इंस्टाउटर आपके द्वारा अपठनीय शैलियों को पढ़ाने का आग्रह करता है, तो कम से कम आप लॉरनल कर सकते हैं। –

+0

पर भरोसा वह टिप्पणी !! :) –

उत्तर

4

चलो यहाँ देखें ...

सभी नियमित फ़ाइलें (नहीं निर्देशिका या लिंक)

अब तक आप इस संबोधित नहीं किया है का चयन करें, लेकिन अगर आप में पाइपिंग हैं ls -l... का आउटपुट, यह आसान है,

/^-/ 

पर चयन करें क्योंकि डायरेक्टो d के साथ शुरू होता है, l के साथ प्रतीकात्मक लिंक और इसी तरह। केवल सादे पुरानी फाइलें - से शुरू होती हैं। अब फ़ाइलों की संख्या बाहर

प्रिंट पीछा

ठीक है, मैचों की गिनती काफी आसान है ...

BEGIN{count=0} # This is not *necessary*, but I tend to put it in for clarity 
/^-/ {count++;} 

फ़ाइल नाम और आकार पाने के लिए, ls -l के उत्पादन को देखो और कॉलम

BEGIN{count=0} 
/^-/ { 
    count++; 
    SIZE=$5; 
    FNAME=$9; 
} 

अप गिनती यहाँ बड़ी कठिनाई यह है कि awk पुरातन छँटाई के माध्यम से बहुत प्रदान नहीं करता है, इसलिए यह कठिन हिस्सा है। अगर आप चालाक बनना चाहते हैं तो पीटा जा सकता है लेकिन यह विशेष रूप से कुशल नहीं है (a [code-golf] solution में मैंने जो भयानक चीज की थी) देखें। आसान (और Unixy) करने के लिए बात करने के लिए sort उत्पादन की पाइप हिस्से के लिए होगा, इसलिए ... हम

BEGIN{count=0} 
/^-/ { 
    count++ 
    SIZE=$5; 
    FNAME=$9; 
    OUTPUT=sprintf("%10d\t%s\n%s",SIZE,FNAME,OUTPUT); 
} 
END{ 
    printf("%d files\n",count); 
    printf(" SIZE \tFILENAME"); # No newline here because OUTPUT has it 
    print OUTPUT|"sort -n --key=1"; 
} 

देता है एक बड़ा स्ट्रिंग में प्रत्येक फ़ाइल के लिए एक लाइन को इकट्ठा उत्पादन की तरह

11 files 
    SIZE   FILENAME 
     673  makefile 
     2192  houghdata.cc 
     2749  houghdata.hh 
     6236  testhough.cc 
     8751  fasthough.hh 
    11886  fasthough.cc 
    19270  HoughData.png 
    60036  houghdata.o 
    104680  testhough 
    150292  testhough.o 
    168588  fasthough.o 

(Btw - वहाँ एक test उपनिर्देशिका यहाँ है, और आप ध्यान दें हूँ कि यह उत्पादन में प्रकट नहीं होता।)

+0

बहुत अच्छी तरह से, धन्यवाद! चरण-दर-चरण स्पष्टीकरण एक बड़ी मदद है। संरेखण को ठीक करने के लिए – user1104868

0

मुझे पहली बार find /etc -type f -name '*.conf' जैसी फ़ाइलों को ढूंढना होगा; इसलिए आपको फ़ाइलों की सही सूची मिलती है। फिर आप उन पर ls -l (शायद xargs का उपयोग कर) करते हैं। और फिर awk का उपयोग करना सरल होना चाहिए।

लेकिन मुझे नहीं लगता कि अगर मैंने आपका होमवर्क किया जो आपकी मदद करेगा। आपको खुद से सोचने और पता लगाने की जरूरत है।

1

हो सकता है कुछ इस तरह अपने रास्ते पर आप मिलना चाहिए -

ls -lrS /etc/*.conf | 
awk ' 
BEGIN{print "Size:\tFilename:"} # Prints Headers 
/^-/{print $5"\t"$9} # Prints two desired columns, /^-/ captures only files 
END{print "Total Files = "(NR-1)}' # Uses in-built variable to print count 

टेस्ट: # के बाद पाठ आपके संदर्भ के लिए टिप्पणी कर रहे हैं।

[jaypal:~/Temp] ls -lrS /etc/*.conf | 
awk ' 
BEGIN{print "Size:\tFilename:"} 
/^-/{print $5"\t"$9} 
END{print "Total Files = "(NR-1)}' 
Size: Filename: 
0  /etc/kern_loader.conf 
22  /etc/ntp.conf 
54  /etc/ftpd.conf 
105  /etc/launchd.conf 
168  /etc/memberd.conf 
242  /etc/notify.conf 
366  /etc/ntp-restrict.conf 
526  /etc/gdb.conf 
723  /etc/pf.conf 
753  /etc/6to4.conf 
772  /etc/syslog.conf 
983  /etc/rtadvd.conf 
1185 /etc/asl.conf 
1238 /etc/named.conf 
1590 /etc/newsyslog.conf 
1759 /etc/autofs.conf 
2378 /etc/dnsextd.conf 
4589 /etc/man.conf 
Total Files = 18 
0

अस्वीकरण: मैं एक खोल विशेषज्ञ नहीं हूँ।

सोचा मैं इस एक जाना दे चाहते हैं, जबाब की गति हालांकि :-) पर पीटा गया है:

clear 

FILE_COUNT=`find /etc/ -name '*.conf' -type f -maxdepth 1 | wc -l` 

echo "Number of files: $FILE_COUNT" 

ls -lrS /etc/[^-]*.conf | awk ' 

BEGIN {print "NAME  |  SIZE"}\ 

{print $9,"  | ",$5}\ 

END {print "- DONE -"}\ 

' 

मेरे उत्पादन बदसूरत :-(है:

Number of files:  21 
NAME  |  SIZE 
/etc/kern_loader.conf  |  0 
/etc/resolv.conf  |  20 
/etc/AFP.conf  |  24 
/etc/ntp.conf  |  42 
/etc/ftpd.conf  |  54 
/etc/notify.conf  |  132 
/etc/memberd.conf  |  168 
/etc/Symantec.conf  |  246 
/etc/ntp-restrict.conf  |  366 
/etc/gdb.conf  |  526 
/etc/6to4.conf  |  753 
/etc/syslog.conf  |  772 
/etc/asl.conf  |  860 
/etc/liveupdate.conf  |  861 
/etc/rtadvd.conf  |  983 
/etc/named.conf  |  1238 
/etc/newsyslog.conf  |  1590 
/etc/autofs.conf  |  1759 
/etc/dnsextd.conf  |  2378 
/etc/smb.conf  |  2975 
/etc/man.conf  |  4589 
/etc/amavisd.conf  |  31925 
- DONE - 
+0

'कॉलम-टी' के माध्यम से पाइप:] –