A szűrő funkciókat megvalósító parancsok a bemenetükre érkező adatokkal valamit csinálnak, majd az eredményt megjelenítik. A GNU/Linux rendszerben a konfigurációs állományok is jellemzően szöveges fájlok ezért ezek a parancsok a rendszer adminisztrációját is segítik.
Bár a cat parancs a fenti értelemben nem szűrő, hiszen a bemenetére érkező adatokkal nem csinál semmit, mégis ide soroljuk. Ezzel a paranccsal megjeleníthetjük szöveges fájl tartalmát, létrehozhatunk fájlt, fájlhoz hozzáfűzhetünk és állományokat is egyesíthetünk vele.
Az alábbi parancs a gyumolcs.txt állományt hozza létre az utána beírt sorok tartalmával. A Ctrl+D billentyűkombináció a beírás végét jelenti.
palferi@lizi:~$ cat > gyumolcs.txt alma körte szilva eper alma barack eper <ctrl>+D
A két > jellel hozzáfűzhetünk sorokat a meglévő fájlhoz:
palferi@lizi:~$ cat >> gyumolcs.txt szőlő eper <ctrl>+D
A vágólap tartalmát is be tudjuk illeszteni így egy fájlba. GNOME Terminál esetén Szerkesztés menüpont Beillesztés, vagy Ctrl+Shift+v billentyűkombinációval.
Nem csak szöveges állományokat egyesíthetünk a cat paranccsal, hanem pl. mp3 formátumú fájlokat is:
palferi@lizi:~$ cat track01.mp3 track02.mp3 track03.mp3 > track01-03.mp3 palferi@lizi:~$ file track01-03.mp3 track01-03.mp3: MPEG ADTS, layer III, v1, 128 kbps, 44.1 kHz, Stereo palferi@lizi:~$ ls -lh *.mp3 -rw-rw-r-- 1 palferi palferi 13M dec 27 15:30 track01-03.mp3 -rw-r--r-- 1 palferi palferi 4,0M júl 31 2007 track01.mp3 -rw-r--r-- 1 palferi palferi 5,0M júl 31 2007 track02.mp3 -rw-r--r-- 1 palferi palferi 3,3M júl 31 2007 track03.mp3
A fenti parancsokkal a három zenei fájlt egyesítettük a track01-03.mp3 fájlba, lekérdeztük a tulajdonságait az új fájlnak a file
paranccsal. Végül a részletes listán látjuk, hogy az új fájl mérete valóban az eredeti három összegével egyenlő.
A leggyakrabban használt szűrő parancs. Adott mintát tartalmazó sorokat jelenít meg. Szintaxisa:
grep [ kapcsolók ] minta [ fájl ... ]
Fontosabb kapcsolók:
Kapcsoló | Jelentés |
---|---|
-E | A grep bővített kifejezésekkel dolgozik (az egrep esetében nem kell megadni) |
-e minta | A mintát így is meg lehet adni. Feltétlenül így kell megadni, ha a minta – jellel kezdődik, pl.: egrep -e '-q' file |
-i | Kis és nagybetű közti különbség nem számít |
-l | Ha több állományban keres, kiírja azok neveit amelyben megvan a minta |
-n | A találat elé kiírja annak sorszámát |
-v | Inverz kiírás: azokat a sorokat írja ki amelyekben nem volt illesztés |
-w | Csak azokat a karakterláncokat tekinti találatoknak amelyek teljes szót alkotnak (szó elválasztó van a két szélükön, és a szó számokból, betűkből és _ karakterekből épül fel |
Néhány példa:
1. Az /etc/passwd állomány azon sorai, amelyekben van usb szöveg:
palferi@lizi:~$ grep usb /etc/passwd usbmux:x:108:46:usbmux daemon,,,:/home/usbmux:/bin/false
Látjuk, hogy egy ilyen sor van.
2. Az /etc/passwd állomány azon sorai, amelyekben van usb szó:
palferi@lizi:~$ grep -w usb /etc/passwd
Nem jelent meg semmi. Nincs ilyen sor, hiszen az usbmux szó szerepel a fenti sorban nem az usb.
3. Az /etc/passwd állomány azon sorai, amelyekben nem szerepel a false szöveg:
palferi@lizi:~$ grep -v false /etc/passwd
4. Az /etc/passwd állomány azon sorai és azok sorszáma, amelyekben szerepel a user szöveg:
palferi@lizi:~$ grep -n user /etc/passwd 32:hplip:x:113:7:HPLIP system user,,,:/var/run/hplip:/bin/false 41:dovenull:x:121:65534:Dovecot login user,,,:/nonexistent:/bin/false
A sort parancs a bemenetre érkező adatokat rendezi. Fontosabb kapcsolói:
-r | fordított rendezés |
-i | Kis és nagybetű közti különbség nem számít |
-n | Numerikus rendezés |
Jelenítsük meg rendezetten a gyumolcs.txt tartalmát:
palferi@lizi:~$ sort gyumolcs.txt alma alma barack eper eper eper körte szilva szőlő
Az uniq parancs a szomszédos egyező sorok szűrésére szolgál. Az ismétlődő sorokat csak egyszer jeleníti meg. A szemléltetéshez a sort
-al rendezett új állományt hozunk létre:
palferi@lizi:~$ sort gyumolcs.txt > gyumolcs_rend.txt palferi@lizi:~$ uniq gyumolcs_rend.txt alma barack eper körte szilva szőlő
A c kapcsolóval az előfordulás számát is megjeleníthetjük:
palferi@lizi:~$ uniq -c gyumolcs_rend.txt 2 alma 1 barack 3 eper 1 körte 1 szilva 1 szőlő
A cut paranccsal meghatározott karakterekkel határolt szövegmezőket, vagy bizonyos pozíciójú karaktereket vághatunk ki szövegsorokból. A -f kapcsolóval az mezők sorszámát, a -d kapcsoló pedig az elválasztó karaktert adhatjuk meg. A pozíciók megadásánál a -c kapcsolót használjuk.
A fenti példákban láttuk, hogy az /etc/passwd
állomány minden sora :
karakterrel elválasztott mezőket tartalmaz. A cut paranccsal jelenítsük meg az első és a hetedik mezőt:
palferi@lizi:~$ cut -f 1,7 -d":" /etc/passwd root:/bin/bash daemon:/bin/sh bin:/bin/sh sys:/bin/sh sync:/bin/sync ...
A következő példában ugyanebből a fájlból minden sor 5-10 és 17 sorszámú karakterét jelenítjük meg:
palferi@lizi:~$ cut -c 5-10,17 /etc/passwd :x:0:0/ on:x:1m x:2:2:i x:3:3:e :x:4:6y ...
Az nl paranccsal sorszámozva jeleníthetjük meg a fájlokat.
Jelenítsük meg sorszámozva a elso.sc
szkriptet:
palferi@lizi:~$ nl ./proba/elso.sc 1 #!/bin/bash 2 echo -n "Adja meg a nevét: " 3 read NEV 4 clear 5 sleep 3 6 echo "Az Ön neve: $NEV"
A tac parancs a bemenetére érkező szöveget fordított sorrendben írja ki, az első sor az utolsó lesz. (A tac
szó a cat
fordítottja) Az elso.sc
fájl a tac
-al kiíratva:
palferi@lizi:~$ tac ./proba/elso.sc echo "Az Ön neve: $NEV" sleep 3 clear read NEV echo -n "Adja meg a nevét: " #!/bin/bash
A rev parancs egy sor karaktereinek sorrendjét fordítja meg. Az elso.sc
fájl a rev
-el kiíratva:
palferi@lizi:~$ rev ./proba/elso.sc hsab/nib/!# " :téven a gem ajdA" n- ohce VEN daer raelc 3 peels "VEN$ :even nÖ zA" ohce
A head parancs a bemenetére kerülő szöveges fájlból annyi sort jelenít meg, amennyit opcióként megadunk. Opció nélkül tízet.
palferi@lizi:~$ head -2 gyumolcs.txt alma körte
A tail parancs a bemenetére kerülő szöveges fáj végéről annyi sort jelenít meg, amennyit opcióként megadunk. Opció nélkül tízet. Hasznos lehet még a -f opció, ami a fájl növekedése során hozzáfűzött adatok kiírására szolgál.
palferi@lizi:~$ tail -2 gyumolcs.txt szőlő eper
Hasznos lehet még a -f opció, ami a fájl növekedése során hozzáfűzött adatok kiírására szolgál.
palferi@lizi:~$ tail -f /var/log/syslog Dec 27 12:23:06 lizi kernel: [0.878101] sd 0:0:0:0: [sda] 234441648 512-byte logical blocks: (120 GB/111 GiB) ...
A kiíratás leállítása: Ctrl+c
A csővezetékek kommunikációs csatornák, amelyeken keresztül egy folyamat kimenete egy másik bemenetére irányítható. A csővezeték (angolul pipe) jele a |. Az alábbi példában a cat
kimenetét a sort
standard bemenetére irányítjuk:
palferi@lizi:~$ cat gyumolcs.txt | sort alma alma barack eper eper eper körte szilva szőlő
Több csővezetéket is alkalmazhatunk. Az alábbi példában sorba rendezzük, az ismétlődő sorokat elrejtjük és sorszámozunk:
palferi@lizi:~$ cat gyumolcs.txt | sort | uniq | nl 1 alma 2 barack 3 eper 4 körte 5 szilva 6 szőlő
Itt pedig a szavakat is megfordítjuk:
palferi@lizi:~$ cat gyumolcs.txt | sort | uniq | rev | nl 1 amla 2 kcarab 3 repe 4 etrök 5 avlizs 6 őlőzs
Jelenítse meg a képernyőn a gyumolcs.txt
fájl utolsó előtti sorát.
palferi@lizi:~$ tail -2 gyumolcs.txt | head -1 szőlő
A tr parancs a bemenetére érkező szöveget a kimenetre írja, de a kiírás előtt karaktereket cserél vagy töröl. Fontosabb kapcsolói:
-d | a megadott karaktereket törli |
-s | A megadott ismétlődő karaktereket törli |
Jelenítsük meg a gyumolcs.txt tartalmát az a és e betűt felcserélve:
palferi@lizi:~$ cat gyumolcs.txt | tr ea ae elme körta szilve apar elme bereck apar szőlő apar
Az alábbi parancs töröi az e és az m ismétlődését:
palferi@lizi:~$ echo eemmmeeeel | tr -s em emel
Hasznos lehet a fölösleges szóközök eltávolításában, esetleg más elválasztó karakterre cserélésben. Az alábbi példa törli az ismétlődő szóközöket, majd :-re cseréli őket:
palferi@lizi:~$ echo "Ede 17 42000" | tr -s " "| tr " " : Ede:17:42000
A napjainkban elterjedt UTF-8-as környezetben a tr parancs a magyar ékezetes karaktereket nem kezeli megfelelően. Ilyen esetekben a sed program használata javasolt.
A reguláris kifejezések segítségével mintákat határozhatunk meg, amikkel kereshetünk vagy más szövegek feldolgozásához köthető feladatokat oldhatunk meg. Gyakran regexp-nek vagy regex-nek is nevezik az angol regular expression kifejezés alapján. A reguláris kifejezésben karakterek és metakarakterek (speciális karakterek pl.: .*[\]^$
) találhatóak.
A reguláris kifejezéseknek több változata is létezik. Alapszintű kifejezéseket (basic, BRE) a régi programokkal (expr, grep, sed) való kompatibilitás miatt használunk. A bővített kifejezéseket (extended, ERE) az egrep vagy grep -E, az awk programokban és különböző programozási nyelvekben használnak.
Ebben a fejezetben az egrep vagy grep -E programban használható reguláris kifejezésekről lesz szó. A bemutatott kifejezések többsége a grep paranccsal is használható, az alábbi metakarakterek kivételével: +, ?. | és ().
Az a kifejezés az a karakterre illeszkedik, ha az nem metakarakter.
Példaként jelenítsük meg azokat a sorokat a szamol.sc
szkriptből, amelyek a kis L betűt tartalmaznak:
palferi@lizi:~$ cat ./proba/szamol.sc | grep 'l' # kiszamoljuk echo "A nullával való osztás étrelmetlen" else
Amennyiben olyan karakterre akarunk illeszkedést, ami metakarakter is, akkor a \ jelet kell elé írnunk. Például a '\*' illeszkedik a *-ra. Példaként jelenítsük meg azokat a sorokat a szamol.sc
szkriptből amelyek a *
karaktert tartalmazzák:
palferi@lizi:~$ cat ./proba/szamol.sc | grep '\*' echo "$1 * $2 = $(($1*$2))"
A pont bármely karakterre illeszkedik. Két pont két tetszőleges karakterre. Figyeljük meg, hogy a e..e
reguláris kifejezés két sorra is illeszkedik a szamol.sc
fájlból:
palferi@lizi:~$ cat ./proba/szamol.sc | grep 'e..e' echo "A nullával való osztás étrelmetlen" else
A * előtt álló karakter akárhányszor ismétlődhet. Akát nullaszor is! Ezért először talán furcsa, hogy az 'a*' kifejezés illeszkedik a bbb szövegre:
palferi@lizi:~$ echo bbb | egrep 'a*' bbb
Pedig a kifejezés azt jelenti, hogy akárhány a lehet a sorban, akár nulla is.
Nézzünk egy gyakorlatiasabb példát. Egy szöveges állományból azokat a sorokat kell kiszűrnünk, amelyek a csoport=group
karakterekkel kezdődnek, és azokat is, melyeknél a csoport után számok vannak. Itt a
^csoport[0-9]*=group
kifejezést használhatjuk. Ez azt jelenti, hogy a csoport
után szám következhet, akár több is, de ha nincs szám (a számok darabszáma nulla), az is megfelel a szűrőnek:
palferi@lizi:~$ echo csoport=group | egrep ^csoport[0-9]*=group csoport=group palferi@lizi:~$ echo csoport42=group | egrep ^csoport[0-9]*=group csoport42=group
Ezzel a metakarakterrel meghatározhatjuk, hogy csak a sor elején illeszkedjen az utána lévő karakterre. A '^i' csak a kis i betűvel kezdődő sorokra illeszkedik. A szamol.sc
fájlban több sor is tartalmaz i betűt, de csak egy sornak ez az első karakterere:
palferi@lizi:~$ cat ./proba/szamol.sc | grep '^i' if test $2 -eq 0
Ezzel a metakarakterrel meghatározhatjuk, hogy csak a sor végén illeszkedjen az előtte lévő karakterre. A 'e$
' csak a kis e betűvel végződő sorra illeszkedik.
palferi@lizi:~$ cat ./proba/szamol.sc | grep 'e$' else
A sor vége és a sor eleje metakaraktert horgonynak (anchor) is mondják és gyakran előfordulnak egy kifejezésben. Az alábbi reguláris kifejezés olyan sorokra illeszkedik, amelyek csak szóközt tartalmaznak:
palferi@lizi:~$ cat /etc/samba/smb.conf | grep -v '^ *$'
Itt egy konfigurációs állományt jelenítünk meg ilyen sorok nélkül ( -v kapcsoló). A kifejezést úgy értelmezhetjük, hogy a sor szóközzel kezdődik, ebből akárhány van és az utolsó is az.
Szögletes zárójelek közé írt karakterek bármelyike illeszkedik a mintára. Például az [abc] beírás az bármelyik karakterre illeszkedik a három közül. Rövidíthetünk is a -
jellel: a [a-z] a kisbetűk bármelyikét jelenti, [0-9] bármelyik számjegyet.
Az alábbi parancs a /proc/cpuinfo
fájlból azokat a sorokat jeleníti meg, melyek b vagy s betűvel kezdődnek:
palferi@lizi:~$ cat /proc/cpuinfo | grep '^[bs]' stepping : 9 siblings : 4 bogomips : 5986.28 ...
Metakarakterek saját magukat jelentik a karakterhalmazban. A [d.] olyan sorokra illeszkedik amelyekben előfordul a d karakter vagy a . (pont). Kivételt képez a második helyen lévő -, ez a rövidítést jelenti, és a ^ karakter is a halmaz első karaktereként: ez a lista ellentettjét jelenti. A [^0-9] jelentése: nem szám. A következő parancs a /proc/cpuinfo
fájlból azokat a sorokat jeleníti meg, amelyek nem a-p karakterekkel kezdődnek:
palferi@lizi:~$ cat /proc/cpuinfo | grep '^[^a-p]' vendor_id : GenuineIntel stepping : 9 siblings : 4 wp : yes ...
Amennyiben két minta közül az egyik vagy másik illesztését várjuk a | metakaraktert alkalmazzuk. A alma|szilva
kifejezés olyan sorokra illeszkedik, amelyek vagy az alma, vagy a szilva szót tartalmazzák.
palferi@lizi:~$ cat gyumolcs.txt | grep -E 'alma|szilva' alma szilva alma
Zárójelekkel csoportosíthatunk karaktereket, részmintát hozhatunk létre. A részmintát, akárcsak a az egyedi karaktert atomnak nevezzük. Gyakran ismétlődések meghatározására használjuk.
Ismétlődő karaktereket az alábbi metakarakterekkel határozhatunk meg:
Nem pontos számú ismétlődést határoz meg (kvantorok) | |
---|---|
Metakarakter | Magyarázat |
* | az előtte álló karakter nullaszor, vagy akárhányszor ismétlődhet |
+ | az előtte álló karakter legalább egyszer vagy akárhányszor jelenik meg |
? | az előtte álló karakter opcionálisan, tehát egyszer sem vagy pontosan egyszer jelenik meg |
Pontos számú ismétlődést határoz meg | |
{n} | az előtte álló karakter pontosan n-szer fordul elő (n egész szám) |
{n,} | az előtte álló karakter legalább n-szer de akárhányszor előfordulhat |
{n,m} | az előtte álló karakter legalább n-szer de maximum m-szer fordul elő |
Az alábbi példa 4 ismétlődést keres számokból:
palferi@lizi:~$ cat /proc/cpuinfo | grep -E '[0-9]{4}' model name : Intel(R) Core(TM) i5-3330 CPU @ 3.00GHz cpu MHz : 1600.000 cache size : 6144 KB bogomips : 5986.28 ...
Szűrje ki egy szöveges állomány azon sorait, amelyek csak hármassal kezdődő egész számot tartalmaznak.
A megoldás ellenőrzéséhez hozzon létre egy szöveges állományt.
palferi@lizi:~$ cat > minta1.txt 334 32 4 345 37a 3,14 3 3322
Az alábbi szűrő '^3[0-9]*$' olyan sorokra illeszkedik, ahol az első karakter 3, utána tetszőleges számjegy következik, ezekből akárhány lehet, akár nulla darab is, és az utolsó karakter is ilyen.
palferi@lizi:~$ cat minta1.txt | grep '^3[0-9]*$' 334 3 3322
Egyszerűbb beírással:
palferi@lizi:~$ grep '^3[0-9]*$' minta1.txt 334 3 3322
Jelenítse meg a képernyőn az /usr/share
könyvtár összméretét és az alkönyvtárait, de csak azokat, amelyek 1MByte-nál nagyobbak. A lista csökkenő sorrendben jelenjen meg, sorszámozva.
A megoldás előtt tekintsük át a du
és sort
parancsok rövid súgóját:
palferi@lizi:~$ du --help palferi@lizi:~$ sort --help
Láthatjuk, hogy a du parancsot -h
és -
-max-depth=1
kapcsolókkal kiadva csak az adott könyvtár alkönyvtárait írja ki és nem byte-okban, hanem közérthető formában:
palferi@lizi:~$ du -h --max-depth=1 /usr/share/ 44M /usr/share/gnome 172K /usr/share/libwacom 92K /usr/share/language-selector 1,9M /usr/share/vlc 20K /usr/share/gnome-background-properties 2,6M /usr/share/gtk-doc ...
A fenti részletből is megállapíthatjuk, hogy azokat a sorokat kell kiszűrnünk a listából, amelyek számmal kezdődnek, számmal vagy tizedesvesszővel folytatódnak, ezután szám vagy számok következnek, majd M vagy G betű. A reguláris kifejések nyelvén - kezdődik: ^; számjeggyel: [1-9]; ezután számjegy vagy ,
következik: [0-9,]; ebből egy van, vagy több: +; következik M vagy G: (M|G).
palferi@lizi:~$ du -h --max-depth=1 /usr/share/ | grep -E '^[1-9][0-9,]+(M|G)' 44M /usr/share/gnome 1,9M /usr/share/vlc 2,6M /usr/share/gtk-doc 2,2M /usr/share/zlibrary 6,3M /usr/share/mime 33M /usr/share/midi ...
A fordított és közérthető rendezéshez a sort -rh
parancsba irányítjuk a szűrt kimenetet, majd az nl
paranccsal sorszámozunk. A megoldás tehát:
palferi@lizi:~$ du -h --max-depth=1 /usr/share/ | grep -E '^[1-9][0-9,]+(M|G)' | sort -rn | nl 1 1,4G /usr/share/ 2 252M /usr/share/icons 3 120M /usr/share/doc 4 98M /usr/share/locale 5 87M /usr/share/pyshared 6 80M /usr/share/fonts 7 71M /usr/share/virtualbox 8 58M /usr/share/help 9 51M /usr/share/libreoffice 10 46M /usr/share/app-install 11 44M /usr/share/gnome ...
Írjon szkriptet, ami ellenőrzi, hogy két paramétert kapott és azok egész számok. Nem megfelelő paraméter esetén figyelmeztessen szöveggel.
Olyan reguláris kifejezést kell írnunk, ahol az első karakter lehet szám vagy - jel (negatív szám esetén), de ebből csak egy lehet. Ezt számok követhetik, és az utolsó is az: '^[0-9-]?[0-9]+$
'
#!/bin/bash if [ $# -eq 2 ] then P1=`echo $1 | grep -E '^[0-9-]?[0-9]+$'` P2=`echo $2 | grep -E '^[0-9-]?[0-9]+$'` if [ -n "$P1" ] && [ -n "$P2" ] then echo "Paraméterek rendben" else echo "A parameterek nem egész számok" fi else echo "A paraméterek szama nem kettő" fi