2012-09-05 19 views
5

Centos/लिनक्स बैशsed: बड़े पैमाने पर यादृच्छिक अन्य पाठ

बीच अवधियों को परिवर्तित मैं जो हर जगह में पाठ के बहुत सारे और युग संख्या है एक लॉग फ़ाइल, है। मैं उन सभी युगों को प्रतिस्थापित करना चाहता हूं जो वे पठनीय दिनांक/समय में हैं।

मैं इसे sed के माध्यम से करना चाहता हूं, क्योंकि यह नौकरी के लिए उपकरण लगता है। मैं रूपांतरण के लिए वास्तव में परिवर्तनीय (युग) को पार्स करने के लिए sed के प्रतिस्थापन भाग को प्रतीत नहीं कर सकता।

क्या मैं के साथ काम कर रहा हूँ का नमूना ...

echo "Some stuff 1346474454 And not working" \ 
| sed 's/1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/'"`bpdbm -ctime \&`"'/g' 
Some stuff 0 = Thu Jan 1 01:00:00 1970 And not working 

bpdbm ​​हिस्सा उपयोगी तारीख में एक आपूर्ति युग चर परिवर्तित कर देंगे। इस तरह ..

bpdbm -ctime 1346474454 
1346474454 = Sat Sep 1 05:40:54 2012 

तो मैं "पाया" आइटम को कमांड में पार्स करने के लिए कैसे प्राप्त करूं। जैसा कि मुझे लगता है कि यह काम करने में सक्षम नहीं है।

कोई भी मदद सुंदर होगी। यदि कोई और तरीका है, तो यह अच्छा होगा ... लेकिन मुझे संदेह है कि sed जल्दी होगा।

आपके समय के लिए धन्यवाद!

+0

इसे 'set -vx' के साथ चलाएं यह देखने के लिए कि यह क्यों काम नहीं कर रहा है।सेड को 'और' के मूल्य को "जानता है" से पहले डेटा की रेखा को संसाधित करना पड़ता है, सीएमडी-सबटाइंडेशन को आखिरी चीज़ तक देरी होनी चाहिए, लेकिन संभवतः यह पहली चीज हो रही है। आप इसे आसानी से अजीब में कर सकते हैं। Sed में आपका विश्वास छू रहा है ;-)। सौभाग्य! – shellter

+0

खैर, हाँ ... कोशिश करना और जहां संभव हो वहां sed और awk रखना। कल सैड के साथ एक और खेल होगा, मैंने एक sed-based संकल्प – user1649704

उत्तर

7

कि नौकरी

नहीं के लिए उपकरण लगता है, यह नहीं है। sed केवल & का उपयोग कर सकते हैं, इसे किसी आदेश के लिए तर्क देने का कोई तरीका नहीं है। आपको कुछ और शक्तिशाली चाहिए, उदा। पर्ल:

perl -pe 'if (($t) = /(1[0-9]+)/) { s/$t/localtime($t)/e }' 
+0

पर छोड़ दिया है जो अद्भुत काम करता है, धन्यवाद !! – user1649704

+0

यह एक्सएमएल पार्स करने के लिए मेरे लिए पूरी तरह से काम करता था जिसमें मानव पढ़ने योग्य युग में युग का समय था: 'cat inputfile.xml | perl -pe 'अगर (($ टी) =/(1 [0-9] +) /) {एस/$ टी/लोकलटाइम ($ टी)/ई}'> outputfile.xml' – zedix

1

आप इसे GNU साथ क्या कर सकते sed, इनपुट:

infile

Some stuff 1346474454 And not working 

जीएनयू sed, /e पैरामीटर जो पैटर्न अंतरिक्ष में पाइपिंग आदेश उत्पादन के लिए अनुमति देता है का समर्थन करता है एक bpdbm के साथ इसका लाभ उठाने का तरीका:

sed 's/(.*)(1[0-9]{9})(.*)/echo \1 $(bpdbm -ctime \2) \3/e' infile 

या साथ coreutilsdate:

sed 's/(.*)(1[0-9]{9})(.*)/echo \1 $(date -d @\2) \3/e' infile 

तारीख के साथ उत्पादन

Some stuff Sat Sep 1 06:40:54 CEST 2012 And not working 

bpdbm साथ के रूप में ही उत्पादन प्राप्त करने के लिए:

sed 's/(.*)(1[0-9]{9})(.*)/echo "\1$(date -d @\2 +\"%a %b %_d %T %Y\")\3"/e' infile 

उत्पादन

Some stuff Sat Sep 1 06:40:54 2012 And not working 

नोट, यह केवल एक पंक्ति पर पाए गए अंतिम युग को प्रतिस्थापित करता है। यदि अधिक हैं तो फिर से चलाएं।

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