Annonse
To av de mest kriminelt undervurderte Linux-verktøyene er Sed og Awk. Selv om de riktignok kan virke litt kranglete, hvis du noen gang må gjøre repeterende endringer i store koder eller tekststykker, eller hvis du noen gang må analysere tekst, er Sed og Awk uvurderlige.
Så hva er de? Hvordan brukes de? Og hvordan, når de kombineres sammen, gjør de det lettere å behandle tekst?
Hva er Sed?
sed ble utviklet i 1971 kl Bell Labs, av legendariske datapionerer Lee E. McMahon.
Navnet står for stream editor, og det er ganske sånn det gjør. Det lar deg redigere organer eller strømmer av tekst programma, gjennom et kompakt og enkelt, men likevel Turing-komplett programmeringsspråk.
Måten det fungerer på er enkelt: det leser tekst, linje for linje i en buffer. For hver linje vil den utføre de forhåndsdefinerte instruksjonene der dette er aktuelt.
For eksempel, hvis noen skulle skrive et Sed-skript som erstattet ordet "øl" med "brus", og deretter passert i en tekstfil som inneholdt hele tekster til "99 flasker øl på veggen", den ville gå gjennom filen på linje for linje, og trykke ut "99 flasker brus på veggen", og så på.
Det mest grunnleggende Sed-manuset er en Hello World. Her bruker vi Unix Echo-verktøyet, som bare gir strenger, for å skrive ut "Hello World". Men vi rører dette til Sed, og forteller det å erstatte “World” med “Dave”. Selvforklarende ting.
ekko "Hello World" | sed s / verden / Dave
Du kan også kombinere Sed-instruksjoner til filer, hvis du trenger å gjøre noe mer komplisert redigering. Inspirert av denne morsomme Reddit-tråden, Jeg skal ta tekstene til A-Ha's Ta på meg, og erstatt hver forekomst av “Jeg”, “Meg” og “Min”, med Greg.
Først legger jeg tekstene til sangen i en tekstfil som heter tom.txt. Så åpner jeg opp min foretrukne tekstredigerer (min favoritten er Vim De 7 viktigste grunnene til å gi Vim-tekstredigereren en sjanseI årevis har jeg prøvd den ene tekstredigereren etter den andre. Du heter det, jeg prøvde det. Jeg brukte hver og en av disse redaktørene i over to måneder som min primære daglige redaktør. På en eller annen måte, jeg ... Les mer , men nano nano vs. vim: Terminal Text Editors SammenlignetSelv om Linux har blitt lett nok til at praktisk talt alle kan bruke uten noen gang å måtte bruke terminalen, er det noen av oss som regelmessig bruker den eller er nysgjerrige på hvordan man kan kontrollere ... Les mer og gedit gedit: En av de mest funksjonsfylte vanlige tekstredigererne [Linux og Windows]Når du tenker på ren tekstredigerere, er det første som kan komme inn i hodet på Windows 'Notisblokk-applikasjon. Den gjør akkurat som det står i stillingsbeskrivelsen - vanlige funksjoner for en ren tekst ... Les mer er begge utmerkede valg), og legg til følgende linjer. Forsikre deg om at filen du oppretter slutter med .sed.
Du vil kanskje legge merke til at i eksemplet over har jeg gjentatt meg selv (f.eks. S / meg / Greg / og s / Me / Greg /). Det er fordi noen versjoner av Sed, som den som leveres med Mac OS X, gjør det ikke støtte saksensensitiv matching. Som et resultat, må vi skrive en to Sed-instruksjoner for hvert ord, slik at det anerkjenner den store og ukapitaliserte versjonen.
Dette vil ikke fungere perfekt, som om du har byttet ut hver forekomst av "jeg", "meg" og "min" for hånd. Husk at vi bare bruker dette som en øvelse for å demonstrere hvordan du kan gruppere Sed-instruksjoner i ett skript, og deretter utføre dem med en enkelt kommando.
Deretter må vi påkalle filen. For å gjøre det kjører vi denne kommandoen.
katt tom.txt | sed -f greg.sed
La oss sakte ned og se på hva dette gjør. Eagle-eyed lesere vil ha lagt merke til det vi er ikke bruker Echo her. Vi bruker Cat. Det skyldes at mens Cat vil skrive ut hele innholdet i filen, vil ekko bare skrive ut filnavnet. Du har også lagt merke til at vi kjører Sed med "-f" -flagget. Dette forteller det å åpne skriptet som en fil.
Sluttresultatet er dette.
Det er også verdt å merke seg at Sed støtter vanlige uttrykk (REGEX). Disse lar deg definere mønstre i tekst ved hjelp av en spesiell og komplisert syntaks.
Her er et eksempel på hvordan det kan fungere. Vi kommer til å ta de nevnte sangtekstene, men bruk regex for å skrive ut hver linje ikke begynn med "Ta".
katt tom.txt | sed / ^ Ta / d
Sed er selvfølgelig utrolig nyttig. Men det er enda kraftigere når det kombineres med Awk.
Hva er Awk?
awk, som Sed, er et programmeringsspråk designet for å håndtere store tekstlegemer. Men mens Sed brukes til å behandle og endre tekst, brukes Awk stort sett som et verktøy for analyse og rapportering.
I likhet med Sed ble Awk først utviklet på Bell Labs på 1970-tallet. Navnet kommer ikke fra det programmet har gjør, men snarere etternavn til hver av forfatterne - Alfred Aho, Peter Weinberger og Brian Kernaghan.
Awk fungerer ved å lese en tekstfil eller inndatastrøm en linje om gangen. Hver linje skannes for å se om den samsvarer med et forhåndsdefinert mønster. Hvis en kamp blir funnet, utføres en handling.
Men mens Sed og Awk kan dele lignende formål, er de to helt forskjellige språk, med to helt forskjellige designfilosofier. Awk ligner mer på noen allmenne språk Hvordan velge et programmeringsspråk for å lære i dag og få en god jobb om to årDet kan ta mange års dedikert arbeid å bli en virkelig god programmerer; så er det en måte å velge riktig språk å starte fra i dag, for å bli ansatt i morgen? Les mer , som C, Python og Bash. Den har ting som funksjoner, og en mer C-lignende tilnærming til ting som iterasjon og variabler (James Bruce forklart hvordan iterasjon fungerer De absolutte grunnleggende programmene for nybegynnere (del 2)I del 2 av vår absolutte nybegynnerveiledning for programmering vil jeg dekke det grunnleggende om funksjoner, returverdier, løkker og kondisjoner. Forsikre deg om at du har lest del 1 før du takler dette, der jeg forklarte ... Les mer ). Enkelt sagt føles det mer som et programmeringsspråk.
Så la oss prøve det. Ved å bruke tekstene til Take On Me, skal vi skrive ut alle linjene som er lengre enn 20 tegn.
awk 'lengde ($ 0)> 80' tom.txt
Det neste eksemplet har jeg skamløst krybbet fra den offisielle Awk-dokumentasjonen. Men det er et flott eksempel på potensialet til dette kraftige, men likevel bittesmå språket. Det er også en flott demonstrasjon av hvordan ting som iterasjon og variabler fungerer i det. Lag først en fil som heter “WordCount.awk”, og legg til følgende linjer.
{for (i = 1; i <= NF; i ++) freq [$ i] ++ }
SLUTT {for (ord i freq) printf "% s \ t% d \ n", word, freq [word] }
Lagre den, og kjør den deretter med følgende kommando.
awk -f WordCount.awk tom.txt
Kult, ikke sant? Du vil sannsynligvis legge merke til at de ikke er i noen form for rekkefølge. Du kan sortere resultatene ved å bruke sorteringsverktøyet Unix. Men det lar vi være igjen. Vi kommer til å holde det enkelt.
Kombinere de to
Awk og Sed er begge utrolig kraftige når de kombineres. Du kan gjøre dette ved å bruke Unix-rør. De er "|" biter mellom kommandoer.
La oss prøve dette: Vi skal liste opp alle linjene i Take On Me som har mer enn 20 tegn, ved å bruke Awk. Deretter skal vi stripe alle linjene som begynner med "Ta". Sammen ser det slik ut:
awk 'lengde ($ 0)> 20' tom.txt | sed / ^ Ta / d
Og produserer dette:
La oss snu det rundt. Vi kommer til å begynne med å fjerne alle linjene som begynner med Take, og så rør dem til Awk, hvor vi teller hvor mange ganger hvert ord vises. Det ser litt slik ut:
katt tom.txt | sed / ^ Ta / d | awk -f WordCount.awk
Kraften fra Sed og Awk
Det er bare så mye du kan forklare i en enkelt artikkel. Men jeg håper jeg har illustrert hvor ufattelig kraftig Sed og Awk er. Enkelt sagt, de er et tekstbehandlingskraftverk.
Så hvorfor skal du bry deg? Vel, foruten det at du aldri vet når du trenger å gjøre forutsigbare, repeterende endringer i et tekstdokument, er Sed og Awk gode for å analysere loggfiler. Dette er spesielt nyttig når du prøver å feilsøke et problem i LAMP-serveren din Registrert deg for SSH-bare webhotell? Ikke bekymre deg - installer enkelt webprogramvare enkeltVet du ikke det første med å betjene Linux gjennom den kraftige kommandolinjen? Ikke bekymre deg mer. Les mer , eller se på tilgangsloggene dine for å se om serveren din har blitt hacket.
Har du funnet en interessant bruk for Sed og Awk? Er det andre Linux-verktøy du føler at du ikke blir satt pris på? Gi meg beskjed i kommentarene nedenfor, så tar vi en prat.
Matthew Hughes er programvareutvikler og skribent fra Liverpool, England. Han blir sjelden funnet uten en kopp sterk svart kaffe i hånden og elsker absolutt Macbook Pro og kameraet hans. Du kan lese bloggen hans på http://www.matthewhughes.co.uk og følg ham på twitter på @matthewhughes.