Hver Linux Geek behøver at vide Sed og Awk. Her er hvorfor ...

To af de mest kriminelt undervurderede Linux-forsyningsvirksomheder er den ganske vist arcane Sed og Awk. Men hvad er de? Hvordan bruges de? Og hvordan gør de det lettere at behandle tekst?

To af de mest kriminelt undervurderede Linux-forsyningsvirksomheder er den ganske vist arcane Sed og Awk.  Men hvad er de?  Hvordan bruges de?  Og hvordan gør de det lettere at behandle tekst?
Reklame

To af de mest kriminelt undervurderede Linux-hjælpeprogrammer er Sed og Awk. Selv om de ganske vist kan virke lidt bane, hvis du nogensinde skal foretage gentagne ændringer i store stykker kode eller tekst, eller hvis du nogensinde skal analysere nogle tekst, er Sed og Awk uvurderlige.

Så hvad er de? Hvordan bruges de? Og hvordan gør de det lettere at behandle tekst, når de kombineres sammen?

Hvad er sed?

Sed blev udviklet i 1971 på Bell Labs, af legendariske computeren pioner Lee E. McMahon.

Navnet står for stream editor, og det er ret, hvad det gør. Det giver dig mulighed for at redigere organer eller strømme af tekst programmatisk, gennem et kompakt og simpelt, men samtidig Turing-komplet programmeringssprog.

Den måde, det virker på, er enkelt: det læser tekst, line-by-line i en buffer. For hver linje udfører den de foruddefinerede instruktioner, hvor det er relevant.

For eksempel, hvis nogen skulle skrive et Sed-skript, der erstattede ordet "øl" med "sodavand" og derefter bestod i en tekstfil, der indeholdt hele teksten til "99 flasker øl på væggen", ville det gå gennem den pågældende fil på linje for linje og udskrive "99 flasker soda på væggen", og så videre.

Det mest grundlæggende Sed-skript er en Hello World One. Her bruger vi Unix Echo-værktøjet, som kun udsender strenge, til at udskrive "Hello World". Men vi rør dette til Sed, og fortælle det at erstatte "World" med "Dave". Selvforklarende ting.

 ekko "Hello World" | sed s / world / Dave 

sedawk-dave

Du kan også kombinere Sed-instruktioner i filer, hvis du har brug for mere kompliceret redigering. Inspireret af denne hilariske Reddit-tråd, tager jeg teksterne til A-Ha's Take On Me, og erstatter hver forekomst af "jeg", "mig" og "min" med Greg.

Først vil jeg sætte teksterne til sangen i en tekstfil kaldet tom.txt . Så åbner jeg min foretrukne tekstredigerer (min favorit er Vim Top 7 grunde til at give Vim Text Editor en chance Top 7 grunde til at give Vim Text Editor en chance I mange år har jeg prøvet en tekst editor efter en anden.Du hedder det, jeg prøvede det.Jeg brugte hver enkelt af disse redaktører i over to måneder som min primære daglige redaktør. En eller anden måde, jeg ... Læs mere, men Nano nano vs vim: Terminal Tekstredaktører Sammenlignet med nano vs vim: Terminaltekstredigerere Sammenlignet Selvom Linux er blevet let nok til praktisk taget nogen at bruge uden at skulle bruge Terminal, er der nogle af os, der regelmæssigt bruger det eller er nysgerrige efter, hvordan man kan styre .. Læs mere og Gedit gedit: En af de mest funktionelle, fyldte almindelige tekstredigerere [Linux & Windows] gedit: En af de mest funktionelle fyldte tekstredigerere [Linux & Windows] Når du tænker på almindelige tekstredaktører, er den første ting Det der kan komme ind i dit hoved er Windows 'Notesblok-applikation. Det gør præcis hvad dets jobbeskrivelse siger - Almindelige funktioner for en almindelig tekst ... Læs mere er begge gode valg), og tilføj følgende linjer. Sørg for, at filen du opretter ender med .sed.

sed-greg-sed

Det kan du bemærke, at i eksemplet ovenfor har jeg gentaget mig selv (f.eks. S / me / Greg / og s / Me / Greg /). Det skyldes, at nogle versioner af Sed, som den, der skifter med Mac OS X, ikke understøtter uhensigtsmæssig matching. Som følge heraf skal vi skrive to Sed-instruktioner for hvert ord, så det anerkender den kapitaliserede og uncapitalized version.

Dette virker ikke perfekt, som om du har erstattet hver forekomst af "I", "Mig" og "Min" for hånd. Husk, vi bruger bare dette som en øvelse for at demonstrere, hvordan du kan gruppere Sed-instruktioner i et script og derefter udføre dem med en enkelt kommando.

Derefter skal vi påberåbe filen. For at gøre det kører vi denne kommando.

 cat tom.txt | sed-f greg.sed 

Lad os bremse og se på, hvad dette gør. Eagle-eyed-læsere har bemærket, at vi ikke bruger ekko her. Vi bruger kat. Det skyldes, at mens Cat vil udskrive hele indholdet af filen, vil ekko kun udskrive filnavnet. Du har også bemærket, at vi kører Sed med "-f" flag. Dette fortæller at åbne scriptet som en fil.

Slutresultatet er dette.

sed-greg-script

Det er også værd at bemærke, at Sed støtter regulære udtryk (REGEX). Disse giver dig mulighed for at definere mønstre i tekst ved hjælp af en særlig og kompliceret syntaks.

Her er et eksempel på, hvordan det kan fungere. Vi skal tage de ovennævnte sangtekster, men brug regex til at udskrive hver linje, der ikke starter med "Take".

 cat tom.txt | sed / ^ Tag / d 

sed-regex-tage

Sed er selvfølgelig utroligt nyttigt. Men det er endnu mere kraftfuldt, når det kombineres med Awk.

Hvad er AWK?

Awk, som Sed, er et programmeringssprog designet til at håndtere store tekstkroppe. Men mens Sed bruges til at behandle og ændre tekst, anvendes Awk for det meste som et redskab til analyse og rapportering .

Som Sed blev Awk først udviklet på Bell Labs i 1970'erne. Dens navn kommer ikke fra, hvad programmet gør, men snarere efternavnet for hver af forfatterne - Alfred Aho, Peter Weinberger og Brian Kernaghan.

Awk virker ved at læse en tekstfil eller input stream en linje ad gangen. Hver linje scannes for at se om den matcher et foruddefineret mønster. Hvis en kamp er fundet, udføres en handling.

Men mens Sed og Awk kan dele lignende formål, er de to helt forskellige sprog, med to helt forskellige designfilosofier. Awk ligner mere almindeligt sprog Hvordan man vælger et programmeringssprog for at lære i dag og få en god job om 2 år Hvordan man vælger et programmeringssprog for at lære i dag og få en god job om 2 år Det kan tage mange års arbejde at blive en virkelig god programmør; så er der en måde at vælge det rigtige sprog til at starte fra i dag for at blive ansat i morgen? Læs mere, som C, Python og Bash. Det har ting som funktioner og en mere C-lignende tilgang til ting som iteration og variabler (James Bruce forklarede hvordan iteration virker. Det absolutte grundlag for programmering for begyndere (del 2). Det absolutte grundlag for programmering for begyndere (del 2) Til dels 2 af vores absolutte begyndere guide til programmering, vil jeg dække det grundlæggende i funktioner, returværdier, sløjfer og conditionals. Sørg for at du har læst del 1, før du løser dette, hvor jeg forklarede ... Læs mere). Enkelt sagt føles det mere som et programmeringssprog.

Så lad os prøve det ud. Ved at bruge teksterne til Take On Me, vil vi udskrive alle linjer, der er længere end 20 tegn.

 awk 'længde ($ 0)> 80' tom.txt awk-længde

Det næste eksempel har jeg skamløst cribbed fra den officielle AWK dokumentation. Men det er et godt eksempel på potentialet i dette stærke, men lille sprog. Det er også en god demonstration af, hvordan ting som iteration og variabler virker i det. Opret først en fil kaldet "WordCount.awk", og tilføj følgende linjer.

 {for (i = 1; i <= NF; i ++) freq [$ i] ++} 
 END {for (ord i freq) printf "% s \ t% d \ n", ord, freq [ord]} 

Gem det, og kør det med følgende kommando.

 awk -f WordCount.awk tom.txt 

awk-WORDCOUNT
Cool, ikke? Du vil nok bemærke, at de ikke er i nogen form for ordre. Du kan sortere resultaterne ved hjælp af Unix-sorteringsværktøjet. Men vi forlader det for en anden dag. Vi skal holde det enkelt.

Kombinerer de to

Awk og Sed er begge utrolig kraftfulde, når de kombineres. Det kan du gøre ved at bruge Unix-rør. Disse er "|" bits mellem kommandoer.

Lad os prøve dette: Vi skal liste alle linjerne i Take On Me, der har mere end 20 tegn, ved hjælp af Awk. Så skal vi strippe alle de linjer, der begynder med "Take" . Sammen ser det hele ud:

 awk 'længde ($ 0)> 20' tom.txt | sed / ^ Tag / d 

Og producerer dette:

awk-længde-sed

Lad os nu vende det rundt. Vi skal begynde med at fjerne alle de linjer, der starter med Take, og rør dem derefter til Awk, hvor vi tæller hvor mange gange hvert ord vises. Det ser lidt ud som dette:

 cat tom.txt | sed / ^ Tag / d | awk -f WordCount.awk 

awk-WORDCOUNT-sed

The Power of Sed og Awk

Der er kun så meget, du kan forklare i en enkelt artikel. Men jeg håber, jeg har illustreret, hvordan umådeligt stærk Sed og Awk er. Enkelt sagt er de et tekstbehandlings kraftværk.

Så hvorfor skal du passe? Tja, foruden det faktum, at du aldrig ved, når du skal gøre forudsigelige, gentagne ændringer i et tekstdokument, er Sed og Awk gode til at analysere logfiler. Dette er især praktisk, når du forsøger at fejle et problem i din LAMP-server. Tilmeldt til SSH-only Web Hosting? Vær ikke bekymret - nemt installer enhver websoftware, der er signeret til SSH-only webhosting? Vær ikke bekymret - nemt installer en hvilken som helst websoftware. Kender ikke den første ting ved at operere Linux via dens kraftfulde kommandolinje? Bekymre ikke mere. Læs mere, eller kig på dine logfiler for at se, om din server er blevet hacket.

Har du fundet en interessant brug for Sed og Awk? Er der andre Linux-hjælpeprogrammer, du føler dig undervurderet? Lad mig vide i kommentarerne nedenfor, og vi vil chatte.

In this article