2011-08-04 9 views
7
2011-07-01 ... /home/todd/logs/server_log_1.log ... 
2011-07-02 ... /home/todd/logs/server_log_2.log ... 
2011-07-03 ... /home/todd/logs/server_log_3.log ... 

मेरे पास एक फ़ाइल उपरोक्त की तरह दिखती है।sed/awk: टेक्स्ट स्ट्रीम से पैटर्न निकालें

server_log_1.log 
server_log_2.log 
server_log_3.log 

किसी की मदद कर सके: मैं के रूप में STDOUT करने के लिए इसे और उत्पादन से फ़ाइल नाम निकालने के लिए करना चाहते हैं? धन्यवाद!

फ़ाइल नाम पैटर्न server_log_xxx.log है, और यह केवल एक पंक्ति में होता है।

+0

के बाद से फ़ाइल नाम तो बस किसी भी चरित्र के बारे में शामिल कर सकते हैं (रिक्त स्थान, नई-पंक्तियों, नियंत्रण वर्ण, सबसे यूनिक्स फ़ाइल सिस्टम पर, 'के अलावा कुछ '\ 0'' और''/''), वे 3 लाइनें एक वैध फ़ाइल नाम हो सकती हैं। फ़ाइल नामों को विश्वसनीय रूप से पहचानने का कोई तरीका नहीं है जबतक कि आप वैध फ़ाइल नामों और उन चीज़ों में कुछ प्रतिबंध जोड़ते हैं जो दो '...' में दिखाई दे सकते हैं। आप विशेष रूप से सावधान रहना चाहते हैं क्योंकि लॉगफाइल जो असुरक्षित उपयोगकर्ता-नियंत्रित चर (उदा। इनपुट, होस्टनाम) रिकॉर्ड करते हैं, खराब लिखित पार्सर्स के खिलाफ इंजेक्शन हमलों के लिए लक्ष्य हो सकते हैं। – jw013

+0

jw013: नहीं, आपको फ़ाइल नाम में '' \ n'' की आवश्यकता है, अन्यथा उन 3 लाइनें तीन प्रविष्टियां हैं –

+0

@yi ''n \' 'फाइलनामों में एक वैध वर्ण है। आप वास्तव में "सभी संभावित फ़ाइल नामों" पर किसी भी सेन मिलान नहीं कर सकते हैं, और एक उदाहरण के रूप में मैंने बताया कि पूरी लाइन या लाइनों के किसी भी संयोजन (फ़ाइल सिस्टम की फ़ाइल नाम सीमा सीमा तक) एक वैध फ़ाइल नाम है। अब जब टोड ने उस पैटर्न को निर्दिष्ट किया है जिसे वह ढूंढ रहा है, तो समस्या अधिक उचित हो जाती है (हालांकि 'xx' भाग अभी भी निर्दिष्ट नहीं है, शायद वे अंकों के लिए खड़े होने के लिए हैं)। मैं वास्तव में आप जो कह रहा हूं उसका पालन नहीं करता "नोप"। – jw013

उत्तर

16

यह मानते हुए "Xxx" प्लेसहोल्डर केवल अंकों का होता है:

grep -o 'server_log_[0-9]\+\.log' 
+0

अच्छा जवाब, धन्यवाद! – Dagang

0
sed 's|.*/\([^/ ]*\).*|\1|' infile 
+3

's' कमांड के अंत में 'p' जोड़ें और' -n' विकल्प जोड़ें जब तक कि आप प्रत्येक पंक्ति को देखना नहीं चाहते जो पैटर्न से मेल नहीं खाता है। – jw013

0
awk साथ

और अपने इनपुट पैटर्न:

awk 'BEGIN {FS="/"} 
    { print gensub(" .*$","","g",$5) }' INPUTFILE 

यह देखें यहाँ कार्रवाई: https://ideone.com/kcadh

HTH

3

पाइप निम्न आदेश के माध्यम से अपनी फ़ाइल:

sed 's/.*\(server_log_[0-9]\+\.log\).*/\1/' 
+0

sed's /.* \ (server_log_ [0-9] \ + \। लॉग \)। */\ 1/'अधिक सरल है, है ना? – Dagang

+0

दाएं, लेकिन बच निकले ब्रेसिज़ के साथ। यह मेरे लिए पहले काम नहीं करता क्योंकि मैंने '*' छोड़ा था। मेरा समाधान अपडेट किया गया। –