Elke Linux-nerd moet Sed and Awk kennen. Dit is waarom…

Twee van de meest crimineel ondergewaardeerde Linux-hulpprogramma's zijn de weliswaar geheimzinnige Sed en Awk. Maar wat zijn ze? Hoe worden ze gebruikt? En hoe maken ze het gemakkelijker om tekst te verwerken?

Twee van de meest crimineel ondergewaardeerde Linux-hulpprogramma's zijn de weliswaar geheimzinnige Sed en Awk.  Maar wat zijn ze?  Hoe worden ze gebruikt?  En hoe maken ze het gemakkelijker om tekst te verwerken?
Advertentie

Twee van de meest crimineel ondergewaardeerde Linux-hulpprogramma's zijn Sed and Awk. Hoewel ze weliswaar een beetje mysterieus lijken, als je ooit herhaalde wijzigingen in grote stukjes code of tekst moet aanbrengen, of als je ooit wat tekst moet analyseren, zijn Sed en Awk van onschatbare waarde.

Wat zijn ze eigenlijk? Hoe worden ze gebruikt? En hoe zorgen ze er samen voor dat het gemakkelijker wordt om tekst te verwerken?

Wat is Sed?

Sed werd in 1971 ontwikkeld door Bell Labs, door de legendarische computerpionier Lee E. McMahon.

De naam staat voor stream-editor, en dat is nogal wat het doet. Het stelt je in staat om lichamen of tekststromen programmatisch te bewerken, via een compacte en eenvoudige, maar toch Turing-complete programmeertaal.

De manier waarop het werkt, is eenvoudig: het leest tekst, regel voor regel in een buffer. Voor elke regel voert het de vooraf gedefinieerde instructies uit, indien van toepassing.

Als iemand bijvoorbeeld een Sed-script zou schrijven dat het woord 'bier' verving door 'frisdrank', en vervolgens een tekstbestand met de volledige tekst door gaf aan '99 flessen bier aan de muur', zou het gaan door dat bestand op regel voor regel, en print "99 flessen frisdrank aan de muur", enzovoort.

Het meest eenvoudige Sed-script is een Hello World-scenario. Hier gebruiken we het Unix Echo-hulpprogramma, dat alleen maar tekenreeksen uitvoert, om 'Hallo wereld' af te drukken. Maar we geven dit door aan Sed en zeggen dat het 'Wereld' moet vervangen door 'Dave'. Spreekt voor zich.

 echo "Hallo wereld" | sed s / world / Dave 

sedawk-dave

Je kunt ook Sed-instructies combineren in bestanden, als je wat meer gecompliceerde bewerkingen moet doen. Geïnspireerd door deze hilarische Reddit-thread, ga ik de songtekst meenemen naar A-Ha's Take On Me en vervang ik elk exemplaar van "I", "Me" en "My" door Greg.

Eerst plaats ik de tekst van het nummer in een tekstbestand met de naam tom.txt . Daarna zal ik mijn favoriete teksteditor openen (mijn favoriet is Vim The Top 7 Redenen om The Vim Text Editor een kans te geven De Top 7 Redenen om The Vim Text Editor een kans te geven Jarenlang heb ik een teksteditor geprobeerd een andere, noem maar op, ik heb het geprobeerd.Ik gebruikte elke editors al meer dan twee maanden als mijn primaire dagelijkse editor.Ik heb op de een of andere manier ... Lees meer, maar Nano nano vs. vim: Terminal Tekstverwerkers vergeleken met nano vs. vim: terminale tekstverwerkers vergeleken Hoewel Linux zo gemakkelijk is geworden dat praktisch iedereen het kan gebruiken zonder de Terminal ooit te hoeven gebruiken, zijn er sommigen van ons die het regelmatig gebruiken of nieuwsgierig zijn naar hoe iemand het kan besturen .. Lees meer en Gedit gedit: een van de meest gevulde teksteditors [Linux & Windows] gedit: een van de meest gevulde teksteditors [Linux & Windows] Als je denkt aan teksteditors, is het eerste dat kan in je opkroppen is Windows 'Notepad-applicatie. Het doet precies wat de functiebeschrijving aangeeft - duidelijke functies voor een platte tekst ... Lees meer zijn beide uitstekende keuzes) en voeg de volgende regels toe. Zorg ervoor dat het bestand dat u maakt eindigt met .sed.

sed-greg-sed

Je merkt misschien dat ik in het bovenstaande voorbeeld mezelf herhaalde (bijv. S / me / Greg / en s / Me / Greg /). Dat komt omdat sommige versies van Sed, zoals degene die wordt geleverd met Mac OS X, geen ondersteuning bieden voor niet -hoofdlettergevoelige overeenkomsten. Dientengevolge moeten we een twee Sed-instructies voor elk woord schrijven, dus het herkent de geactiveerde en niet-gekapitaliseerde versie.

Dit werkt niet perfect, alsof je elke instantie van "I", "Ik" en "Mijn" handmatig hebt vervangen. Vergeet niet dat we dit alleen gebruiken als een oefening om te demonstreren hoe je Sed-instructies in één script kunt groeperen en ze vervolgens met één opdracht kunt uitvoeren.

Vervolgens moeten we het bestand aanroepen. Om dat te doen, voeren we dit commando uit.

 cat tom.txt | sed -f greg.sed 

Laten we het rustig aan doen en kijken naar wat dit doet. Ogen van adelaars zullen hebben gemerkt dat we Echo hier niet gebruiken. We gebruiken Cat. Dat komt omdat terwijl Cat de volledige inhoud van het bestand zal afdrukken, echo alleen de bestandsnaam zal afdrukken. Je hebt ook gemerkt dat we Sed draaien met de vlag "-f". Dit vertelt het om het script als een bestand te openen.

Het eindresultaat is dit.

sed-greg-script

Het is ook vermeldenswaard dat Sed regulale expressies (REGEX) ondersteunt. Hiermee kunt u patronen in tekst definiëren, met behulp van een speciale en gecompliceerde syntaxis.

Hier is een voorbeeld van hoe dat zou kunnen werken. We gaan de bovengenoemde songtekst gebruiken, maar gebruiken regex om elke regel af te drukken die niet begint met "Take".

 cat tom.txt | sed / ^ Take / d 

sed-regex-take

Sed is natuurlijk ongelooflijk handig. Maar het is nog krachtiger in combinatie met Awk.

Wat is Awk?

Awk, zoals Sed, is een programmeertaal die is ontworpen voor het verwerken van grote hoeveelheden tekst. Maar terwijl Sed wordt gebruikt voor het verwerken en wijzigen van tekst, wordt Awk vooral gebruikt als hulpmiddel voor analyse en rapportage .

Net als Sed werd Awk voor het eerst ontwikkeld in Bell Labs in de jaren 1970. De naam komt niet van wat het programma doet, maar eerder de achternamen van elk van de auteurs: Alfred Aho, Peter Weinberger en Brian Kernaghan.

Awk werkt door een tekstbestand of invoerstroom regel voor regel te lezen. Elke regel wordt gescand om te zien of deze overeenkomt met een vooraf gedefinieerd patroon. Als een overeenkomst wordt gevonden, wordt een actie uitgevoerd.

Maar hoewel Sed en Awk soortgelijke doelen kunnen delen, zijn het twee totaal verschillende talen, met twee totaal verschillende ontwerpfilosofieën. Awk lijkt meer op een aantal algemene doeltalen. Hoe kies ik een programmeertaal om vandaag te leren en een goede baan te krijgen binnen 2 jaar Hoe kies ik een programmeertaal om vandaag te leren en een goede baan te krijgen? Binnen 2 jaar kan het jaren van toegewijd werk kosten. een echt goede programmeur worden; Dus is er een manier om de juiste taal te kiezen om vanaf vandaag te beginnen, om morgen aangenomen te worden? Meer lezen, zoals C, Python en Bash. Het heeft dingen als functies, en een meer C-achtige benadering van zaken als iteratie en variabelen (James Bruce legde uit hoe iteratie werkt De absolute grondbeginselen van programmeren voor beginners (deel 2) De absolute basisprincipes van programmeren voor beginners (deel 2) Gedeeltelijk 2 van onze absolute beginnershandleiding voor programmeren, ik zal de basisbeginselen van functies bespreken, waarden, loops en conditionals retourneren.Zorg ervoor dat je deel 1 gelezen hebt voordat je dit aanpakt, waar ik de ... Lees meer uitlegde). Simpel gezegd, het voelt meer als een programmeertaal.

Laten we het dus eens proberen. Met de tekst van Take On Me gaan we alle regels die langer zijn dan 20 tekens afdrukken.

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

Het volgende voorbeeld heb ik schaamteloos geknoeid uit de officiële Awk-documentatie. Maar het is een goed voorbeeld van het potentieel van deze krachtige, maar toch kleine taal. Het is ook een geweldige demonstratie van hoe zaken als iteratie en variabelen erin werken. Maak eerst een bestand met de naam "WordCount.awk" en voeg de volgende regels toe.

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

Sla het op en voer het vervolgens uit met de volgende opdracht.

 awk -f WordCount.awk tom.txt 

awk-wordcount
Cool toch? U zult waarschijnlijk merken dat ze niet in een bepaalde volgorde staan. U kunt de resultaten sorteren met het hulpprogramma Unix sort. Maar dat laten we nog een dag. We houden het simpel.

De twee combineren

Awk en Sed zijn beide ongelooflijk krachtig in combinatie. U kunt dit doen door Unix-pipes te gebruiken. Dat zijn de "|" bits tussen opdrachten.

Laten we dit eens proberen: we gaan alle regels in Take On Me die meer dan 20 tekens bevatten, gebruiken met Awk. Daarna gaan we alle lijnen verwijderen die beginnen met "nemen" . Samen ziet het er allemaal zo uit:

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

En produceert dit:

-Awk lengte sed

Laten we dat nu omdraaien. We beginnen met het verwijderen van alle regels die beginnen met Take en vervolgens naar Awk, waar we tellen hoe vaak elk woord verschijnt. Het ziet er ongeveer zo uit:

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

-Awk-wordcount sed

De kracht van Sed en Awk

Er is maar zoveel dat je in één artikel kunt uitleggen. Maar ik hoop dat ik heb geïllustreerd hoe onmetelijk krachtig Sed en Awk zijn. Simpel gezegd, ze zijn een krachtcentrale voor tekstverwerking.

Dus waarom zou het je iets kunnen schelen? Nou, naast het feit dat je nooit weet wanneer je voorspelbare, herhalende wijzigingen in een tekstdocument moet maken, zijn Sed en Awk geweldig voor het analyseren van logbestanden. Dit is vooral handig als u probeert een probleem op te lossen in uw LAMP-server die is aangemeld voor webhosting met alleen SSH? Do not Worry - Eenvoudig elke websoftware installeren die is aangemeld voor alleen SSH-webhosting? Maak je geen zorgen - Eenvoudig elke websoftware installeren Weet je niet het eerste over het bedienen van Linux via zijn krachtige opdrachtregel? Maak je geen zorgen meer. Lees Meer of bekijk uw toegangslogboeken om na te gaan of uw server is gehackt.

Heb je een interessant gebruik voor Sed en Awk gevonden? Zijn er andere Linux-hulpprogramma's waarvan je denkt dat ze niet worden gewaardeerd? Laat het me weten in de reacties hieronder en we zullen chatten.

In this article