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}' filnavnDe 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.logDen 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.logHer 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.txtDette 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.logDenne 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.logDenne 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.txtPå lignende måte, for å få alle partalls linjer, bruk 2:
awk 'NR % 2 == 0 {print}' fil.txtFor områder kan du kombinere flere NR-betingelser med &&-operatoren, slik:
awk 'NR >= 50 && NR <= 100 {print}' fil.txtDette 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.pyNå, 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.txtDenne 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.txtDenne 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.csvHer 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.txtDenne 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.csvDu 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.csvUtover 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.txtVidere kan vi også fange komplette feilhendelser som starter med spesifisert tekst og slutter med neste tomme linje.
awk '/ERROR:/,/^$/ {print}' application.logHer 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.iniDette 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.csvI 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.csvHvis 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.txtNå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.csvDu 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.csvTil 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.txtDessa 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.

Legg igjen en kommentar