Awk में कई सीमांकक का उपयोग करना


202

मेरे पास एक फाइल है जिसमें निम्नलिखित लाइनें हैं:

/logs/tc0001/tomcat/tomcat7.1/conf/catalina.properties:app.env.server.name = demo.example.com
/logs/tc0001/tomcat/tomcat7.2/conf/catalina.properties:app.env.server.name = quest.example.com
/logs/tc0001/tomcat/tomcat7.5/conf/catalina.properties:app.env.server.name = www.example.com

उपरोक्त आउटपुट में मैं 3 फ़ील्ड (नंबर 2, 4 और अंतिम एक *.example.com) निकालना चाहता हूं । मुझे निम्न आउटपुट मिल रहा है:

cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001   tomcat7.1
tc0001   tomcat7.2
tc0001   tomcat7.5

डोमेन नाम के साथ अंतिम फ़ील्ड कैसे निकालूं '='? मैं multiple delimiterफ़ील्ड निकालने के लिए कैसे उपयोग करूँ ?


2
मेरे प्रश्न का उत्तर देने के लिए जो समान है, लेकिन अलग है, awkजब वे रिक्त थे जो फ़ील्ड नंबर निगल रहे थे, तो खेतों को निगल रहा था। मैं बदल -F " "गया -F "[ ]"और awkखाली खेतों को अब नहीं निगलूंगा।
एडम

जवाबों:


324

परिसीमन एक नियमित अभिव्यक्ति हो सकती है।

awk -F'[/=]' '{print $3 "\t" $5 "\t" $8}' file

पैदा करता है:

tc0001   tomcat7.1    demo.example.com  
tc0001   tomcat7.2    quest.example.com  
tc0001   tomcat7.5    www.example.com

42
बेशक, catप्रक्रिया की आवश्यकता नहीं है awk '...' file:। इसके अलावा, आउटपुट फील्ड सेपरेटर का उपयोग करना कठिन होगा:awk -F'[/=]' -v OFS="\t" '{print $3, $5, $8}'
ग्लेन जैकमैन

17
Awk delimiters नियमित अभिव्यक्ति हो सकते हैं ... इसने मेरा दिन बना दिया!
das.cyklone

4
@ das.cyklone: ​​awk में कई विभाजक भी हो सकते हैं, के साथ |: ex: awk -F 'this|that|[=/]' '......' (उपयोगी के लिए शब्द / तार अलग करने वाली चीजें हैं) (ध्यान दें कि यह 2 विभाजकों के बीच फ़िज़ाओं में रिक्त स्थान रखता है। जोड़ना भी |[ \t]+उपयोगी हो सकता है, लेकिन चीजें बना सकता है। मुश्किल ... चूंकि 'यह' से पहले और बाद में अक्सर रिक्त स्थान होते हैं, इससे अंतरिक्ष के बीच में 2 अतिरिक्त खाली क्षेत्र दिखाई देंगे (यह)
ओलिवियर दुलैक

मैंने 2 अलग-अलग डिस्ट्रोस पर यह कोशिश की है और मुझे समान व्यवहार मिलता है: मैं netstat -ntpl "netstat -ntpl | sed 's /: /' से पोर्ट प्राप्त करना चाहता हूं। awk '{प्रिंट $ 5}'" काम करता है लेकिन डॉल्बी पाइपिंग के बिना कर सकता था यह काम करता है लेकिन मुझे फ़ील्ड 17 पर डेटा की उम्मीद नहीं थी: "netstat -ntpl | awk -F" |: "" {प्रिंट $ 17} ""
louigi600

2
हां ... यह मुझे मिल गया जो मैं चाहता था: awk -F "[:] +" / \ / पोस्टमास्टर * $ / {{प्रिंट $ 5} '
louigi600

44

खुशखबरी! awkक्षेत्र विभाजक एक नियमित अभिव्यक्ति हो सकती है। आपको बस उपयोग करने की आवश्यकता है -F"<separator1>|<separator2>|...":

awk -F"/|=" -vOFS='\t' '{print $3, $5, $NF}' file

यह दिखाता है:

tc0001  tomcat7.1  demo.example.com
tc0001  tomcat7.2  quest.example.com
tc0001  tomcat7.5  www.example.com

यहाँ:

  • -F"/|="/या तो इनपुट फ़ील्ड विभाजक सेट करता है या =। उसके बाद, यह आउटपुट फ़ील्ड विभाजक को एक टैब पर सेट करता है।

  • -vOFS='\t'-vएक चर सेट करने के लिए ध्वज का उपयोग कर रहा है । OFSआउटपुट फ़ील्ड सेपरेटर के लिए डिफ़ॉल्ट चर है और यह टैब वर्ण पर सेट है। झंडा आवश्यक है क्योंकि ओएफएस की तरह कोई अंतर्निहित नहीं है -F

  • {print $3, $5, $NF} इनपुट क्षेत्र विभाजक के आधार पर 3, 5 और अंतिम फ़ील्ड प्रिंट करता है।


एक और उदाहरण देखें:

$ cat file
hello#how_are_you
i#am_very#well_thank#you

इस फ़ाइल में दो फ़ील्ड विभाजक हैं, #और _। यदि हम विभाजक के एक या दूसरे होने की परवाह किए बिना दूसरे क्षेत्र को प्रिंट करना चाहते हैं, तो चलो दोनों को विभाजक बनाते हैं!

$ awk -F"#|_" '{print $2}' file
how
am

फाइलें इस प्रकार हैं:

hello#how_are_you           i#am_very#well_thank#you
^^^^^ ^^^ ^^^ ^^^           ^ ^^ ^^^^ ^^^^ ^^^^^ ^^^
  1    2   3   4            1  2   3    4    5    6

1
धन्यवाद @BUFU आपके संपादन के लिए। मैंने एफएस भाग पर ध्यान केंद्रित करने के लिए ओएफएस संदर्भ को हटा दिया, लेकिन यह भी अच्छा है। चीयर्स!
फेडोरक्वी 'एसओ ने

5

यदि आपका व्हाट्सएप सुसंगत है, तो आप इसे एक सीमांकक के रूप में उपयोग कर सकते हैं, \tसीधे डालने के बजाय , आप आउटपुट विभाजक सेट कर सकते हैं और इसे स्वचालित रूप से शामिल किया जाएगा:

< file awk -v OFS='\t' -v FS='[/ ]' '{print $3, $5, $NF}'

3

किसी भी संख्या के एक क्षेत्र विभाजक के लिए 2के माध्यम से 5या पत्र aया #या एक अंतरिक्ष, जहां अलग चरित्र उदाहरण के लिए दोहराया जाना चाहिए कम से कम 2 बार और नहीं की तुलना में अधिक 6 बार,:

awk -F'[2-5a# ]{2,6}' ...

मुझे यकीन है कि इस रूप में मौजूद विविधताएं () और मापदंडों का उपयोग कर रही हैं


3

पर्ल वन-लाइनर:

perl -F'/[\/=]/' -lane 'print "$F[2]\t$F[4]\t$F[7]"' file

इन कमांड-लाइन विकल्पों का उपयोग किया जाता है:

  • -nइनपुट फ़ाइल की प्रत्येक पंक्ति के चारों ओर लूप, $_चर में रेखा डालें , स्वचालित रूप से हर पंक्ति को प्रिंट न करें

  • -l प्रसंस्करण से पहले नई लिंक हटाता है, और बाद में उन्हें वापस जोड़ता है

  • -aऑटोसप्लिट मोड - पर्ल स्वचालित रूप से @Fसरणी में इनपुट लाइनों को विभाजित करेगा । व्हॉट्सएप पर बंटवारे की चूक

  • -Fऑटोसप्लिट संशोधक, इस उदाहरण में /या तो विभाजित होता है या=

  • -e पर्ल कोड निष्पादित करें

Perl, awk से निकटता से संबंधित है, हालाँकि, @Fautosplit array इंडेक्स पर शुरू होती है $F[0]जबकि awk फ़ील्ड $ 1 से शुरू होती है।


2

एक और एक -F विकल्प का उपयोग करना है लेकिन बाएं और दाएं कोष्ठक के बीच पाठ को प्रिंट करने के लिए इसे regex पास करें ()

फ़ाइल सामग्री:

528(smbw)
529(smbt)
530(smbn)
10115(smbs)

आदेश:

awk -F"[()]" '{print $2}' filename

परिणाम:

smbw
smbt
smbn
smbs

केवल पाठ को मुद्रित करने के लिए awk का उपयोग करना []:

उपयोग करें awk -F'[][]' लेकिन awk -F'[[]]'काम नहीं करेगा।

http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html


आपका उत्तर विलोपन कतार में आया क्योंकि 10 में से 9 बार, 1 प्रतिष्ठा वाले उपयोगकर्ताओं को अपने स्वयं के ब्लॉग से लिंक करना आमतौर पर स्पैम है। लेकिन तुम्हारा होना नियम का अपवाद है। पिछले 10 वर्षों की सामग्री में सोने की खान है, उम्मीद है कि आपके पास इसे अमर करने की योजना होगी।
एरिक लेसिंस्की

0

मुझे लगता है कि बोर्ड पर कई सही उत्तर हैं, लेकिन फिर भी मैं अपना कोड अपलोड करना चाहता हूं,

awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'


2
print $3 " " $5 " " $7के रूप में मुद्रित किया जा सकता है print $3, $5, $7। इसके अलावा, मुझे awk का उपयोग करने और फिर sed को पाइप करने का फायदा नहीं दिखता है। सामान्य तौर पर, awk पर्याप्त हो सकता है और अन्य उत्तर बताते हैं कि।
फेडोरक्वी 'एसओ स्टॉप हॉर्मिंग'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.