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

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

Twee van de meest crimineel ondergewaardeerde Linux-hulpprogramma's zijn Sed and Awk. Hoewel ze weliswaar een beetje geheimzinnig kunnen 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, wanneer ze samen worden gecombineerd, ze het gemakkelijker maken 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. Hiermee kun je lichamen of tekststromen bewerken programmatisch, door 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.

Bijvoorbeeld, als iemand een Sed-script zou schrijven dat het woord verving “bier” met “soda-”, en vervolgens doorgegeven in een tekstbestand dat de volledige songtekst bevatte “99 flessen bier aan de muur”, het zou regel voor regel door dat bestand gaan en uitprinten “99 flessen frisdrank op de muur”, enzovoorts.

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

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

Je kunt ook Sed-instructies combineren in bestanden, als je wat gecompliceerdere bewerkingen moet uitvoeren. Geïnspireerd door deze hilarische Reddit-thread, ga ik de teksten naar A-Ha's brengen Kom maar op, en vervang elke instantie van “ik”, “Me”, en “Mijn”, met Greg.

Eerst zet 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 voor 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 Text Editors Ten opzichte van nano vs. vim: Terminal Text Editors 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 zijn nieuwsgierig naar hoe men controle kan uitoefenen ... Lees meer en Gedit gedit: een van de meest gevulde teksteditor-editors [Linux & Windows] gedit: een van de meest gevulde platte tekst-editors [Linux & Windows] Als je denkt aan teksteditors, is het eerste wat er in kan komen je hoofd is Windows 'Notepad-applicatie. Het doet precies wat het is status van taakomschrijving - 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 .sed.

Misschien merk je dat ik in het bovenstaande voorbeeld mezelf herhaalde (bijvoorbeeld s / me / Greg / en s / Me / Greg /). Dat komt omdat sommige versies van Sed, zoals die van Mac OS X, dat wel doen niet ondersteuning 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 hebt vervangen “ik”, “Me”, en “Mijn” met de hand. 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. Adelaar-eyed lezers zullen hebben gemerkt dat we zijn niet hier Echo gebruiken. We gebruiken Cat. Dat komt omdat terwijl Cat de volledige inhoud van het bestand zal afdrukken, echo alleen de bestandsnaam zal afdrukken. Je zult ook gemerkt hebben dat we Sed met de “-f” vlag. Dit vertelt het om het script als een bestand te openen.

Het eindresultaat is dit.

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 niet beginnen met “Nemen”.

cat tom.txt | sed / ^ Take / d

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 om tekst te verwerken en aan te passen, wordt Awk meestal gebruikt als een 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 is 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, retourwaarden, loops en conditionals bespreken. 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 

Het volgende voorbeeld dat ik heb schaamteloos geboeid door 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


Cool toch? U zult waarschijnlijk merken dat ze niet in een bepaalde volgorde staan. U kan sorteer de resultaten 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. Dan gaan we alle lijnen verwijderen die beginnen “Nemen”. Samen ziet het er allemaal zo uit:

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

En produceert dit:

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

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.

Meer informatie over: Terminal, Teksteditor.