Varje Linux Geek behöver veta Sed och Awk. Här är varför ...

Två av de mest brottsligt underförstådda Linux-verktygen är den faktum arcane Sed och Awk. Men vad är de? Hur används de? Och hur gör de det enklare att bearbeta text?

Två av de mest brottsligt underförstådda Linux-verktygen är den faktum arcane Sed och Awk.  Men vad är de?  Hur används de?  Och hur gör de det enklare att bearbeta text?
Annons

Två av de mest brottsligt undervärderade Linux-verktygen är Sed och Awk. Även om de visserligen kan verka lite arka, om du någonsin måste göra repetitiva ändringar till stora bitar av kod eller text, eller om du någonsin måste analysera lite text är Sed och Awk ovärderliga.

Så, vad är de? Hur används de? Och hur kan de, när de kombineras, göra det enklare att bearbeta text?

Vad är sed?

Sed utvecklades 1971 på Bell Labs, av legendarisk datapionjär Lee E. McMahon.

Namnet står för streamredigerare, och det är ganska bra vad det gör. Det låter dig redigera kroppar eller flöden av text programmerat, genom ett kompakt och enkelt, men ändå Turing-komplett programmeringsspråk.

Sättet fungerar enkelt: det läser text, linje för rad i buffert. För varje rad utförs de fördefinierade instruktionerna, där det är tillämpligt.

Om någon till exempel skulle skriva ett Sed-skript som ersatte ordet "öl" med "läsk" och sedan skickades i en textfil som innehöll hela texten till "99 flaskor öl på väggen" skulle det gå genom den filen på linjebasis, och skriv ut "99 flaskor soda på väggen", och så vidare.

Det mest grundläggande Sed-skriptet är en Hello World One. Här använder vi Unix Echo-verktyget, som bara matar ut strängar, för att skriva ut "Hello World". Men vi rör det här till Sed och berättar att den ska ersätta "World" med "Dave". Självförklarande saker.

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

sedawk-dave

Du kan också kombinera Sed-instruktioner i filer, om du behöver göra mer komplicerad redigering. Inspirerad av den här hilariska Reddit-tråden ska jag ta texterna till A-Ha's Take On Me och ersätta varje instans av "I", "Me" och "My", med Greg.

Först lägger jag texterna till låten i en textfil med namnet tom.txt . Då öppnar jag min föredragna textredigerare (min favorit är Vim Topp 7 skälen att ge Vim Text Editor en chans Topp 7 skäl att ge Vim Text Editor en chans I åratal har jag provat en textredigerare efter en annan. Du heter det, jag försökte det. Jag använde var och en av dessa redaktörer i över två månader som min primära dagliga redaktör. På något sätt ... Läs mer, men Nano nano vs vim: Terminal Textredigerare Jämfört med nano vs vim: Terminaltextredigerare Jämfört med att Linux har blivit tillräckligt lätthet för praktiskt taget alla att använda utan att behöva använda Terminal, finns det några av oss som regelbundet använder det eller är nyfiken på hur man kan styra .. . Läs mer och Gedit gedit: En av de mest funktionella fyllda textredigerarna [Linux & Windows] gedit: En av de mest funktionella fyllda textredigerarna [Linux & Windows] När du tänker på vanliga textredigerare är det första Det som kan dyka upp i ditt huvud är Windows Notepad-applikation. Det gör exakt vad jobbet beskriver - Vanliga funktioner för en vanlig text ... Läs mer är båda bra val) och lägg till följande rader. Kontrollera att filen du skapar slutar med .sed.

sed-greg-sed

Du kanske märker det i exemplet ovan har jag upprepat mig själv (t.ex. s / me / Greg / och s / Me / Greg /). Det beror på att vissa versioner av Sed, som den som levererar med Mac OS X, inte stöder fallinsensitiv matchning. Som ett resultat måste vi skriva två Sed-instruktioner för varje ord, så det erkänner den kapitaliserade och uncapitalized versionen.

Det här fungerar inte perfekt, som om du har ersatt varje förekomst av "I", "Mig" och "Min" för hand. Kom ihåg att vi bara använder det här som en övning för att visa hur du kan gruppera Sed-instruktioner i ett skript och sedan utföra dem med ett enda kommando.

Då måste vi anropa filen. För att göra det kör vi det här kommandot.

 katt tom.txt | sed-f greg.sed 

Låt oss sakta ner och titta på vad det här gör. Eagle-eyed-läsare har märkt att vi inte använder Echo här. Vi använder Cat. Det beror på att när Cat kommer att skriva ut hela innehållet i filen, kommer echo endast skriva ut filnamnet. Du har också märkt att vi kör Sed med "-f" -flaggan. Detta berättar att man öppnar manuset som en fil.

Slutresultatet är detta.

sed-greg-script

Det är också värt att notera att Sed stöder reguljära uttryck (REGEX). Dessa låter dig definiera mönster i text, med hjälp av en speciell och komplicerad syntax.

Här är ett exempel på hur det kan fungera. Vi ska ta ovanstående sångtext, men använd regex för att skriva ut varje rad som inte börjar med "Ta".

 katt tom.txt | sed / ^ Ta / d 

sed-regex-take

Sed är naturligtvis otroligt användbar. Men det är ännu mer kraftfullt i kombination med Awk.

Vad är Awk?

Awk, som Sed, är ett programmeringsspråk som är utformat för att hantera stora textkroppar. Men medan Sed används för att bearbeta och ändra text används Awk mest som ett verktyg för analys och rapportering .

Som Sed blev Awk först utvecklad på Bell Labs på 1970-talet. Dess namn kommer inte från vad programmet gör, utan snarare efternas efternamn - Alfred Aho, Peter Weinberger och Brian Kernaghan.

Awk fungerar genom att läsa en textfil eller ingångsström en rad i taget. Varje rad skannas för att se om den matchar ett fördefinierat mönster. Om en matchning hittas utförs en åtgärd.

Men medan Sed och Awk kan dela liknande syften är de två helt olika språk, med två helt olika designfilosofier. Awk ligner mer på vissa språk med allmänt ändamål Hur man väljer ett programmeringsspråk för att lära sig idag och få ett bra jobb på 2 år Hur man väljer ett programmeringsspråk för att lära sig idag och få ett bra jobb på 2 år Det kan ta många års arbete med att bli en riktigt bra programmerare; så finns det ett sätt att välja rätt språk att börja från idag, för att bli anställd imorgon? Läs mer, som C, Python och Bash. Det har saker som funktioner och en mer C-liknande inställning till saker som iteration och variabler (James Bruce förklarade hur iteration fungerar. Den absoluta grunden för programmering för nybörjare (del 2). Den absoluta grunden för programmering för nybörjare (del 2) 2 av vår absoluta nybörjare guide till programmering, kommer jag att täcka grunderna för funktioner, returvärden, loopar och conditionals. Se till att du har läst del 1 innan du klarar det här, där jag förklarade ... Läs mer). Enkelt, det känns mer som ett programmeringsspråk.

Så, låt oss prova det. Genom att använda texterna till Take On Me kommer vi att skriva ut alla rader som är längre än 20 tecken.

 awk 'längd ($ 0)> 80' tom.txt awk-längd

Nästa exempel har jag skamlöst cribbed från den officiella Awk dokumentationen. Men det är ett bra exempel på potentialen i detta kraftfulla, men lilla språk. Det är också en bra demonstration av hur saker som iteration och variabler fungerar i den. Skapa först en fil som heter "WordCount.awk" och lägg till följande rader.

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

Spara det och kör det med följande kommando.

 awk -f WordCount.awk tom.txt 

awk-wordcount
Cool, eller hur? Du märker nog att de inte är i någon form av order. Du kan sortera resultaten med hjälp av Unix-sorteringsverktyget. Men vi lämnar det för en annan dag. Vi ska hålla det enkelt.

Kombinera de två

Awk och Sed är båda otroligt kraftfulla när de kombineras. Du kan göra detta med hjälp av Unix-rör. Dessa är "|" bitarna mellan kommandon.

Låt oss försöka detta: Vi ska lista alla rader i Take On Me som har mer än 20 tecken, med Awk. Sedan ska vi ta bort alla linjer som börjar med "Ta" . Tillsammans ser allt så här ut:

 awk 'längd ($ 0)> 20' tom.txt | sed / ^ Ta / d 

Och producerar detta:

awk-längd-sed

Låt oss nu vända det. Vi börjar med att ta bort alla linjer som börjar med Ta och rör dem sedan till Awk, där vi räknar hur många gånger varje ord visas. Det ser lite ut så här:

 katt tom.txt | sed / ^ Ta / d | awk -f WordCount.awk 

awk-wordcount-sed

The Power of Sed och Awk

Det finns bara så mycket du kan förklara i en enda artikel. Men jag hoppas att jag har illustrerat hur oerhört kraftfull Sed och Awk är. Enkelt sagt, de är ett textbehandlingsaggregat.

Så varför ska du bry dig? Tja, förutom att du aldrig vet när du behöver göra förutsägbara, repeterande ändringar i ett textdokument, är Sed och Awk bra för att analysera loggfiler. Det här är särskilt användbart när du försöker felsöka ett problem i din LAMP-server. Registrerad för SSH-bara webbhotell? Oroa dig inte - Installera enkelt vilken webbprogramvara som registrerats för SSH-bara webbhotell? Oroa dig inte - enkelt installera någon webbprogramvara Vet inte det första med operativsystemet Linux genom sin kraftfulla kommandorad? Oroa dig inte mer. Läs mer, eller titta på dina accessloggar för att se om din server har hackats.

Har du hittat en intressant användning för Sed och Awk? Finns det några andra Linux-verktyg du tycker är undervärderade? Låt mig veta i kommentarerna nedan, och vi chattar.

In this article