2012-12-10 28 views
5

मूल रूप से मैं ls -la आदेश से लाइन मिलती है:कैसे regexp सीमांकक के साथ n वें स्तंभ पाने के लिए

-rw-r--r-- 13 ondrejodchazel staff 442 Dec 10 16:23 some_file 

और फ़ाइल (442) के आकार प्राप्त करना चाहते हैं। मैंने cut और sed आदेशों का प्रयास किया है, लेकिन असफल रहा। केवल मूल यूनिक्स उपकरण (कट, sed, awk ...) का उपयोग करके, मैं stdin से विशिष्ट कॉलम कैसे प्राप्त कर सकता हूं, जहां डिलीमीटर / +/ regexp है?

उत्तर

12

यदि आप cut के साथ ऐसा करना चाहते हैं तो आपको पहले स्थान (tr -s ' ') निचोड़ने की आवश्यकता है क्योंकि cut+ का समर्थन नहीं करता है। यह काम करना चाहिए:

ls -la | tr -s ' ' | cut -d' ' -f 5 

यह एक थोड़ा और अधिक काम है जब (जीएनयू sed) sed साथ यह कर:

ls -la | sed -r 's/([^ ]+ +){4}([^ ]+).*/\2/' 

थोड़ा अधिक उंगली पंचिंग अगर आप ग्रेप विकल्प (जीएनयू ग्रेप) का उपयोग करें:

ls -la | grep -Eo '[^ ]+(+[^ ]+){4}' | grep -Eo '[^ ]+$' 
+0

+1 कट 'प्रवाह। कॉलम grokking के लिए अब तक की सबसे लचीली, शक्तिशाली, संक्षिप्त तकनीक तक। – gepoch

5

पार्सिंग ls आउटपुट आपके विचार से कठिन है। इसके बजाय एक समर्पित उपकरण का उपयोग करें जैसे stat। यदि संख्या एक हज़ार विभाजक के रूप में अंतरिक्ष का उपयोग

size=$(stat -c '%s' some_file) 

एक तरह से ls -la some_file | awk '{print $5}' टूट सकता है (यह कुछ यूरोपीय स्थानों में आम है)।

Why You Shouldn't Parse the Output of ls(1) भी देखें।

+1

धन्यवाद, आपका उत्तर अच्छा है, लेकिन पार्सिंग एलएस आउटपुट उपयोग का उदाहरण था, फिर वास्तविक उपयोग। 'Sed | के लिए – Ondra

2

पाइप अपने उत्पादन के साथ:

awk '{print $5}' 

या और भी बेहतर हमें इस तरह स्टेट आदेश का उपयोग करने के लिए (मैक पर):

stat -f "%z" yourFile 

या (लिनक्स पर)

stat -c "%s" yourFile 

जो बाइट्स में फ़ाइल का आउटपुट आकार देगा।