6 Bruksområder for tekstfiltrering med Linux awk-kommandoen

Awk-kommandoen i Linux er et kraftig verktøy for tekstbehandling, som effektivt filtrerer og manipulerer data ved hjelp av mønstre og betingelser for ulike bruksområder.

awk-kommandoen er et allsidig tekstbehandlingsverktøy i Linux. Den filtrerer og manipulerer filer ved hjelp av mønstre, betingelser og handlinger. Den støtter et bredt spekter av scenarier, noe som gjør det enkelt å hente ut spesifikke data fra logger, konfigurasjonsfiler eller hvilken som helst tekstfil.

Her er noen vanlige måter å filtrere tekst med awk på. De inkluderer søk med regulære uttrykk, linje- og feltvalg, numerisk filtrering, og mer.

Matche Tekst Ved Bruk Av Regulære Uttrykk

Selv om regex har en notorisk bratt læringskurve, er det sveitsisk armykniv for tekstmanipulering. Når du bruker det med verktøy som awk, kan du søke etter mønstre, fra enkle til komplekse, i hele filer på millisekunder.

La oss starte med den grunnleggende syntaxen:

awk '/pattern/ {print}' filnavn

De skråstrekene forteller awk at du bruker et regulært uttrykk, og de krøllete parentesene inneholder handlingen som skal utføres ved en match. For eksempel kan du skrive ut alle loggoppføringer som inneholder "error" fra en loggfil med følgende:

awk '/error/ {print}' syslog.log

Den ene linjen henter hver linje som inneholder ordet error, men regex lar deg gå lenger. For eksempel, for å finne linjer som begynner med enten INFO eller WARN, bruk denne kommandoen:

awk '/^(INFO|WARN)/ {print}' syslog.log

Her fungerer pipe | som en ELLER-operator, og caret ^ matcher begynnelsen av en linje.

Det jeg elsker med regex, er at det går utover nøyaktige ord, og lar deg bruke jokertegn for mer komplekse søk. For eksempel, kan du finne e-postadresser i en tekstfil med dette mønsteret:

awk '/[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]+/ {print}' kontakter.txt

Dette mønsteret matcher sekvenser av bokstaver og tall, etterfulgt av et @-symbol, flere bokstaver og tall, et punktum, og til slutt flere bokstaver. Selv om det ikke er perfekt for alle e-postformater, fanger det de fleste vanlige.

Du kan også bruke tilde-operatoren (~) for mer presis matching innen spesifikke felt. Denne tilnærmingen er veldig effektiv for strukturert data. For eksempel, hvis du vil søke etter ERROR bare i det tredje feltet av hver linje, kan du bruke dette:

awk '$3 ~ /ERROR/ {print}' system.log

Denne tilnærmingen gjør det mer presist enn å søke etter hele linjen. I tillegg, hvis forskjeller i store og små bokstaver er et problem, kan du enkelt bruke tolower()-funksjonen slik:

awk 'tolower($0) ~ /error/ {print}' mixed_case.log

Denne kommandoen konverterer hver linje til små bokstaver før den søker, noe som lar den fange ERROR, Error, error, og enhver annen kapitalisering.

Velg Linjer Etter Linjenummer, Lengde, Felttall, Eller Siste Felt

Noen ganger trenger du spesifikke linjer basert på deres posisjon eller egenskaper, ikke innholdet. awk håndterer disse scenariene vakkert med sine innebygde variable som filtrerer linjer etter posisjon eller struktur. Disse innebygde variablene inkluderer NR, length(), NF, og $NF.

La oss begynne med NR-variabelen. Den står for Nummer av Record (eller, ganske enkelt linjenummer). awk øker den for hver linje den leser. Du kan bruke dette for å hente spesifikke linjer eller områder.

For å vise de første 10 linjene av en fil, bruk:

awk 'NR <=10 {print}' storfil.txt

På lignende måte, for å få alle partalls linjer, bruk 2:

awk 'NR % 2 == 0 {print}' fil.txt

For områder kan du kombinere flere NR-betingelser med &&-operatoren, slik:

awk 'NR >= 50 && NR <= 100 {print}' fil.txt

Dette skriver ut linjene fra 50 til 100. Du kan også kombinere length()-funksjonen med awk når du arbeider med filer som har inkonsekvent formatering eller når du vil filtrere ut tomme linjer.

For eksempel, for å telle tegn med length()-funksjonen og deretter bare vise linjer lengre enn 80 tegn, bruk:

awk 'length($0) > 80 {print}' kode.py

Nå, la oss snakke om en annen ofte brukt variabel, NF, som refererer til Felttall. Ved å bruke denne variabelen, deler awk automatisk hver linje inn i felt basert på en avgrensning (som standard, mellomrom eller tabulatortegn).

For eksempel, for CSV-filer eller strukturert data, kan du bruke NF-variabelen for å telle feltene (kolonnene). Du kan filtrere basert på hvor mange felt hver linje inneholder:

awk 'NF == 5 {print}'
customer_data.csv

Denne kommandoen beholder bare linjer med nøyaktig 5 felter, noe som hjelper deg å oppdage ufullstendige poster. For å gjøre det motsatte, og skrive ut linjene som ikke har nøyaktig 5 felter, bruk !=-operatoren i stedet for ==. I tillegg, for å skrive ut linjer med minst 5 felter (kolonner), bruk >=-operatoren.

Mens NF forteller deg hvor mange felter det er, gir $NF deg verdien av det aller siste feltet. Variabelen $NF representerer det siste feltet i hver linje, uavhengig av hvor mange felt det er. Dette er utrolig nyttig når man arbeider med filer der antallet kolonner varierer.

Ta denne kommandoen:

awk '$NF == "COMPLETED" {print}' task_list.txt

Denne finner alle linjer som slutter med COMPLETED, selv om noen linjer har 3 felt mens andre har 7.

Du kan også kombinere alle disse betingelsene sammen:

awk 'length($0) > 50 && NF >= 4 {print}' mixed_data.txt

Denne kommandoen skriver ut bare linjene som er lengre enn 50 tegn og inneholder minst 4 felt. Det sikrer at utdataene ekskluderer korte eller ufullstendige linjer.

Sammenlign og Filtrer Numeriske Feltverdier

awk er smart nok til å behandle felt som inneholder tall som faktiske tall, ikke bare tekst. Dette betyr at du kan utføre matematiske sammenligninger uten spesielle konverteringsfunksjoner og åpne opp for en helt ny verden av filtreringsmuligheter.

Nå, la oss si at du har en CSV med studentresultater, og du vil returnere bare de studentene som fikk over 80 poeng. Du kan gjøre det med:

awk -F, '$2 > 80 {print $1, $2}' scores.csv

Her bruker vi -F, for å fortelle awk at feltene er adskilt med komma. $2 refererer til det andre feltet eller kolonnen (poengsummen), og $1 er navnet.

Når du arbeider med tekstfiler, kan prosentandeler skape problemer hvis % -symbolet er inkludert i et felt. Du kan fjerne det med gsub():

awk '{gsub(/%/, "", $4); if($4 > 75) print}' performance.txt

Denne kommandoen fjerner % -symbolet fra det fjerde feltet, og sjekker deretter om det gjenværende tallet overstiger 75.

Du kan også bruke flere betingelser med logiske operatorer. For eksempel, hvis du vil trekke ut salgsverdier fra en CSV-fil som er mellom $500 og $2000, kjør:

awk -F, '$3 > 500 && $3 < 2000 {print}' sales.csv

Du kan kombinere betingelser med || (ELLER) -operatoren også. For eksempel, for å finne poster der salget enten er veldig høyt eller veldig lavt, bruk:

awk -F, '$3 > 5000 || $3 < 100 {print}' sales.csv

Utover numeriske sammenligninger kan du også bruke flere betingelser for å matche spesifikk tekst, sjekke datoer, eller ekskludere uønskede poster.

Du kan også kombinere && og ||. Imidlertid er parenteser avgjørende for å kontrollere logikken korrekt. La oss si at du vil finne kontoer som er enten AKTIVE eller PENDENDE, men bare hvis saldoen deres overstiger $1000. Du ville skrive:

awk -F, '($2 == "ACTIVE" || $2 == "PENDING") && $3 > 1000' accounts.csv

Uten parenteser ville operatorprioriteringen endret betydningen av filteret.

Fange Linjer Som Ligger Mellom Matching Mønstre

De fleste Linux-brukere er kjent med å bruke grep for å fange spesifik informasjon. Imidlertid kan awk også velge et område av linjer, fra en linje som passer et startmønster og ender med en linje som matcher et endemønster.

Syntaksen er elegant enkel:

awk '/start_pattern/,/end_pattern/' filename

Dette fanger startlinjen, alle linjene i mellom, og sluttlinjen. Hvis du vil ekskludere selve markørene, kan du bruke en flaggbasert tilnærming som dette:

awk '/BEGIN/{flag=1; next} /END/{flag=0} flag' logfile.txt

Videre kan vi også fange komplette feilhendelser som starter med spesifisert tekst og slutter med neste tomme linje.

awk '/ERROR:/,/^$/ {print}' application.log

Her vil awk begynne å skrive ut linjer når den ser en linje som inneholder "ERROR:" og fortsette til den finner den første tomme linjen.

Ekskluder Uønskede eller Duplikate Poster

Rensing av data betyr ofte å fjerne det du ikke vil ha. awk gir enkle måter å filtrere ut støy og fjerne overflødige data.

NOT-operatøren (!) er ditt primære verktøy for ekskludering. Du kan plassere den foran ethvert mønster.

eller betingelse for å invertere treffet, og forteller awk å utføre en handling på alle linjer som ikke samsvarer.

For eksempel, la oss si at du vil ekskludere alle meldinger som inneholder DEBUG fra loggfilen til applikasjonen din. Bruk dette:

awk '!/DEBUG/' application.log

Denne kommandoen skriver ut hver linje fra application.log med mindre den inneholder ordet DEBUG.

Du kan også kombinere dette med feltbaserte betingelser, for eksempel, du kan se all trafikk som ikke kom fra din interne overvåkings-IP-adresse.

awk '$1 != "10.0.0.5"' access.log

På samme måte er en annen flott operasjon av awk å filtrere ut kommentarer (linjer som starter med #) og tomme linjer fra en konfigurasjonsfil. For å gjøre det, bruk:

awk '!/^#/ && NF > 0 {print}' config.ini

Dette hopper over linjer som starter med # og fjerner også tomme linjer.

Du kan også fjerne duplikater basert på et spesifikt felt. For eksempel, la oss anta at du har en kontaktliste i CSV-format med tre kolonner: ID, Navn og E-post. For å beholde bare den første posten for hver unik e-postadresse (i det tredje feltet), bruk:

awk '!seen[$3]++ {print}' contact_list.csv

I tillegg kan du ekskludere case-sensitive unntak med tolower()-funksjonen:

Reformater Tekst ved å Velge Spesifikke Kolonner

Rådata kommer ofte i en struktur du ikke virkelig trenger, og awk gjør det enkelt å omorganisere det til noe mer nyttig. Du kan velge spesifikke kolonner, endre rekkefølgen deres, eller til og med kombinere dem til nye felt.

For eksempel, hvis du bare vil skrive ut den andre og femte kolonnen fra en fil, kan du bruke:

awk -F, '{print $2, $5}' sales.csv

Hvis du vil endre rekkefølgen på kolonnene, bytt $5 med $2.

Som standard skiller awk utdata med mellomrom, men du kan sette inn din egen separator, for eksempel et pipe-symbol.

awk '{print $1 "|" $3}' data.txt

Når du arbeider med CSV-filer, er første rad ofte en header. Du kan hoppe over den med NR > 1 og omorganisere kolonnene for å vise e-posten etterfulgt av navnet.

awk -F, 'NR > 1 {print $3, "->", $1, $2}' contacts.csv

Du kan også kombinere felt for å opprette nye, som å slå sammen fornavn og etternavn til et fullt navn før du skriver ut e-posten.

awk -F, '{print $1 " " $2, $3}' contacts.csv

Til slutt, hvis du vil at utdataene skal se klarere ut, kan du legge til din egen header før dataene ved å bruke en BEGIN-blokk.

awk 'BEGIN {print "Navn,E-post"} {print $1 "," $2}' data.txt

Dessa enkle eksemplene er nok til å begynne å reformaterte tekst til et oppsett som passer bedre til behovene dine.

Husk, awk er utmerket til å bearbeide strukturert tekst, alt med konsistente mønstre eller feltseparasjoner. Jo mer regelmessig dataformatet ditt er, desto kraftigere blir awk. Og når du kombinerer disse filtreringsteknikkene med andre Linux-verktøy gjennom piper, lager du utrolig effektive tekstbehandlingsarbeidsflyter.

Hvis du vil lese flere artikler som 6 Bruksområder for tekstfiltrering med Linux awk-kommandoen, kan du besøke kategorien Linux.

Index
  1. Matche Tekst Ved Bruk Av Regulære Uttrykk
  2. Velg Linjer Etter Linjenummer, Lengde, Felttall, Eller Siste Felt
  3. Sammenlign og Filtrer Numeriske Feltverdier
  4. Fange Linjer Som Ligger Mellom Matching Mønstre
  5. Ekskluder Uønskede eller Duplikate Poster
  6. Reformater Tekst ved å Velge Spesifikke Kolonner

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

Go up