Zoeken op website

Hoe u Awk en reguliere expressies kunt gebruiken om tekst of tekenreeksen in bestanden te filteren


Wanneer we bepaalde commando's uitvoeren in Unix/Linux om tekst uit een string of bestand te lezen of te bewerken, proberen we meestal de uitvoer naar een bepaald interessant gedeelte te filteren. Dit is waar het gebruik van reguliere expressies van pas komt.

Lees ook: 10 Handige Linux Chaining Operators met praktische voorbeelden

Wat zijn reguliere expressies?

Een reguliere expressie kan worden gedefinieerd als een tekenreeks die verschillende reeksen tekens vertegenwoordigt. Een van de belangrijkste dingen van reguliere expressies is dat u hiermee de uitvoer van een opdracht of bestand kunt filteren, een sectie van een tekst- of configuratiebestand kunt bewerken, enzovoort.

Kenmerken van reguliere expressie

Reguliere expressies zijn gemaakt van:

  1. Gewone tekens zoals spatie, onderstrepingsteken(_), A-Z, a-z, 0-9.
  2. Metakarakters die zijn uitgebreid tot gewone karakters, omvatten:

    1. (.) het komt overeen met elk enkel teken behalve een nieuwe regel.
    2. (*) het komt overeen met nul of meer bestaansvormen van het onmiddellijke teken dat eraan voorafgaat.
    3. [ karakter(s) ] het komt overeen met een van de karakters gespecificeerd in karakter(s), men kan ook een koppelteken (-) gebruiken om een reeks karakters aan te duiden, zoals als [a-f], [1-5], enzovoort.
    4. ^ het komt overeen met het begin van een regel in een bestand.
    5. $ komt overeen met het einde van de regel in een bestand.
    6. \ het is een escape-teken.

Om tekst te filteren, moet je een tekstfiltertool gebruiken, zoals awk. Je kunt awk beschouwen als een eigen programmeertaal. Maar voor de reikwijdte van deze handleiding over het gebruik van awk zullen we het behandelen als een eenvoudige tool voor het filteren van opdrachtregels.

De algemene syntaxis van awk is:

awk 'script' filename

Waarbij 'script' een reeks opdrachten is die worden begrepen door awk en worden uitgevoerd in 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.

Het 'script' heeft de vorm '/pattern/action' waarbij pattern een reguliere expressie is en de action is wat awk zal doen als het het gegeven patroon in een lijn vindt.

Hoe Awk Filtering Tool onder Linux te gebruiken

In de volgende voorbeelden zullen we ons concentreren op de metakarakters die we hierboven hebben besproken onder de kenmerken van awk.

Een eenvoudig voorbeeld van het gebruik van awk:

In het onderstaande voorbeeld worden alle regels in het bestand /etc/hosts afgedrukt, aangezien er geen patroon wordt gegeven.

awk '//{print}'/etc/hosts

Gebruik Awk met patroon:

In het onderstaande voorbeeld is een patroon localhost gegeven, dus awk komt overeen met de regel met localhost in het bestand /etc/hosts.

awk '/localhost/{print}' /etc/hosts 

Awk gebruiken met (.) jokertekens in een patroon

De (.) komt overeen met tekenreeksen die loc, localhost, localnet bevatten in het onderstaande voorbeeld.

Dat wil zeggen * l een_enkel_teken c *.

awk '/l.c/{print}' /etc/hosts

Awk gebruiken met (*) teken in een patroon

Het komt overeen met tekenreeksen die localhost, localnet, lines, capable bevatten, zoals in het onderstaande voorbeeld:

awk '/l*c/{print}' /etc/localhost

U zult zich ook realiseren dat (*) probeert u de langst mogelijke overeenkomst te bezorgen die het kan detecteren.

Laten we eens kijken naar een geval dat dit aantoont, neem de reguliere expressie t*t, wat betekent dat je tekenreeksen moet matchen die beginnen met de letter t en eindigen met t in de onderstaande regel:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

Als je het patroon /t*t/ gebruikt, krijg je de volgende mogelijkheden:

this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint

En (*) in het /t*t/ jokerteken zorgt ervoor dat awk de laatste optie kan kiezen:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint

Awk gebruiken met set [ karakter(s) ]

Neem bijvoorbeeld de set [al1], hier komt awk overeen met alle strings die het teken a of l of 1 bevatten op een regel in het bestand /etc/hosts.

awk '/[al1]/{print}' /etc/hosts

Het volgende voorbeeld komt overeen met tekenreeksen die beginnen met K of k gevolgd door T:

awk '/[Kk]T/{print}' /etc/hosts 

Tekens in een bereik opgeven

Begrijp karakters met awk:

  1. [0-9] betekent een enkel nummer
  2. [a-z] betekent overeenkomen met één kleine letter
  3. [A-Z] betekent overeenkomen met één hoofdletter
  4. [a-zA-Z] betekent overeenkomen met één enkele letter
  5. [a-zA-Z 0-9] betekent overeenkomen met een enkele letter of cijfer

Laten we een voorbeeld hieronder bekijken:

awk '/[0-9]/{print}' /etc/hosts 

Alle regels uit het bestand /etc/hosts bevatten minstens één enkel nummer [0-9] in het bovenstaande voorbeeld.

Gebruik Awk met (^) metateken

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

Gebruik Awk met ($) metateken

Het komt overeen met alle lijnen die eindigen met het meegeleverde patroon:

awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts

Gebruik Awk met (\) Escape-teken

Het stelt je in staat het personage dat erop volgt letterlijk te nemen, dat wil zeggen: beschouw het zoals het is.

In het onderstaande voorbeeld drukt het eerste commando alle regels in het bestand af, het tweede commando drukt niets af omdat ik een regel wil matchen met $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

Samenvatting

Dat is nog niet alles met de awk opdrachtregelfiltertool; de bovenstaande voorbeelden laten de basisbewerkingen van awk zien. In de volgende delen gaan we dieper in op het gebruik van complexe functies van awk. Bedankt voor het doorlezen en voor eventuele toevoegingen of verduidelijkingen kunt u een reactie plaatsen in het opmerkingengedeelte.