मैं DbgView लॉग फ़ाइल से पहले दो कॉलम (जिनमें से मुझे कोई दिलचस्पी नहीं है) निकालने की कोशिश कर रहा हूं। मुझे एक उदाहरण नहीं मिल रहा है जो पंक्ति के अंत तक कॉलम 3 से प्रिंट करता है। ध्यान दें कि प्रत्येक पंक्ति में स्तंभों की चर संख्या है।
मैं DbgView लॉग फ़ाइल से पहले दो कॉलम (जिनमें से मुझे कोई दिलचस्पी नहीं है) निकालने की कोशिश कर रहा हूं। मुझे एक उदाहरण नहीं मिल रहा है जो पंक्ति के अंत तक कॉलम 3 से प्रिंट करता है। ध्यान दें कि प्रत्येक पंक्ति में स्तंभों की चर संख्या है।
जवाबों:
... या एक सरल समाधान: cut -f 3- INPUTFILE
बस सही सीमांकक (-d) जोड़ें और आपको एक ही प्रभाव मिला।
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'
( नई फ़ील्ड को printf
प्रिंट नहीं करेगा, जबकि print ""
अन्य क्षेत्रों के मुद्रित होने के बाद न्यूलाइन जोड़ देगा)
echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'
जो देता है 3 4 5 6 7 8 9 10
:।
awk '{ print substr($0, index($0,$3)) }'
समाधान यहाँ पाया गया:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
जोनाथन फीनबर्ग का जवाब प्रत्येक क्षेत्र को एक अलग लाइन पर प्रिंट करता है। आप printf
एक ही लाइन पर आउटपुट के लिए रिकॉर्ड को फिर से बनाने के लिए उपयोग कर सकते हैं, लेकिन आप फ़ील्ड्स को बाईं ओर जंप भी कर सकते हैं।
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
NF
POSIX द्वारा डीक्रिमेंटिंग की अनुमति नहीं है।
NF
इसे घटाया जा सकता है।
awk '{$1=$2=$3=""}1' file
एनबी: यह विधि 1,2,3 क्षेत्रों में "रिक्त स्थान" छोड़ देगी लेकिन समस्या नहीं है यदि आप सिर्फ आउटपुट देखना चाहते हैं।
1
मतलब है? मुझे किस कीवर्ड से खोज करनी चाहिए awk
?
{$1=$2=$3="";$0=$0;$1=$1}1
यदि आप एक ही पंक्ति में उदाहरण के लिए 3 के बाद कॉलम प्रिंट करना चाहते हैं, तो आप उपयोग कर सकते हैं:
awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'
उदाहरण के लिए:
Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf
यह प्रिंट होगा:
20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf
जैसा कि हम देख सकते हैं, अंतरिक्ष में भी पेप्लिप सही लाइन में दिखाता है।
निम्नलिखित पंक्ति के बारे में क्या:
awk '{$ 1 = $ 2 = $ 3 = ""; फ़ाइल छापें
@ Ghostdog74 सुझाव के आधार पर। जब आप लाइनों को फ़िल्टर करते हैं, तो खान को बेहतर व्यवहार करना चाहिए:
awk '/ ^ exim4-config / {$ 1 = ""; फ़ाइल छापें
sed 's/\s\+//g'
प्रमुख स्थानों को ट्रिम करने के लिए कमांड के अंत में पाइप और जोड़ सकते हैं
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
यह दी गई फील्ड nr।, N से पहले है, और क्षेत्र nr.N सहित सभी लाइन को प्रिंट करता है और मूल रिक्ति (यह सुधार नहीं करता है) को बनाए रखता है। यह मैटर नहीं करता है यदि फ़ील्ड का स्ट्रिंग लाइन में कहीं और भी दिखाई देता है, जो कि daisaa के उत्तर के साथ समस्या है।
एक फ़ंक्शन को परिभाषित करें:
fromField () {
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
और इसे इस तरह से उपयोग करें:
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
आउटपुट सब कुछ बनाए रखता है, जिसमें रिक्त स्थान शामिल हैं
उन फ़ाइलों के लिए अच्छी तरह से काम करता है जहां '/ n' रिकॉर्ड विभाजक है, ताकि आपके पास लाइनों के अंदर नया-नया वर्ण न हो। यदि आप इसे अन्य रिकॉर्ड विभाजकों के साथ उपयोग करना चाहते हैं तो उपयोग करें:
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
उदाहरण के लिए। लगभग सभी फाइलों के साथ अच्छी तरह से काम करता है जब तक वे हेक्साडेसिमल चार एनआर का उपयोग नहीं करते हैं। 1 लाइनों के अंदर।
निम्न awk कमांड प्रत्येक पंक्ति के अंतिम N फ़ील्ड को प्रिंट करता है और लाइन के अंत में एक नई लाइन वर्ण प्रिंट करता है:
awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
एक उदाहरण के नीचे खोजें जो / usr / बिन निर्देशिका की सामग्री को सूचीबद्ध करता है और फिर अंतिम 3 पंक्तियों को रखता है और फिर awk का उपयोग करके प्रत्येक पंक्ति के अंतिम 4 स्तंभों को प्रिंट करता है:
$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root 14736 Jan 14 2014 bcomps
-rwxr-xr-x 1 root root 10480 Jan 14 2014 acyclic
-rwxr-xr-x 1 root root 35868448 May 22 2014 skype
$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps
Jan 14 2014 acyclic
May 22 2014 skype
ठीक है, आप नियमित अभिव्यक्ति का उपयोग करके आसानी से एक ही प्रभाव को पूरा कर सकते हैं। विभाजक को एक स्थान मानते हुए, ऐसा लगेगा:
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
awk '{ sub(/([^ ]+ +){2}/, ""); print }'
जो पैटर्न को दो बार दूर ले जाता है।
पर्ल समाधान:
perl -lane 'splice @F,0,2; print join " ",@F' file
इन कमांड-लाइन विकल्पों का उपयोग किया जाता है:
-n
इनपुट फ़ाइल की प्रत्येक पंक्ति के चारों ओर लूप, स्वचालित रूप से प्रत्येक पंक्ति को प्रिंट न करें
-l
प्रसंस्करण से पहले नए सिरे को हटाता है, और बाद में उन्हें वापस जोड़ता है
-a
ऑटोसप्लिट मोड - @F सरणी में इनपुट लाइनों को विभाजित करें। व्हॉट्सएप पर बंटवारे की चूक
-e
पर्ल कोड निष्पादित करें
splice @F,0,2
@F सरणी से कॉलम 0 और 1 को सफाई से हटाता है
join " ",@F
प्रत्येक तत्व के बीच में एक जगह का उपयोग करके @F सरणी के तत्वों को जोड़ता है
यदि आपकी इनपुट फ़ाइल अंतरिक्ष-सीमांकित के बजाय अल्पविराम-सीमांकित है, तो उपयोग करें -F, -lane
अजगर समाधान:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
बैश में आप निम्न सिंटैक्स का उपयोग स्थितिगत मापदंडों के साथ कर सकते हैं:
while read -a cols; do echo ${cols[@]:2}; done < file.txt
और जानें: बैश हैकर्स विकी में स्थितीय मापदंडों को संभालना
AWK कॉलम को फ़ील्ड कहा जाता है, इसलिए NF कुंजी है
सभी पंक्तियाँ:
awk -F '<column separator>' '{print $(NF-2)}' <filename>
केवल पहली पंक्ति:
awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>