Nyheter i Android, Telefoner, Prylar Och Recensioner

Varje Linux-nörd behöver känna till Sed och Awk. Här är varför…

Två av de mest kriminellt underskattade Linux-verktygen är Sed och Awk. Även om de visserligen kan verka lite svårbegripliga, om du någonsin måste göra upprepade ändringar av stora bitar av kod eller text, eller om du någonsin måste analysera någon text, är Sed och Awk ovärderliga.

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

Vad är Sed?

Sed utvecklades 1971 på Bell Labs, av den legendariske datapionjären Lee E. McMahon.

Namnet står för stream editor, och det är ungefär vad det gör. Det låter dig redigera kroppar eller strömmar av text programmatiskt, genom ett kompakt och enkelt men ändå Turing-komplett programmeringsspråk.

Sättet det fungerar på är enkelt: det läser text rad för rad i en buffert. För varje rad kommer den att utföra de fördefinierade instruktionerna, där tillämpligt.

Till exempel, om någon skulle skriva ett Sed-manus som ersatte ordet “öl” med “läsk” och sedan skickade in en textfil som innehöll hela texten till “99 ölflaskor på väggen”, skulle det gå genom den filen rad för rad och skriv ut “99 flaskor läsk på väggen” och så vidare.

Det mest grundläggande Sed-manuset är ett Hello World. Här använder vi Unix Echo-verktyget, som bara matar ut strängar, för att skriva ut “Hello World”. Men vi skickar det här till Sed och säger åt det att ersätta “World” med “Dave”. Självförklarande saker.

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

Du kan också kombinera Sed-instruktioner till filer om du behöver göra lite mer komplicerad redigering. Inspirerad av den här roliga Reddit-tråden ska jag ta texterna till A-Ha’s Ta på mig, och ersätt varje instans av “I”, “Me” och “My”, med Greg.

Först ska jag lägga in texten till låten i en textfil som heter tom.txt. Sedan öppnar jag min föredragna textredigerare (min favorit är Vim, men Nano och Gedit är båda utmärkta val), och lägger till följande rader. Se till att filen du skapar slutar med .sed.

Du kanske märker att jag i exemplet ovan har upprepat mig själv (t.ex. s/me/Greg/ och s/Me/Greg/). Det beror på att vissa versioner av Sed, som den som levereras med Mac OS X, gör det inte stödja skiftlägesokänslig matchning. Som ett resultat måste vi skriva två Sed-instruktioner för varje ord, så att det känner igen den versaler och den utan versaler.

Relaterad  De 8 utmärkta alternativa skrivborden för Fedora och hur man installerar dem

Detta kommer inte att fungera perfekt, som om du har bytt ut varje instans av “I”, “Me” och “My” 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 köra dem med ett enda kommando.

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

cat tom.txt | sed -f greg.sed

Låt oss sakta ner och titta på vad detta gör. Örnögda läsare kommer att ha lagt märke till vi är inte använder Echo här. Vi använder Cat. Det beror på att medan Cat kommer att skriva ut hela innehållet i filen, kommer echo bara att skriva ut filnamnet. Du har också märkt att vi kör Sed med flaggan “-f”. Detta säger åt den att öppna skriptet som en fil.

Slutresultatet är detta.

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 kommer att ta de tidigare nämnda sångtexterna, men använd regex för att skriva ut varje rad som inte börja med “Ta”.

cat tom.txt | sed /^Take/d

Sed är förstås otroligt användbart. Men den är ännu kraftfullare när den kombineras med Awk.

Vad är Awk?

Awk, liksom Sed, är ett programmeringsspråk designat för att hantera stora texter. Men medan Sed används för att bearbeta och modifiera text, används Awk mest som ett verktyg för analys och rapportering.

Liksom Sed utvecklades Awk först på Bell Labs på 1970-talet. Dess namn kommer inte från programmet gör, utan snarare efternamnen på var och en av författarna – Alfred Aho, Peter Weinberger och Brian Kernaghan.

Relaterad  Hur länge håller termisk pasta?

Awk fungerar genom att läsa en textfil eller indataströ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 även om Sed och Awk kan ha liknande syften, är de två helt olika språk, med två helt olika designfilosofier. Awk påminner mer om vissa allmänna språk, som C, Python och Bash. Den har saker som funktioner och ett mer C-liknande förhållningssätt till saker som iteration och variabler (James Bruce förklarade hur iteration fungerar). Enkelt uttryckt känns det mer som ett programmeringsspråk.

Så, låt oss prova det. Med hjälp av texten till Take On Me kommer vi att skriva ut alla rader som är längre än 20 tecken.

awk ' length($0) > 80 ' tom.txt

 

Nästa exempel jag har skamlöst cribbed från den officiella Awk-dokumentationen. Men det är ett bra exempel på potentialen hos detta kraftfulla, men ändå 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 {

for (word in freq)

printf "%st%dn", word, freq[word]

}

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

awk -f WordCount.awk tom.txt

Coolt, eller hur? Du kommer förmodligen att märka att de inte är i någon sorts ordning. Du burk sortera resultaten med hjälp av sorteringsverktyget Unix. Men vi lämnar det en annan dag. Vi ska hålla det enkelt.

Att kombinera de två

Awk och Sed är båda otroligt kraftfulla när de kombineras. Du kan göra detta genom att använda Unix-rör. Det är “|” bitar mellan kommandon.

Låt oss prova det här: Vi kommer att lista alla rader i Take On Me som har mer än 20 tecken, med hjälp av Awk. Sedan ska vi ta bort alla rader som börjar med “Ta”. Tillsammans ser det ut så här:

awk 'length($0)>20' tom.txt | sed /^Take/d

Och producerar detta:

Relaterad  Nya trailers för Touken Ranbu Warriors som avslöjar handlingen och karaktären för Heshikiri Hasebe

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

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

Kraften i Sed och Awk

Det finns bara så mycket du kan förklara i en enda artikel. Men jag hoppas att jag har illustrerat hur omåttligt kraftfulla Sed och Awk är. Enkelt uttryckt är de ett kraftpaket för textbearbetning.

Så varför skulle du bry dig? Tja, förutom det faktum att du aldrig vet när du behöver göra förutsägbara, repetitiva ändringar i ett textdokument, är Sed och Awk bra för att analysera loggfiler. Detta är särskilt praktiskt när du försöker felsöka ett problem på din LAMP-server, eller tittar på dina åtkomstloggar för att se om din server har blivit hackad.

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

Om författaren

Matthew Hughes (383 artiklar publicerade)

Matthew Hughes är en mjukvaruutvecklare och författare från Liverpool, England. Han hittas sällan utan en kopp starkt svart kaffe i handen och fullkomligt avgudar sin Macbook Pro och sin kamera. Du kan läsa hans blogg på http://www.matthewhughes.co.uk och följa honom på twitter på @matthewhughes.

Mer från Matthew Hughes

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, free e-böcker och exklusiva erbjudanden!

Klicka här för att prenumerera

Table of Contents