6 Tekstfiltreringsanvendelser for Linux awk-kommandoen

Indeks
  1. Matche tekst ved hjælp af regulære udtryk
  2. Vælg linjer efter linjenummer, længde, feltantal eller sidste felt
  3. Sammenlign og Filter Numeriske Felt Værdier
  4. Fang Rækker af Linjer Mellem Matchede Mønstre
  5. Udelukkelse af Uønskede eller Duplicate Poster
  6. Reformatér tekst ved at vælge specifikke kolonner

Awk-kommandoen i Linux er et kraftfuldt værktøj til tekstfiltrering og manipulation, der gør det muligt at udtrække og omformatere specifik data fra filer med avancerede søge- og filtreringsmetoder.

Awk-kommandoen er et alsidigt tekstbehandlingsværktøj i Linux. Den filtrerer og manipulerer filer ved hjælp af mønstre, betingelser og handlinger. Den understøtter en bred vifte af scenarier, hvilket gør det enkelt at udtrække specifik data fra logfiler, konfigurationsfiler eller enhver tekstfil.

Her er nogle almindelige måder at filtrere tekst med awk. De inkluderer søgninger med regulære udtryk, valg af linjer og felter, numerisk filtrering og mere.

Matche tekst ved hjælp af regulære udtryk

Selvom regex har en berygtet stejl læringskurve, er det lommekniven til tekstmanipulation. Når du bruger det med værktøjer som awk, kan du søge efter mønstre, fra simple til komplekse, på tværs af hele filer på millisekunder.

Lad os starte med den grundlæggende syntaks:

awk '/pattern/ {print}' filename`

De fremadskrånte skråstreger fortæller awk, at du bruger et regulært udtryk, og de krøllede parenteser indeholder den handling, der skal udføres på et match. For eksempel kan du printe alle logindgange, der indeholder "error" fra en logfil med dette:

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

Den ene-liner fanger hver linje, der indeholder ordet error, men regex lader dig gå længere. For eksempel, for at finde linjer, der starter med enten INFO eller WARN, brug denne kommando:

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

Her fungerer tegnet | som en OR-operator, og caret ^ matcher begyndelsen af en linje.

Det, jeg elsker ved regex, er, at det går ud over præcise ord og giver dig mulighed for at bruge wildcard-tegn til mere komplekse søgninger. For eksempel kan du finde e-mailadresser i en tekstfil med dette mønster:

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

Dette mønster matcher sekvenser af bogstaver og tal, efterfulgt af et @-symbol, mere bogstaver og tal, et punktum, og endelig flere bogstaver. Selvom det ikke er perfekt til hver e-mailformat, fanger det de fleste almindelige.

Du kan også bruge tilde-operatoren (~) til mere præcise matches inden for specifikke felter. Denne tilgang er meget effektiv til strukturerede data. For eksempel, hvis du vil søge efter ERROR kun i det tredje felt i hver linje, kan du bruge dette:

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

Denne tilgang gør det mere præcist end at søge på hele linjen. Hvis der desuden er problemer med skelning mellem store og små bogstaver, skal du blot bruge funktionen tolower() som dette:

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

Denne kommando konverterer hver linje til små bogstaver, før den søger, hvilket gør det muligt at fange ERROR, Error, error og enhver anden kapitalisering.

Vælg linjer efter linjenummer, længde, feltantal eller sidste felt

Nogle gange har du brug for specifikke linjer baseret på deres position eller karakteristika, ikke deres indhold. Awk håndterer disse scenarier smukt med sine indbyggede variable, der filtrerer linjer efter position eller struktur. Disse indbyggede variable inkluderer NR, length(), NF og $NF.

Lad os starte med NR-variablen. Den står for Number of Record (eller blot linjenummer). Awk inkrementerer den for hver linje, den læser. Du kan bruge dette til at hente specifikke linjer eller intervaller.

For at vise de første 10 linjer af en fil, brug:

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

På samme måde, for at få alle de lige nummererede linjer, brug 2:

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

For intervaller kan du kombinere flere NR-betingelser med &&-operatoren, sådan her:

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

Dette printer linje 50 til 100. Du kan også kombinere funktionen length() med awk, når du arbejder med filer, der har inkonsistent formatering eller når du vil filtrere tomme linjer.

For eksempel, for at tælle karakterer med funktionen length() og derefter kun vise linjer, der er længere end 80 karakterer, brug:

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

Nu lad os tale om en anden almindeligt anvendt variabel, NF, som refererer til Feltantal. Ved brug af denne variabel opdeler awk automatisk hver linje i felter baseret på en afgrænser (som standard, mellemrum eller tabulator).

For eksempel, for CSV-filer eller strukturerede data, kan du bruge NF-variablen til at tælle felter (kolonner). Du kan filtrere baseret på, hvor mange felter hver linje indeholder:

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

Dette holder kun linjer med præcist 5 felter, hvilket hjælper dig med at spotte ufuldstændige poster. For at gøre det modsatte og udskrive kun de linjer, der ikke har præcist 5 felter, skal du bruge != operatoren i stedet for ==. Derudover, for at udskrive linjer med mindst 5 felter, brug >= operatoren.

Mens NF fortæller dig, hvor mange felter der er, giver $NF dig værdien af det aller sidste felt. $NF-variablen repræsenterer det sidste felt i hver linje, uanset hvor mange felter der er. Dette er utroligt nyttigt, når du arbejder med filer, hvor antallet af kolonner varierer.

Tag denne kommando:

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

Dette finder alle linjer, der ender med COMPLETED, selvom nogle linjer har 3 felter og andre har 7.

Du kan også kombinere alle disse betingelser sammen:

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

Denne kommando udskriver kun de linjer, der er længere end 50 tegn og indeholder mindst 4 felter. Den sikrer, at outputtet udelukker korte eller ufuldstændige linjer.

Sammenlign og Filter Numeriske Felt Værdier

awk er klog nok til at behandle felter, der indeholder tal, som egentlige tal, ikke blot tekst. Dette betyder, at du kan udføre matematiske sammenligninger uden nogen specielle konverteringsfunktioner, hvilket åbner op for en helt ny verden af filtreringsmuligheder.

Lad os sige, at du har en CSV med studerendes karakterer, og du vil returnere kun de studerende, der har scoret over 80 point. Du kan gøre det med:

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

Her bruger vi -F, til at fortælle awk, at felterne er adskilt af kommaer. $2 refererer til det andet felt eller kolonne (karakteren), og $1 er navnet.

Når du arbejder med tekstfiler, kan procenter forårsage problemer, hvis % symbolet er inkluderet i et felt. Du kan fjerne det med gsub():

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

Denne kommando fjerner % symbolet fra det fjerde felt og tjekker derefter, om det resterende tal overstiger 75.

Du kan også bruge flere betingelser med logiske operatorer. For eksempel, hvis du vil udtrække salgsbeløb fra en CSV-fil, der ligger mellem $500 og $2000, kør:

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

Du kan også kombinere betingelser med || (ELLER) operatoren. For eksempel, for at finde poster, hvor salget er enten meget højt eller meget lavt, brug:

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

Ud over numeriske sammenligninger kan du også bruge flere betingelser til at matche specifik tekst, tjekke datoer eller udelukke uønskede poster.

Du kan også kombinere && og ||. Dog er parenteser essentielle for at styre logikken korrekt. Antag, at du vil finde konti, der er enten AKTIVE eller VENTENDE, men kun hvis deres saldo overstiger $1000. Du ville skrive:

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

Uden parenteser ville operatorprioriteten ændre betydningen af filteret.

Fang Rækker af Linjer Mellem Matchede Mønstre

De fleste Linux-brugere er bekendte med at bruge grep til at fange specifik information. Dog kan awk også vælge et interval af linjer, der starter fra en linje, som matcher et start_pattern og slutter med en linje, der matcher et end_pattern.

Syntaksen er elegant enkel:

awk '/start_pattern/,/end_pattern/' filename

Dette fanger startlinjen, alle linjerne imellem og slutlinjen. Hvis du vil udelukke selve markørerne, kan du bruge en flag-baseret tilgang som denne:

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

Desuden kan vi også fange komplette fejlblokke, der starter med specificeret tekst og slutter med den næste tomme linje.

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

Her vil awk begynde at udskrive linjer, når den ser en linje, der indeholder "ERROR:", og fortsætte indtil den finder den første tomme linje.

Udelukkelse af Uønskede eller Duplicate Poster

Rydning af data betyder ofte at fjerne, hvad du ikke ønsker. awk giver enkle måder at filtrere støj og fjerne redundant data.

NOT operatoren (!) er dit primære værktøj til udelukkelse. Du kan placere den før ethvert mønster.

eller betingelse for at invertere matchen, som instruerer awk i at udføre en handling på alle linjer, der ikke matcher.

For eksempel, lad os sige, at du vil udelade alle beskeder, der indeholder DEBUG fra din applikationslogfil. Brug dette:

awk '!/DEBUG/' application.log

Denne kommando viser hver linje fra application.log, medmindre den indeholder ordet DEBUG.

Du kan også kombinere dette med feltbaserede betingelser, såsom at se på al trafik, der ikke kom fra din interne overvågnings-IP-adresse.

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

Tilsvarende er en anden god funktion af awk at filtrere kommentarer (linjer der starter med #) og tomme linjer fra en konfigurationsfil. For at gøre det, brug:

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

Denne kommando springer linjer over, der starter med #, og fjerner også tomme linjer.

Du kan også fjerne duplikater baseret på et specifikt felt. For eksempel, lad os antage, du har en kontaktliste i CSV-format med tre kolonner: ID, Navn og Email. For kun at bevare den første post for hver unik emailadresse (i det tredje felt), brug:

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

Derudover kan du udelade case-insensitive udeladelser med funktionen tolower().

Reformatér tekst ved at vælge specifikke kolonner

Rå data kommer ofte i en struktur, du ikke rigtig har brug for, og awk gør det nemt at omarrangere det til noget mere nyttigt. Du kan vælge specifikke kolonner, ændre deres rækkefølge eller endda kombinere dem til nye felter.

For eksempel, hvis du kun vil udskrive den anden og femte kolonne fra en fil, kan du bruge:

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

Hvis du vil ændre rækkefølgen af kolonner, kan du bytte $5 med $2.

Som standard adskiller awk outputtet med mellemrum, men du kan indsætte din egen separator, såsom et rør-symbol.

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

Når du arbejder med CSV-filer, er den første række ofte en header. Du kan springe den over med NR > 1 og omarrangere kolonnerne for at vise emailen efterfulgt af navnet.

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

Du kan også kombinere felter for at skabe nye, såsom at samle fornavn og efternavn til et fuldt navn, før du udskriver emailen.

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

Endelig, hvis du vil have outputtet til at se klarere ud, kan du tilføje din egen header før dataene ved at bruge en BEGIN-blok.

awk 'BEGIN {print "Navn,Email"} {print $1 "," $2}' data.txt

Disse enkle eksempler er nok til at begynde at reformere tekst til et layout, der bedre passer til dine behov.

Husk, awk excellerer i at behandle struktureret tekst, alt med konsistente mønstre eller feltdelinger. Jo mere regelmæssigt dit dataformat er, jo kraftigere bliver awk. Og når du kombinerer disse filtreringsteknikker med andre Linux-værktøjer gennem rør, skaber du utrolig effektive tekstbehandlingsarbejdsgange.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *

Go up