Meerdere scheidingstekens gebruiken in awk

Ik heb een bestand dat de volgende regels bevat:

/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

In bovenstaande uitvoer wil ik 3 velden extraheren (nummer 2, 4 en de laatste *.example.com). Ik krijg de volgende uitvoer:

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

Hoe extraheer ik ook het laatste veld met de domeinnaam die na '=' staat? Hoe gebruik ik multiple delimiter om een ​​veld te extraheren?


Antwoord 1, autoriteit 100%

Het scheidingsteken kan een reguliere expressie zijn.

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

Produceert:

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

Antwoord 2, autoriteit 13%

Goed nieuws! Het veldscheidingsteken awk kan een reguliere expressie zijn. Je hoeft alleen maar -F"<separator1>|<separator2>|...":

te gebruiken

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

Retouren:

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

Hier:

  • -F"/|=" stelt het invoerveldscheidingsteken in op / of =. Vervolgens wordt het scheidingsteken van het uitvoerveld ingesteld op een tabblad.

  • -vOFS='\t' gebruikt de vlag -v om een ​​variabele in te stellen. OFS is de standaardvariabele voor de uitvoerveldscheidingsteken en is ingesteld op het tabteken. De vlag is nodig omdat er geen ingebouwde functie is voor de OFS zoals -F.

  • {print $3, $5, $NF} drukt de 3e, 5e en laatste velden af ​​op basis van het invoerveldscheidingsteken.


Zie nog een voorbeeld:

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

Dit bestand heeft twee scheidingstekens voor velden, # en _. Als we het tweede veld willen afdrukken, ongeacht of het scheidingsteken het een of het ander is, laten we beide scheidingstekens maken!

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

Waar de bestanden als volgt zijn genummerd:

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

Antwoord 3, autoriteit 2%

Als uw witruimte consistent is, kunt u dat als scheidingsteken gebruiken, ook in plaats van \t rechtstreeks in te voegen, kunt u het uitvoerscheidingsteken instellen en het wordt automatisch opgenomen:

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

Antwoord 4

Een andere is om de -F optie te gebruiken, maar geef deze regex door om de tekst tussen haakjes links en of rechts af te drukken ().

De inhoud van het bestand:

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

Het commando:

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

resultaat:

smbw
smbt
smbn
smbs

Awk gebruiken om de tekst tussen [] af te drukken:

Gebruik awk -F'[][]' maar awk -F'[[]]' zal niet werken.

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


Antwoord 5

Voor een veldscheidingsteken van een willekeurig getal 2 tot en met 5 of de letter a of # of een spatie, waarbij het scheidingsteken minimaal 2 keer en maximaal 6 keer moet worden herhaald, bijvoorbeeld:

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

Ik weet zeker dat er varianten hiervan bestaan ​​met ( ) en parameters


Antwoord 6

Perl-oneliner:

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

Deze opdrachtregelopties worden gebruikt:

  • -n loop rond elke regel van het invoerbestand, plaats de regel in de variabele $_, druk niet automatisch elke regel af

  • -l verwijdert nieuwe regels voordat ze worden verwerkt en voegt ze daarna weer toe

  • -a autosplit mode perl splitst automatisch invoerregels in de @F array. Standaard ingesteld op splitsen op witruimte

  • -F autosplit-modifier, in dit voorbeeld wordt gesplitst op / of =

  • -e voer de perl-code uit

Perl is nauw verwant aan awk, maar de @F autosplit-array begint bij index $F[0] terwijl awk-velden beginnen met $1.


Antwoord 7

Ik zie dat er veel perfecte antwoorden op het bord staan, maar ik wil toch graag mijn stukje code uploaden,

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

LEAVE A REPLY

Please enter your comment!
Please enter your name here

14 + 18 =

Other episodes