Annons

Två av de mest kriminellt undervärderade Linuxverktygen är Sed och Awk. Även om de visserligen kan verka lite arka, om du någonsin måste göra repetitiva ändringar av 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, när de kombineras tillsammans, gör de det lättare att bearbeta text?

Vad är Sed?

sed utvecklades 1971 kl Bell Labs, av den legendariska datorpionjären Lee E. McMahon.

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

Så det fungerar ä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, i förekommande fall.

Till exempel, om någon skulle skriva ett Sed-skript som ersatte ordet "öl" med "läsk" och sedan skickade in en textfil som innehöll hela texter till "99 flaskor öl på väggen", det skulle gå igenom filen på rad för rad och skriva ut "99 flaskor soda på väggen", och så på.

instagram viewer

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

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 denna lustiga Reddit tråd, Jag kommer att ta texterna till A-Ha's Ta på migoch ersätt varje instans av "Jag", "Jag" och "Min" med Greg.

Först lägger jag texterna till låten i en textfil som heter tom.txt. Sedan öppnar jag upp min föredragna textredigerare (min favorit är Vim De 7 främsta orsakerna till att ge Vim Text Editor en chansI flera år har jag provat den ena textredigeraren efter den andra. Namnlösa, 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 Text Editors JämförtÄven om Linux har blivit lätt för praktiskt taget vem som helst att använda utan att någonsin behöva använda terminalen, finns det några av oss som regelbundet använder den eller är nyfiken på hur man kan kontrollera ... Läs mer och gedit gedit: En av de mest funktionsfyllda vanliga textredigerarna [Linux & Windows]När du tänker på vanliga textredigerare, är det första som kan komma in i ditt huvud Windows Notepad-applikation. Det gör exakt vad det står i arbetsbeskrivningen - vanliga funktioner för en vanlig text ... Läs mer är båda utmärkta val) och lägg till följande rader. Se till att filen du skapar slutar med .sed.

sed-greg-sed

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

Det här fungerar inte perfekt, som om du har bytt ut varje instans av "Jag", "Jag" och "Min" för hand. Kom ihåg att vi bara använder detta 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 åberopa filen. För att göra det kör vi detta kommando.

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 kommer att ha märkt att vi är inte använder Echo här. Vi använder Cat. Det beror på att Cat kommer att skriva ut hela filens innehåll, men eko kommer bara att skriva ut filnamnet. Du har också lagt märke till att vi kör Sed med "-f" -flaggan. Detta säger att det öppnar skriptet 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 kommer att ta de nämnda sångtexterna, men använder regex för att skriva ut varje rad som inte börja med "Ta".

katt tom.txt | sed / ^ Ta / d
sed-regex-take

Sed är naturligtvis oerhört användbart. Men det är ännu kraftfullare när det kombineras med Awk.

Vad är Awk?

awk, liksom 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 mestadels som ett verktyg för analys och rapportering.

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

Awk fungerar genom att läsa en textfil eller inmatningsströ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 kanske delar liknande syften, är de två helt olika språk, med två helt olika designfilosofier. Awk liknar mer en del allmänna språk Hur man väljer ett programmeringsspråk för att lära sig idag och få ett bra jobb på två årDet kan ta år av dedikerat arbete för att bli en riktigt bra programmerare; så finns det ett sätt att välja rätt språk att börja med idag, för att bli anställd i morgon? 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 De absoluta grunderna i programmering för nybörjare (del 2)I del 2 av vår absoluta nybörjarguide för programmering kommer jag att täcka grunderna i funktioner, returvärden, slingor och balsam. Se till att du har läst del 1 innan du tacklar det här, där jag förklarade ... Läs mer ). Enkelt uttryckt känns det mer som ett programmeringsspråk.

Så låt oss prova det. Med 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 ändå små språk. Det är också en fantastisk 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.

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

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

awk -f WordCount.awk tom.txt

awk-wordcount
Cool, eller hur? Du kommer antagligen att märka att de inte är i någon form av ordning. Du kan sortera resultaten med hjälp av Unix sorteringsverktyg. Men vi lämnar det till en annan dag. Vi kommer att hålla det enkelt.

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. De är "|" bitar mellan kommandon.

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

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

Och producerar detta:

awk-längd-sed

Låt oss vända det runt. Vi kommer att börja med att ta bort alla rader som börjar med Take och sedan leda dem 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

Kraften i Sed och Awk

Det är 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 uttryckt, de är en kraftbearbetning för textbearbetning.

Så varför ska 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 utmärkta för att analysera loggfiler. Detta är särskilt praktiskt när du försöker felsöka ett problem på din LAMP-server Har du registrerat dig för webbhotell som bara är SSH? Oroa dig inte - installera enkelt webbprogramvaraVet du inte det första med att driva Linux via sin kraftfulla kommandorad? Oroa dig inte mer. Läs mer , eller titta på dina åtkomstloggar 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 som du känner att du inte uppskattar? Låt mig veta i kommentarerna nedan, så ska vi chatta.

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