Wanneer we bepaalde commando's in Unix/Linux uitvoeren om tekst uit een string of bestand te lezen of te bewerken, proberen we meestal de uitvoer te filteren naar een bepaalde sectie van belang. Dit is waar het gebruik van reguliere expressies van pas komt.
Lees ook:10 Handige Linux Chaining-operators met praktische voorbeelden
Een reguliere expressie kan worden gedefinieerd als een tekenreeks die verschillende reeksen tekens voorstelt. Een van de belangrijkste dingen van reguliere expressies is dat je hiermee de uitvoer van een opdracht of bestand kunt filteren, een gedeelte van een tekst- of configuratiebestand kunt bewerken, enzovoort.
Reguliere expressies zijn gemaakt van:
(.)
het komt overeen met elk enkel teken behalve een nieuwe regel.(*)
het komt overeen met nul of meer existenties van het onmiddellijke karakter dat eraan voorafgaat.[ karakter(s) ]
het komt overeen met een van de karakters gespecificeerd in karakter(s), men kan ook een koppelteken gebruiken (-)
om een reeks tekens te betekenen, zoals [a-f]
, [1-5]
, enzovoort.^
het komt overeen met het begin van een regel in een bestand.$
komt overeen met het einde van de regel in een bestand.\
het is een ontsnappingskarakter.Om tekst te filteren, moet men een tekstfiltertool gebruiken, zoals: awk. Je kunt denken aan awk als een eigen programmeertaal. Maar voor de reikwijdte van deze handleiding voor het gebruik: awk, zullen we het behandelen als een eenvoudige filtertool voor de opdrachtregel.
De algemene syntaxis van awk is:
# awk 'script' bestandsnaam.
Waar 'script'
is een reeks commando's die worden begrepen door awk en worden uitgevoerd op bestand, bestandsnaam.
Het werkt door een bepaalde regel in het bestand te lezen, een kopie van de regel te maken en vervolgens het script op de regel uit te voeren. Dit wordt herhaald op alle regels in het bestand.
De 'script'
is in de vorm '/patroon/ actie'
waar patroon is een reguliere expressie en de actie is wat awk zal doen als het het gegeven patroon in een regel vindt.
In de volgende voorbeelden zullen we ons concentreren op de metakarakters die we hierboven hebben besproken onder de kenmerken van awk.
In het onderstaande voorbeeld worden alle regels in het bestand afgedrukt /etc/hosts omdat er geen patroon wordt gegeven.
#awk'//{print}'/etc/hosts.
Ik het onderstaande voorbeeld, een patroon localhost
is gegeven, dus awk komt overeen met regel met localhost in de /etc/hosts
het dossier.
#awk'/localhost/{print}' /etc/hosts
De (.)
komt overeen met strings die bevatten plaats, localhost, lokaal netwerk in het onderstaande voorbeeld.
Het is te zeggen * l een_single_character c *.
#awk'/l.c/{print}' /etc/hosts.
Het komt overeen met strings die bevatten localhost, lokaal netwerk, lijnen, geschikt, zoals in het onderstaande voorbeeld:
#awk'/l*c/{print}' /etc/localhost.
Dat zul je ook merken (*)
probeert u de langst mogelijke match te geven die het kan detecteren.
Laten we eens kijken naar een casus die dit aantoont, neem de reguliere expressie t*t
wat betekent overeenkomen met tekenreeksen die beginnen met een letter t
en eindigen met t
in de regel hieronder:
dit is tecmint, waar je de beste goede tutorials, how to's, gidsen, tecmint krijgt.
Je krijgt de volgende mogelijkheden als je het patroon gebruikt: /t*t/
:
dit is T. dit is technologie. dit is tecmint, waar je t krijgt. dit is tecmint, waar je de beste goede t krijgt. dit is tecmint, waar je de beste goede tutorials krijgt, hoe t. dit is tecmint, waar je de beste goede tutorials, how tos, gidsen, t. dit is tecmint, waar je de beste goede tutorials, how tos, gidsen, tecmint krijgt.
En (*)
in /t*t/
Met jokertekens kan awk de laatste optie kiezen:
dit is tecmint, waar je de beste goede tutorials, how to's, gidsen, tecmint krijgt.
Neem bijvoorbeeld de set [al1]
, hier komt awk overeen met alle tekenreeksen die tekens bevatten een
of ik
of 1
in een regel in het bestand /etc/hosts.
#awk'/[al1]/{print}' /etc/hosts.
Het volgende voorbeeld komt overeen met tekenreeksen die beginnen met ofwel K
of k
gevolgd door t
:
#awk'/[Kk]T/{print}' /etc/hosts
Begrijp karakters met awk:
[0-9]
betekent een enkel nummer[a-z]
betekent overeenkomen met een enkele kleine letter[A-Z]
betekent overeenkomen met een enkele hoofdletter[a-zA-Z]
betekent overeenkomen met een enkele letter[a-zA-Z 0-9]
betekent overeenkomen met een enkele letter of cijferLaten we een voorbeeld hieronder bekijken:
#awk'/[0-9]/{print}' /etc/hosts
Alle regels uit het bestand /etc/hosts ten minste één nummer bevatten [0-9]
in het bovenstaande voorbeeld.
Het komt overeen met alle lijnen die beginnen met het patroon zoals in het onderstaande voorbeeld:
#awk'/^fe/{print}' /etc/hosts. #awk'/^ff/{print}' /etc/hosts.
Het komt overeen met alle lijnen die eindigen met het verstrekte patroon:
#awk'/ab$/{print}' /etc/hosts. #awk'/ost$/{print}' /etc/hosts. #awk'/rs$/{print}' /etc/hosts.
Hiermee kun je het personage dat erop volgt letterlijk nemen, dat wil zeggen: beschouw het zoals het is.
In het onderstaande voorbeeld drukt de eerste opdracht alle regels in het bestand af, de tweede opdracht drukt niets af omdat ik een regel wil matchen die $25.00, maar er wordt geen escape-teken gebruikt.
Het derde commando is correct omdat er een escape-teken is gebruikt om te lezen $ zoals het is.
#awk'//{print}' deals.txt. #awk'/$25.00/{print}' deals.txt. #awk'/\$25.00/{print}' deals.txt.
Dat is niet alles met de awk command line filtering tool, de bovenstaande voorbeelden een de basishandelingen van awk. In de volgende delen zullen we verder gaan met het gebruik van complexe functies van awk. Bedankt voor het lezen en voor eventuele aanvullingen of verduidelijkingen, plaats een opmerking in het opmerkingengedeelte.