Informatika1-2007/Gyakorlat13
Minden parancs használatánál ajánlatos megnézni a
man parancsnév
segítségével a lehetséges opciókat. Van pár parancs (például a for), amelyhez nincs külön leírás. Ezeket a
man bash
leírásban lehet megtalálni. Ez több száz oldalas, és még kevésbé érthető kezdők számára. (Keresés: /keresendő_szó ENTER, következő keresése: n)
Használjuk a bal egérgombbal történő kijelölést, középső gombbal történő beillesztést. Sokat gyorsít.
További linkek: http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/hu/Bash-Prog-Intro-HOWTO-hu.txt http://www.szabilinux.hu/linux_doksi/node432.htm
Háttérképek letöltése
Szeretnénk szép háttérképeket letölteni az internetről. Nem szeretnénk, ha egyesével kellene lementeni a képeket, jobb lenne letölteni sokat, majd gyorsan végigszaladni rajtuk.
Nyissunk egy könyvtárat a képeknek:
mkdir termeszet cd termeszet
A google "nature backgrounds" kulcsszavakra több millió oldalt kiad, az első pár között találtam a következő honlapot:
http://www.batkhela.com/wallpapers/9071/nature-wallpapers.php
Amikor én néztem a honlapot, akkor a második képen egy pad volt, szép őszi színekkel. Rakattintottam, és megnyílt nagyban.
A képre jobb egérgombbal kattintva válasszuk a Properties menüpontot. Itt megtalálhatjuk a kép tulajdonságait.
Location: http://www.batkhela.com/wallpapers/9071/displaypics/pics/pic-7452.jpg
Ha ezt a képet menteni szeretnénk, akkor megtehetjük a következő paranccsal:
wget -c http://www.batkhela.com/wallpapers/9071/displaypics/pics/pic-7452.jpg
A wget -c parancsa a continoue szóra utal, ha a fájl letöltése valami miatt megszakadna, akkor ezzel folytathatjuk. Ez az opció később még jól jöhet.
Ha van 7452-es kép, akkor valószínűleg lesz 7453-as is, és 7451-es is. Próbáljunk meg letölteni ezek közül 10-et.
for ((i=7450;i<7460;i++)); do echo ${i}; done
parancs eredménye:
7450 7451 7452 7453 7454 7455 7456 7457 7458 7459
Tehát: az i egy változó, a ${i} pedig visszaadja az értékét. A for ciklus úgy működik, mint bc-ben ((inicializálás,feltétel,léptetés)). A do és a done paracsok közé több parancsot is el lehet helyezni pontosvesszővel elválasztva. A 10 képet letöltő parancs így:
for ((i=7450;i<7460;i++)); do wget -c http://www.batkhela.com/wallpapers/9071/displaypics/pics/pic-${i}.jpg; done
A képek megjelenítésére a
gqview
programot ajánlom. f billentyűvel lehet váltani teljes képernyős üzemmódba (f mint fullscreen), és egy nem túl szép képnél a del gomb után megkérdezi, hogy tényleg törölni akarjuk-e a képet.
Letöltött képek pdf formátumba konvertálása
Ha lemaradt valaki, akkor a
cp /STORE/infogyak/* .
paraccsal átmásolódnak hozzá a képek.
Megoldás:
for i in *.jpg; do echo ${i}; done
eredménye:
pic-7450.jpg pic-7451.jpg pic-7452.jpg pic-7453.jpg pic-7454.jpg pic-7455.jpg pic-7456.jpg pic-7457.jpg pic-7458.jpg pic-7459.jpg
Gyakorlaton volt már szó a convert programról. Használata:
convert kép.jpg kép.pdf
Probléma: Meg kellene szabadulnunk a jpg kiterjeszéstől:
for i in *.jpg; do echo ${i%.jpg}; done
A fenti módon a % jel után megadott részt a végéről törli. Használhatunk *-ot is a keresésnél. (Ha több illeszkedés is van, pl: aaa.txt változóból vágjuk le a "a*" végű részt, akkor % hatására a legrövidebb illeszkedő részt vágja le, %% hatására a leghosszabbat. Bővebben: man bash, majd 1390 sortól) Így a megoldás:
for i in *.jpg; do convert ${i} ${i%.jpg}.pdf; done
Ha már nem kellenek a jpg fájlok, akkor törölhetjük őket az
rm *.jpg
parancssal.
Szorozzuk össze az első 50 pozitív egészet
Mi sem egyszerűbb. Az első 50 számot már ki tudjuk listázni:
for ((i=1;i<=50;i++)); do echo ${i}; done
Vegyük észre, hogy a -n hatására az echo nem tesz újsort a végére (lásd: man echo).
for ((i=1;i<=50;i++)); do echo -n ${i}; done
A képlethez már csak a közbülső szozásjelek hiányoznak. Írjuk a kimenetet egy fájlba:
rm szorzas.txt for ((i=1;i<=50;i++)); do echo -n ${i} >> szorzas.txt; done
Magyarázat: a > és a >> jel a parancs kimenetét beleírják a fájlba. A különbség az, hogy a > hatására törlődik a fájl eddigi tartalma, míg a >> jelre a végére fűzi. Megnézhetjük, hogy mi a szorzas.txt fájl tartalma:
cat szorzas.txt
És most a * jel:
rm szorzas.txt for ((i=1;i<=49;i++)); do echo -n "${i}*" >> szorzas.txt; done; echo 50 >> szorzas.txt
Az eredmény pedig:
cat szorzat | bc
A bc a standard bemeneten kapott képletet örömmel végrehatja.
Hozzunk létre egy olyan txt fájlt, amelyben felsoroljuk az összes tex fájlunkat, továbbá azt is, hogy hány sorból állnak
Lépjünk át a saját mappánkba:
cd
Keressük meg az összes tex fájlt, ami valaha készítettünk. A find parancs kilistázza az összes fájlt.
find
Keressünk a fájlnevek között úgy, hogy átírányítjuk a kimenetét, és egrep-pel csak azokat íratjuk ki, amelyek .tex-re végződnek:
find | egrep '\.tex'
Próbaképp számoljuk meg hány tex fájlunk van. Próbáljuk ki a wc paracsot:
find | egrep '\.tex' | wc
Alapértelmezésként 3 egész számot ad vissza: A sorok, a szók és a karakterek számát. Ha csak a sorok számát szeretnénk megkapni, akkor használjuk a -l paramétert (további paraméterekért lásd: man wc).
find | egrep '\.tex' | wc -l
Valójában nem erre lesz szükségünk, hanem a fájlokban lévő sorok számára. A `` (fordított írányban dőlő) idézőjelek közötti rész eredménye beillesztésre kerül (olyan, mintha az eredményt az `` jelek közötti rész helyére beírtuk volna). Listázzuk ki az összes tex tartalmát:
cat `find | egrep '\.tex'`
A megoldás így:
rm tex_fajlok.txt for f in `find | grep '\.tex'`; do echo "`cat ${f} | wc -l` sorbol all a ${f} fajl" >> tex_fajlok.txt; done
Kicsit szépíthetünk, ha sorszám szerinti növekvő sorba rendezzük a sorokat:
cat tex_fajlok.txt | sort
Ez a megoldás még nem jó. Az a baj, hogy az abc szerint a 98 soros nagyobb, mint a 101. Ezért adjunk meg a sort parancsnak egy -n paramétert (numeric-sort, lásd: man sort).
cat tex_fajlok.txt | sort -n
Végül mentsük el egy új fájlba:
cat tex_fajlok.txt | sort -n > rendezett.txt
sg.hu portálon lévő címek lementése
Mentsük el a http://www.sg.hu oldalt sg.html néven:
wget http://www.sg.hu --output-document=sg.html
Az a baj, hogy alapból latin2-es kódolású. Konvertáljuk át utf8-ba az iconv paranccsal.
iconv sg.html -f latin2 -t utf8 > sg_utf8.html
Az iconv parancs használata: -f milyen_kódolásról -t milyen_kódolásra. Az ismert kódolások kilistázhatók az
iconv -l
paraccsal. Keressük meg azon részeket (az egrep -o opciója hatására nem adja ki a teljes sort), amelyek cikkek/ kezdetű linkekhez tartoznak.
cat sg_utf8.html | egrep -o '<a href="cikkek/[^"]*">[^<>]+'
Tiltanunk kell a < jelet a végén ([^<>]+ résznél), mert csak [^>]+ kifejezést használva kapunk fals találatokat is.
És most a címek:
cat sg_utf8.html | egrep -o '<a href="cikkek/[^"]*">[^<>]+' | sed -r 's/.*>(.*)/\1/g'
A kiemelt cikk aláírt szöveget is megtalálja, de egyébként megfelel a célnak.
A wget parancs pár opciója
A
wget --help
parancs hatására felsorolja a fontosabb paramétereket (shift pgup/pgdown -nal lehet lapozni közöttük). A rekurzív letöltés gyakran hasznos. Az összes Párizs látványosság letöltése az adott könyvtárba úgy, hogy ne ugorjon át Londonra:
wget -c -m -p -np -nd http://utazas-nyaralas.info/parizs/altalanos.html
Opciók: -c: ezt mindig odaírom, ennek hatására folytatja a letöltést, ha félbeszakadt -m: mirror, végtelen rekurzió, linkek konvertálása (ezentúl nem a honlapra mutatnak, hanem a helyi fájlokra) -p: a képek is kerüljenek mentésre (page-requisites) -np: no parent directory, csak olyan oldal kerül lementésre, amely a http://utazas-nyaralas.info/parizs/ könyvtárból nyílik. -nd: ne hozzon létre könyvtárakat, hanem mindent ömlesszen az adott helyre.