Rörmokeri
Våra kommandon skriver saker på skärmen och många av dem läser med fördel saker från tangentbordet. Det verkar enkelt, men vänta bara till jag får förklara.
Egentligen finns det tre dataströmmar, Standard In (stdin) motsvarar tangentbordet och strömmarna Standard Out(stdout) och Standard Error(stderr) motsvarar det som hamnar på skärmen.
Så långt bara teori, men det är när vi kommer till undantagen från regeln det börjar bli spännande. Vi kan nämligen få ett program att hämta sitt indata från ett annat och likaså kan vi hämta data från en fil eller spara som en fil.
Många av kommandona funkar som filter. Det blir lite som att vaska guld eller destillera fram ädla drycker. Man kan koppla ihop långa rörledningar med filter som fixar det ena efter det andra med dataströmmen.
Vi har redan fuskat lite med det här, men utan att riktigt förklara
urban@yoda:~$ ls /etc | less
Ett rent ls på den mappen blir lite väl långt och en del av filnamnen försvinner "över kanten". Filtrerat genom less blir det lättare att läsa. Standard Out från ls skickas här inte direkt till skärmen utan blir Standard In för less.
Kanske hittar du ändå inte vad du letar efter, men du har för dig att filen hette något med "con". Då kan du koppla in ett grep på rörledningen:
urban@yoda:~$ ls /etc | grep con | less
Tecknet | får du fram genom att trycka på [AltGr] och [<]. Jag brukar kalla det ett "pipe-tecken".
Ofta vill man spara resultatet från något kommando i en fil och det är enkelt:
urban@yoda:~$ date > labbmapp/loggfil
Ovan sparar vi datum och klockslag (date) i en fil. Använder vi samma kommando igen, raderas den gamla filen. Ibland är det just vad du vill, men annars finns alternativet
urban@yoda:~$ date > labbmapp/loggfil
urban@yoda:~$ date >> labbmapp/loggfil
urban@yoda:~$ date >> labbmapp/loggfil
urban@yoda:~$ date >> labbmapp/loggfil
urban@yoda:~$ cat labbmapp/loggfil
sön aug 10 20:18:40 CEST 2008
sön aug 10 20:20:31 CEST 2008
sön aug 10 20:20:32 CEST 2008
sön aug 10 20:20:33 CEST 2008
urban@yoda:~$
Med två >> läggs det nya resultatet till i slutet av filen. Kommandot cat används egentligen för att konkatenera (lägga ihop) filer, men kan också användas för att titta på dem och det gör vi här.
Vi kan lägga ihop nästan allt vi gjort tidigare i den här lilla kursen på en enda kommandorad om vi vill:
urban@yoda:~/labbmapp$ ls
01.txt fil2 kapitel_1 log loggfil test
urban@yoda:~/labbmapp$ rm *
urban@yoda:~/labbmapp$ ls
urban@yoda:~/labbmapp$ html2text http://runeberg.org/rodarum/01.html | iconv -f iso8859-1 -t utf-8 | sed /^$/d | sed s/voro/var/g > bok
urban@yoda:~/labbmapp$ ls
bok
urban@yoda:~/labbmapp$ cat bok
[- Project Runeberg - ] Röda rummet /
Stockholm i fågelperspektiv
Author: August Strindberg - Tema: Stockholm
Table of Contents / Innehåll | << Previous | Next >>
Project Runeberg | Catalog | Recent Changes |
Comments? | [q ] [search]
**** FÖRSTA KAPITLET ****
***** Stockholm i fågelperspektiv. *****
Det var en afton i början av maj. Den lilla trädgården på Mosebacke hade ännu
icke blivit öppnad för allmänheten och rabatterna var ej uppgrävda;
snödropparne hade arbetat sig upp genom fjolårets lövsamlingar och höllo just
(...)
Vi hoppar tillbaks till vår gamla labbmapp. Städar för tydlighetens skull bort allt som finns där. Kommandot rm * är just ett sådant där farligt kommando, som du ska se upp med. Det rensar rubbet! Du kollar att det verkligen är tomt. Kör det långa mastodontkommandot och beundrar resultatet.
Vi hämtar alltså filen, gör om den till text, gör om den till rätt filformat, tar bort tomrader, fixar om språket och allt detta på en enda kommandorad. Givetvis går det också blixtrande snabbt eftersom datorn aldrig måste skriva något på den tusen gånger slöare hårddisken utan allt händer i minnet.
Naturligtvis kan det aldrig finnas färdiga, så specialiserade kommandon i något operativsystem, men du kan bygga dem av de enkla beståndsdelar som finns. Det är som att bygga med LEGO.
Har du tröttnat på det första kapitlet, kan du lägga till det andra...
urban@yoda:~/labbmapp$ html2text http://runeberg.org/rodarum/02.html | iconv -f iso8859-1 -t utf-8 | sed /^$/d | sed s/voro/var/g >> bok
Du behöver bara ändra till 02 i filnamnet och ändra omdirigeringen till >>.
Hur du lägger till resten av boken kan du nog räkna ut själv?