programmera.net -> linux -> normal     för utskrift      info@programmera.net

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