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'