Advertentie
Twee van de meest crimineel ondergewaardeerde Linux-hulpprogramma's zijn Sed en Awk. Hoewel ze weliswaar een beetje mysterieus kunnen lijken, zijn Sed en Awk van onschatbare waarde als je ooit grote stukken code of tekst herhaaldelijk moet wijzigen of als je ooit wat tekst moet analyseren.
Dus wat zijn ze? Hoe worden ze gebruikt? En hoe maken ze, wanneer ze gecombineerd worden, het gemakkelijker om tekst te verwerken?
Wat is Sed?
Sed werd ontwikkeld in 1971 bij Bell Labs, door de legendarische computerpionier Lee E. McMahon.
De naam staat voor stream editor, en dat is een beetje wat het doet. Hiermee kunt u tekst of tekststromen bewerken programmatisch, door middel van een compacte en eenvoudige, maar Turing-complete programmeertaal.
De manier waarop het werkt is eenvoudig: het leest tekst regel voor regel in een buffer. Voor elke regel voert het, indien van toepassing, de vooraf gedefinieerde instructies uit.
Als iemand bijvoorbeeld een Sed-script zou schrijven dat het woord 'bier' verving door 'frisdrank' en vervolgens doorgaf in een tekstbestand dat de hele songteksten van "99 flessen bier op de muur", zou dat bestand regel voor regel doorlopen en "99 flessen frisdrank op de muur" afdrukken, en zo Aan.
Het meest eenvoudige Sed-script is een Hello World-script. Hier gebruiken we het Unix Echo-hulpprogramma, dat alleen strings uitvoert, om "Hello World" af te drukken. Maar we sturen dit naar Sed en zeggen dat het "World" moet vervangen door "Dave". Spreekt voor zich.
echo "Hallo wereld" | sed s / wereld / Dave
Je kunt Sed-instructies ook combineren in bestanden, als je wat ingewikkelder bewerkingen moet uitvoeren. Geïnspireerd door deze hilarische Reddit-thread, Ik neem de tekst mee naar A-Ha’s Kom maar op, en vervang elk exemplaar van "ik", "ik" en "mijn" door Greg.
Eerst zet ik de songtekst in een tekstbestand met de naam tom.txt. Vervolgens open ik mijn favoriete teksteditor (mijn favoriet is Vim De 7 belangrijkste redenen om de Vim-teksteditor een kans te gevenJarenlang heb ik de ene teksteditor na de andere geprobeerd. Noem maar op, ik heb het geprobeerd. Ik heb elk van deze editors meer dan twee maanden gebruikt als mijn belangrijkste dagelijkse editor. Op de een of andere manier ... Lees verder , maar Nano nano vs. vim: Terminal Text Editors vergelekenHoewel Linux voor bijna iedereen eenvoudig genoeg is geworden om te gebruiken zonder ooit de Terminal te hoeven gebruiken, zijn er sommigen van ons die het regelmatig gebruiken of nieuwsgierig zijn naar hoe men kan besturen ... Lees verder en Gedit gedit: een van de meest veelzijdige editors voor platte tekst [Linux & Windows]Als u denkt aan teksteditors, is het eerste dat in uw hoofd opkomt de Kladblok-applicatie van Windows. Het doet precies wat de functieomschrijving zegt - duidelijke functies voor een platte tekst ... Lees verder zijn beide uitstekende keuzes), en voeg de volgende regels toe. Zorg ervoor dat het bestand dat u maakt, eindigt .zaad.
Je merkt misschien dat ik in het bovenstaande voorbeeld mezelf heb herhaald (bijv. S / me / Greg / en s / Me / Greg /). Dat komt omdat sommige versies van Sed, zoals degene die bij Mac OS X wordt geleverd, dat doen niet ondersteuning voor niet-hoofdlettergevoelige matching. Daarom moeten we voor elk woord twee Sed-instructies schrijven, zodat het de hoofdletter en de niet-gekapitaliseerde versie herkent.
Dit werkt niet perfect, alsof u elke instantie van 'ik', 'mij' en 'mijn' handmatig heeft vervangen. Vergeet niet dat we dit alleen gebruiken als een oefening om te demonstreren hoe u Sed-instructies in één script kunt groeperen en ze vervolgens met één opdracht kunt uitvoeren.
Vervolgens moeten we het bestand oproepen. Om dat te doen, voeren we deze opdracht uit.
kat tom.txt | sed -f greg.sed
Laten we vertragen en kijken wat dit doet. Lezers met arendsogen zullen hebben opgemerkt dat we het zijn niet Echo hier gebruiken. We gebruiken Cat. Dat komt omdat terwijl Cat de volledige inhoud van het bestand afdrukt, echo alleen de bestandsnaam afdrukt. Je hebt ook gemerkt dat we Sed gebruiken met de vlag '-f'. Dit vertelt het om het script als een bestand te openen.
Het eindresultaat is dit.
Het is ook vermeldenswaard dat Sed reguliere 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 nemen de bovengenoemde songteksten, maar gebruiken regex om elke regel af te drukken niet begin met "Take".
kat tom.txt | sed / ^ Neem / d
Sed is natuurlijk ongelooflijk handig. Maar het is nog krachtiger in combinatie met Awk.
Wat is Awk?
Awkis, net als Sed, een programmeertaal die is ontworpen om met grote hoeveelheden tekst om te gaan. Maar terwijl Sed wordt gebruikt om tekst te verwerken en te wijzigen, wordt Awk meestal gebruikt als hulpmiddel voor analyse en rapportage.
Net als Sed werd Awk voor het eerst ontwikkeld in Bell Labs in de jaren 70. 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 het lezen van een tekstbestand of invoerstroom één regel tegelijk. Elke lijn wordt gescand om te zien of deze overeenkomt met een vooraf gedefinieerd patroon. Als een match wordt gevonden, wordt er een actie uitgevoerd.
Maar hoewel Sed en Awk vergelijkbare doelen kunnen hebben, zijn het twee totaal verschillende talen, met twee totaal verschillende ontwerpfilosofieën. Awk lijkt meer op sommigen algemene talen Hoe u een programmeertaal kiest om vandaag te leren en binnen 2 jaar een geweldige baan te krijgenHet kan jaren van toegewijd werk kosten om een echt goede programmeur te worden; dus is er een manier om vanaf vandaag de juiste taal te kiezen om morgen aangenomen te worden? Lees verder , zoals C, Python en Bash. Het heeft zaken als functies en een meer C-achtige benadering van zaken als iteratie en variabelen (James Bruce uitgelegd hoe iteratie werkt De absolute basis van programmeren voor beginners (deel 2)In deel 2 van onze absolute beginnershandleiding voor programmeren, zal ik de basis van functies, retourwaarden, loops en conditionals behandelen. Zorg ervoor dat je deel 1 hebt gelezen voordat je dit aanpakt, waar ik de ... Lees verder ). Simpel gezegd, het voelt meer als een programmeertaal.
Laten we het dus eens proberen. Met de teksten voor Take On Me gaan we alle regels afdrukken die langer zijn dan 20 tekens.
awk 'length ($ 0)> 80' tom.txt
Het volgende voorbeeld dat ik heb schaamteloos gekribbeld van de officiële Awk-documentatie. Maar het is een geweldig voorbeeld van het potentieel van deze krachtige, maar 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; ik <= NF; i ++) freq [$ i] ++ }
END {voor (woord in freq) printf "% s \ t% d \ n", woord, freq [woord] }
Sla het op en voer het uit met de volgende opdracht.
awk -f WordCount.awk tom.txt
Cool toch? Je zult waarschijnlijk merken dat ze niet in een bepaalde volgorde staan. U kan sorteer de resultaten met het Unix-sorteerprogramma. 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-buizen te gebruiken. Dat zijn de "|" bits tussen opdrachten.
Laten we dit proberen: we gaan alle regels in Take On Me opsommen die meer dan 20 tekens bevatten, met Awk. Vervolgens verwijderen we alle regels die beginnen met "Nemen". Samen ziet het er allemaal zo uit:
awk 'length ($ 0)> 20' tom.txt | sed / ^ Neem / d
En produceert dit:
Laten we dat nu omdraaien. We beginnen met het verwijderen van alle regels die met Take beginnen, en leiden ze vervolgens door naar Awk, waar we tellen hoe vaak elk woord wordt weergegeven. Het ziet er ongeveer zo uit:
kat tom.txt | sed / ^ Neem / d | awk -f WordCount.awk
De kracht van Sed en Awk
Er is maar zo veel 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 krachtpatser voor tekstverwerking.
Dus waarom zou je erom geven? Afgezien van het feit dat u nooit weet wanneer u voorspelbare, repetitieve wijzigingen in een tekstdocument moet aanbrengen, zijn Sed en Awk geweldig voor het parseren van logbestanden. Dit is vooral handig wanneer u een probleem probeert op te lossen in uw LAMP-server Heeft u zich aangemeld voor SSH-only webhosting? Maak je geen zorgen - Installeer eenvoudig alle websoftwareWeet je niet het eerste over het bedienen van Linux via de krachtige opdrachtregel? Maak je geen zorgen meer. Lees verder , of kijk in uw toegangslogboeken om te zien of uw server is gehackt.
Heb je een interessant gebruik gevonden voor Sed en Awk? Zijn er andere Linux-hulpprogramma's die volgens u ondergewaardeerd worden? Laat het me weten in de reacties hieronder en we zullen chatten.
Matthew Hughes is een softwareontwikkelaar en schrijver uit Liverpool, Engeland. Hij wordt zelden gevonden zonder een kopje sterke zwarte koffie in zijn hand en is dol op zijn Macbook Pro en zijn camera. Je kunt zijn blog lezen op http://www.matthewhughes.co.uk en volg hem op twitter op @matthewhughes.