|
|
Kommandon på textfiler
Kommando | | Exempel | | Beskrivning |
cat | | cat a.txt | | Skriver ut filen a.txt på skärmen. |
tac | | tac a.txt | | Skriver ut raderna underifrån och upp från a.txt. |
more | | more a.txt | | Skriver ut filen a.txt på skärmen en sida i taget. |
less | | less a.txt | | Skriver ut filen a.txt på skärmen en sida i taget. |
head | | head -50 a.txt | | Skriver ut de 50 första raderna i a.txt. |
tail | | tail -100f a.txt | | Skriver ut de 100 sista raderna i a.txt, och fortsätter skriva ut eventuella nya rader. |
Kommando | | Exempel | | Beskrivning |
sort | | sort a.txt | | Skriver ut a.txt med alla rader sorterade alfabetiskt. |
uniq | | uniq a.txt | | Skriver ut alla unika rader i a.txt. |
nl | | nl a.txt | | Skriver ut raderna i a.txt med radnummer. |
wc | | wc -w a.txt | | Räknar antalet ord (word count) i a.txt. |
fmt | | fmt -w50 a.txt | | Skriver ut a.txt formatterad så att varje rad blir 50 tecken lång. |
tr | | tr 'a-z' 'A-Z' < a.txt | | Skriver ut a.txt med alla små bokstäver utbytta mot stora. |
sed | | sed 's/hej/svej/g' a.txt | | Skriver ut a.txt med alla ord hej utbytta till svej. |
Kommando | | Exempel | | Beskrivning |
cut | | cut -d"," -f2 a.txt | | Skriver ut det som står mellan första och andra kommatecknet (,) i varje rad i a.txt. |
paste | | paste -d"," a.txt b.txt | | Lägger ihop varje rad i a.txt med b.txt med ,(komma) som separator och skriver ut. |
join | | join a.txt b.txt | | Skriver ut föreningen av de rader där första ordet i a.txt matchar första ordet i en rad i b.txt. |
|
På denna sida beskrivs kommandon som opererar på textfiler. Ett gemensamt drag för dessa kommandon är att de inte förändrar den fil de använder sig av, de skriver bara ut något på skärmen. Om du vill spara t. ex. en sorterad fil använder du högerpilen (större än) för att få resultatet att hamna i en ny fil:
[olle@dev1]$ sort a.txt > b.txt
| Kommandot ovan sparar den sorterade versonen av a.txt i b.txt.
cat
Flagga | | Betydelse | | Beskrivning |
cat -A a.txt | | all | | Samma som -ETv. |
cat -b a.txt | | number nonblank | | Numrerar de icke tomma raderna (som nl). |
cat -E a.txt | | end | | Visar radslut som $. |
cat -n a.txt | | number | | Numrerar raderna. |
cat -T a.txt | | tab | | Visar tabbar som ^I. |
cat -v a.txt | | visual | | Visar andra icke synliga tecken. |
Kommandot cat är det vanligaste kommandot för att visa en textfils innehåll på skärmen, och för att skapa korta filer. Man tycker kanske att print borde vara ett bättre namn, men cat står för concaternate vilket betyder länka samman. Om du skriver:
[olle@dev1]$ cat a.txt b.txt |
så förstår du varför. cat skriver nämligen ut alla rader i fil a.txt och fortsätter sedan direkt med att skriva ut raderna i fil b.txt.
Om du vill slå ihop a.txt och b.txt till en ny fil c.txt skriver du följande:
[olle@dev1]$ cat a.txt b.txt > c.txt |
Det finns ett finurligt sätt att skapa en ny textfil i LINUX. Det gör man genom att inte specifiera den fil som ska skrivas ut, bara den som ska skapas.
[olle@dev1]$ cat > c.txt
hej alla
glada
Ctrl+d
|
Du avslutar inmatningen med Ctrl+d (håll ner Ctrl och d samtidigt), vilket betyder END OF FILE i LINUX.
Din nya fil ser ut såhär:
[olle@dev1]$ cat c.txt
hej alla
glada
|
Du kan lägga till mer text i c.txt genom:
[olle@dev1]$ cat >> c.txt
katter
Ctrl+d
|
Nu ser c.txt ut såhär:
[olle@dev1]$ cat c.txt
hej alla
glada
katter
|
Som du ser behöver du inte kunna något mer kommando än cat, eftersom det både kan skriva ut och skapa filer.
tac
Kommandot tac är cat baklänges. Den skriver nämligen också ut filer men uppochner.
[olle@dev1]$ tac c.txt
katter
glada
hej alla
|
more
Problemet med cat är att man inte hinner läsa filen om den är större än att hela filen syns på skärmen. I de fall man vill läsa en fil kan man använda kommandot more. När man väl har startat more navigerar man upp och ned i filen med följande kommandon:
Kommandon | | Beskrivning |
Mellanslag | | Hoppa ner en sida. |
b | | Hoppa tillbaka en sida. |
/foo | | Sök efter ordet foo. Sökordet kan vara ett reguljärt uttryck. |
n | | Sök efter nästa förekomst av senaste reguljära uttryck. |
q | | Avsluta more. |
Om man inte kommer att man ska trycka på q för att komma ur more kan man ju alltid trycka Ctrl+c.
less
Flagga | | Betydelse | | Beskrivning |
less -S a.txt | | | | Raderna bryts inte, även om den inte får plats. Låga rader försvinner alltså ur skärmen. |
less fungerar som more, d.v.s. skriver ut en sida i taget, men har ett utökat utbud av kommandon. Kommandona är nästan identiska med de som används i vi. less öppnar snabbt stora filer eftersom den inte behöver läsa hela filen innan första sidan visas. Nu listar jag de kommandon som används för att ta sig runt i filen:
Kommandon | | Beskrivning |
Mellanslag | | Hoppa ner en sida. |
b | | Hoppa tillbaka en sida. |
g | | Hoppa till första raden. |
17g | | Hoppa till rad 17. |
G | | Hoppa till sista raden. |
17% | | Hoppa till 17% av filen. |
pil ner | | Hoppa ner en rad. |
pil upp | | Hoppa upp en rad. |
pil höger | | Hoppa en tab till höger (Om du startat less med -S flaggan). |
pil vänster | | Hoppa en tab till vänster (Om du startat less med -S flaggan). |
Nedan har vi en lista på övriga kommandon:
Kommandon | | Beskrivning |
/foo | | Sök nedåt i filen efter första förekomsten av foo. |
?foo | | Sök uppåt i filen efter första förekomsten av foo. |
n | | Sök efter nästa förekomst av senaste reguljära uttryck. |
N | | Sök i motsatt riktning efter nästa förekomst av senaste reguljära uttryck. |
q | | Avsluta less. |
v | | Starta vi för att editera filen. Skriv :q för att hoppa ur vi. |
= | | En statusrad ploppar upp som visar var man befinner sig i filen. |
Om man inte kommer på att man ska trycka på q för att komma ur less kan man ju alltid trycka Ctrl+c.
head
Flagga | | Betydelse | | Beskrivning |
head -50 a.txt | | | | Visar de 50 första raderna i a.txt. |
Detta kommando skriver ut de 10 första raderna i en fil. Ofta arbetar man med stora filer, då finns det ingen vits med att använda cat, eftersom cat inte väntar utan fortsätter att skriva ut hela filen utan att du hinner läsa något. Du kan välja att se ett annat antal rader än 10 genom att skriva minus och antalet rader. Om du bara vill se 2 rader kan du skriva:
[olle@dev1]$ head -2 c.txt
hej alla
glada
|
tail
Flagga | | Betydelse | | Beskrivning |
tail -50 a.txt | | | | Visar de 50 sista raderna i a.txt. |
tail -50f a.txt | | follow | | Visar de 50 sista raderna i a.txt och alla nya rader när filen växer. |
Tail fungerar som head men tvärt om. Här skriver man ut de sista raderna i en fil. Du kan på samma sätt som i head bestämma antalet rader med minus och ett tal.
[olle@dev1]$ tail -2 c.txt
glada
katter
|
tail används framför allt till att titta på slutet av loggfiler för att se de senaste händelserna. Ofta kan det vara bra att tail skriver ut nya rader samtidigt som de skrivs in i loggfilen. Detta görs med flaggan -f (=follow). Om du t. ex. alltid vill se de 50 senaste raderna i c.txt skriver du:
[olle@dev1]$ tail -50f c.txt
hej alla
glada
katter
Ctrl+C
|
Som du ser kommer inte prompten tillbaka förrän du avslutar kommandot genom Ctrl+C. Om någon annan process skriver till filen c.txt innan du avbryter med Ctrl+C kommer du se de nya raderna dyka upp på skärmen.
sort
Flagga | | Betydelse | | Beskrivning |
sort -i a.txt | | ignore | | Ignorerar alla bokstäver utanför ASCII-området. |
sort -n a.txt | | numerical | | Sorterar numeriskt. |
sort -r a.txt | | reverse | | Sorterar i bakvänd ordning. |
Sort sorterar raderna i en fil i alfabetisk ordning. Ofta vill man istället sortera i numerisk ordning. För att demonstrera skapar jag en fil:
[olle@dev1]$ cat > x.txt
a
b
c
1
2
3
10
11
|
Om vi nu sorterar denna fil sker följande:
[olle@dev1]$ sort x.txt
1
10
11
2
3
a
b
c
|
Vi kan sortera i numerisk ordning med flaggan -n:
[olle@dev1]$ sort -n x.txt
a
b
c
1
2
3
10
11
|
uniq
Flagga | | Betydelse | | Beskrivning |
uniq -c a.txt | | count | | Skriver ut alla unika rader med en siffra framför som indikerar antal förekomster av raden. |
uniq -d a.txt | | duplicated | | Skriver bara ut de rader som förekommer mer är en gång. |
uniq -i a.txt | | ignore case | | Tar inte hänsyn till stora och små bokstäver. |
Kommandot är står för unique och skriver ut alla unika rader från en fil. Alla dubletter tas alltså bort. OBS! Fungerar bara när filen är sorterad.
[olle@dev1]$ uniq -c c.txt
1 hej alla
1 glada
1 katter
|
Om vi nu lägger till en kopia av sista raden:
[olle@dev1]$ cat >> c.txt
katter
Ctrl+d
|
Nu kastar uniq bort den dubletta raden men visar med siffran 2 att det finns 2 st.:
[olle@dev1]$ uniq -c c.txt
1 hej alla
1 glada
2 katter
|
Nu lägger vi till en ny rad:
[olle@dev1]$ cat >> c.txt
glada
Ctrl+d
|
Filen ser nu ut såhär:
[olle@dev1]$ cat c.txt
hej alla
glada
katter
katter
glada
|
Filen är alltså inte sorterad, därför kommer uniq att misslyckas med att kasta den andra förekomsten av glada.
[olle@dev1]$ uniq c.txt
hej alla
glada
katter
glada
|
nl
Flagga | | Betydelse | | Beskrivning |
nl -i2 a.txt | | increment | | Ändra inkrementeringen till 2 (default 1). |
nl -v2 a.txt | | | | Ändra startnumret till 2(default 1). |
nl -s"," a.txt | | | | Ändra tecknet mellan siffran och raden till komma (default mellanslag). |
nl -nrn a.txt | | right | | Flyttar siffran till höger (default). |
nl -nln a.txt | | left | | Flyttar siffran till vänster. |
nl -nrz a.txt | | zero | | Lägger till inledande nollor i siffran. |
Detta kommando står för number lines och numrerar raderna i filen. Här ser du ett exempel:
[olle@dev1]$ nl c.txt
1 hej alla
2 glada
3 katter
|
wc
Flagga | | Betydelse | | Beskrivning |
wc -c a.txt | | char | | Räknar tecken i a.txt. |
wc -l a.txt | | line | | Räknar rader i a.txt. |
wc -w a.txt | | word | | Räknar ord i a.txt. |
Kommandot betyder word count men räknar egentligen rader,ord och tecken.
[olle@dev1]$ wc c.txt
3 4 22 c.txt
|
Om du bara vill se hur många ord filen innehåller:
[olle@dev1]$ wc -w c.txt
4 c.txt
|
Om du vill undvika att filnamnet kommer upp i utskriften kan du använda pipe:
[olle@dev1]$ cat c.txt | wc -w
4
|
fmt
Flagga | | Betydelse | | Beskrivning |
fmt -w10 a.txt | | width | | Skriver ut a.txt med en bredd på 10 tecken. |
fmt -s a.txt | | split only | | Delar långa rader men lägger inte ihop korta rader till längre. |
fmt -u a.txt | | uniform spacing | | Ser till att det är endast ett mellanslag mellan orden och två mellan meningar. |
Kommandot betyder format och används för att få paragraferna i en fil att skrivas med en viss radlängd. Defaultlängd är 75 tecken. Korta rader klistras ihop till långa så att raden blir 75 tecken lång. Rader som börjar med mellanslag klistras inte ihop, ty de tolkas som en andningspaus i texten. En tom rad markerar en ny paragraf och klisras inte ihop med raden ovan.
[olle@dev1]$ fmt c.txt
hej alla glada katter
|
tr
Flagga | | Betydelse | | Beskrivning |
cat a.txt | tr -d '\n' | | delete | | Raderar alla radbrytningar. |
Kommandot står för translate översätter tecken. tr är ett specialfall av sed, som klarar att substituera hela ord. Det speciella med tr är att man inte kan specifiera en fil på vanligt sätt utan måste använda pipe eller liknande:
[olle@dev1]$ cat c.txt | tr [:lower:] [:upper:]
HEJ ALLA
GLADA
KATTER
|
sed
Flagga | | Betydelse | | Beskrivning |
sed 's/foo/x/' a.txt | | | | Skriver ut a.txt med den första förekomsten av foo på varje rad ersatt med x. |
sed -e 's/foo/x/g' -e 's/boo/y/g' a.txt | | expression | | Skriver ut a.txt med alla foo utbytta mot x och alla boo utbytta mot y. |
sed -f commands.txt a.txt | | file | | Skriver ut a.txt med alla substitutioner som listas i filen commands.txt. |
Kommandot betyder stream editor och används till att förändra text från en fil. Sed är egentligen ett mycket avancerat kommandon som beskrivs utförligare på en
egen sida . Man kan använda reguljära uttryck tillsammans med sed. Nedan ersätter jag "le" med "xx" på alla ställen i filen c.txt:
[olle@dev1]$ sed 's/le/xx/g' c.txt
hej alxx
gxxda
katter
|
OBS! sed ersätter bar första förekomsten av den sökta strängen om man inte använder ett g på slutet.
[olle@dev1]$ sed 's/a/x/' c.txt
hej xlla
glxda
kxtter
|
cut
Flagga | | Betydelse | | Beskrivning |
cut -f1,3 a.txt | | field | | Skriv ut kolumn 1 och 3 från a.txt. |
cut -d"," -f2 a.txt | | delimiter | | Skriv ut kolumn 2, där kolumnerna separeras av kommatecken. |
cut -c1,3 a.txt | | char | | Skriv ut bokstav nummer 1 och 3 från varje rad i a.txt. |
cut -c2-8 a.txt | | char | | Skriv ut bokstäverna nummer 2 till 8 från varje rad i a.txt. |
cut -c17- a.txt | | char | | Skriv ut bokstäverna från 17 och framåt från a.txt. |
Cut skriver ut kolumner från en fil. För att visa hur cut fungerar skapar jag en fil med tab-separerade kolumner:
[olle@dev1]$ cat > d.txt
Adam Adamson 1945
Björn Björnsson 1966
Cesar Cesarsson 1977
Ctrl+d
|
Nu kan jag t. ex. skriva ut kolumnen innehållande årtal med hjälp av flaggan -f:
[olle@dev1]$ cut -f3 d.txt
1945
1966
1977
|
Eller flera kolumner:
[olle@dev1]$ cut -f2,3 d.txt
Adamson 1945
Björnsson 1966
Cesarsson 1977
|
Jag kan skriva ut de 3 första bokstäverna i d.txt med hjälp av flaggan -c:
[olle@dev1]$ cut -c1-3 d.txt
Ada
Bjö
Ces
|
I filen /etc/passwd använder man kolon för att separera kolumner istället för tab. Om vi vill lista alla användare i systemet använder vi flaggan -d:
[olle@dev1]$ cut -d":" -f1 /etc/passwd
root
bin
...
olle
|
paste
Flagga | | Betydelse | | Beskrivning |
paste a.txt b.txt | | | | Skriv ut a.txt och b.txt rad för rad separerade av tab. |
paste -d"," a.txt b.txt | | delimiter | | Skriv ut a.txt och b.txt rad för rad separerade av komma. |
En ganska enkel variant av att skriva ut flera kolumner från olika filer är paste. Den mer avancerade heter join.
Jag börjar med att skapa 2 filer:
[olle@dev1]$ cat > e.txt
a
b
c
Ctrl+d
[olle@dev1]$ cat > f.txt
1
2
3
Ctrl+d
|
Nu kan jag skriva ut båda filerna enligt:
[olle@dev1]$ paste e.txt f.txt
a 1
b 2
c 3
|
Eller separerade med t. ex. kommatecken:
[olle@dev1]$ paste -d"," e.txt f.txt
a,1
b,2
c,3
|
join
Flagga | | Betydelse | | Beskrivning |
join a.txt b.txt | | | | Skriv ut a.txt och b.txt rad för rad där första kolumnen i båda filerna matchar varandra. |
join -t':' a.txt b.txt | | | | Som ovan men kolumnerna i a.txt och b.txt är separerade av kolon. |
join -a1 a.txt b.txt | | add | | Skriv ut de matchande raderna plus de rader i a.txt som inte matchar någon rad från b.txt. |
join -v1 a.txt b.txt | | | | Skriv ut de rader i a.txt som inte matchar någon rad i b.txt. |
join -o 1.2 2.5 a.txt b.txt | | output | | Skriv ut kolumn 2 från a.txt och kolumn 5 från b.txt från de matchande raderna. |
join -1 2 -2 5 a.txt b.txt | | | | Skriv ut de rader där kolumn 2 från a.txt matchar kolumn 5 från b.txt. |
Join är en mer avancerad version av paste. För att två filer ska kunna förenas måste båda filerna ha en kolumn som är identisk.
Som default är det första kolumnen som är förenings-kolumn. join använder alltså första kolumnen som en nyckel och försöker para ihop rader från de två filerna med matchande nycklar. OBS! Join fungerar bara om de båda filernas förenings-kolumner är sorterade. För att visa hur join fungerar skapar jag 2 filer:
[olle@dev1]$ cat > g.txt
1 Adam
2 Bertil
3 Cesar
4 David
Ctrl+d
[olle@dev1]$ cat > h.txt
1 a
2 b
4 d
7 g
Ctrl+d
|
Nu kan vi använda join:
[olle@dev1]$ join g.txt h.txt
1 Adam a
2 Bertil b
4 David d
|
Som synes hoppar join över rad 3 i g.txt eftersom den inte hittar någon match. Om vi skriver h.txt före g.txt i anropet av join blir det lika många matchningar men utskriften blir annorlunda.
[olle@dev1]$ join h.txt g.txt
1 a Adam
2 b Bertil
4 d David
|
Vad händer om någon fil inte är sorterad? Vi skapar en osorterad fil:
[olle@dev1]$ cat > i.txt
1 a
7 g
2 b
4 d
|
Nu kommer join att avbrytas då 7 påträffas, eftersom join antar att båda filerna är sorterade:
[olle@dev1]$ join g.txt i.txt
1 Adam a
|
Även då båda filerna är sorterade är det inte säkert att man är nöjd med joins beteende. Alla rader där man inte hittar en match kastas ju bort. Man kan behålla de felaktiga raderna från en av filerna med flaggan -a och filens nummer:
[olle@dev1]$ join -a1 g.txt h.txt
1 Adam a
2 Bertil b
3 Cesar
4 David d
|
-a1 syftar på att de felaktiga raderna från g.txt ska behållas.
-a2 betyder att man vill behålla de felaktiga raderna från h.txt.
Om man bara vill se vilka rader i g.txt som inte har någon match i h.txt använder man flaggan -v:
[olle@dev1]$ join -v1 g.txt h.txt
3 Cesar
|
Ibland kanske du inte vill ha med alla kolumner från båda filerna i utskriften. Då använder du flaggan -o. Efter -o kommer en lista med {fil.kolumn} element. Här kommer 2 exempel:
[olle@dev1]$ join -o 1.2 2.2 g.txt h.txt
Adam a
Bertil b
David d
[olle@dev1]$ join -o 2.2 1.2 1.1 g.txt h.txt
a Adam 1
b Bertil 2
d David 4
|
|
| |
|