Informatika1-2007/Gyakorlat13
(sed tutorial-ra link, nehany eliras javitasa, a szorzos es a tex-file sorsyamlalo feladatot orai tapasztalat szerint bovitettem) |
|||
10. sor: | 10. sor: | ||
http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/hu/Bash-Prog-Intro-HOWTO-hu.txt | http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/hu/Bash-Prog-Intro-HOWTO-hu.txt | ||
+ | |||
http://www.szabilinux.hu/linux_doksi/node432.htm | http://www.szabilinux.hu/linux_doksi/node432.htm | ||
+ | |||
+ | http://www.grymoire.com/Unix/Sed.html | ||
== Háttérképek letöltése == | == Háttérképek letöltése == | ||
130. sor: | 133. sor: | ||
for ((i=1;i<=49;i++)); do echo -n "${i}*" >> szorzas.txt; done; echo 50 >> szorzas.txt | for ((i=1;i<=49;i++)); do echo -n "${i}*" >> szorzas.txt; done; echo 50 >> szorzas.txt | ||
− | + | Fontos, hogy az 50-es után legyen a file-ban newline karakter (az utolsó echo után nem kell -n opció)! Enélkül a bc hibát ad. | |
− | cat | + | A szorzás eredménye pedig: |
+ | |||
+ | cat szorzas.txt | bc | ||
A bc a standard bemeneten kapott képletet örömmel végrehatja. | A bc a standard bemeneten kapott képletet örömmel végrehatja. | ||
150. sor: | 155. sor: | ||
find | egrep '\.tex' | find | egrep '\.tex' | ||
+ | |||
+ | Ez megtalálja a tex_backup és tex~ kiterjesztésű file-okat is, úgyhogy helyette használjuk az alábbit (emlékezvén, hogy regexp-ben $ karakterrel hivatkozhatunk a sor végére): | ||
+ | |||
+ | find | egrep '\.tex$' | ||
Próbaképp számoljuk meg hány tex fájlunk van. Próbáljuk ki a wc paracsot: | Próbaképp számoljuk meg hány tex fájlunk van. Próbáljuk ki a wc paracsot: | ||
− | find | egrep '\.tex' | wc | + | 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). | 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 | + | 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: | 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'` | + | cat `find | egrep '\.tex$'` |
A megoldás így: | A megoldás így: | ||
rm tex_fajlok.txt | rm tex_fajlok.txt | ||
− | for f in `find | | + | for f in `find | egrep '\.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: | Kicsit szépíthetünk, ha sorszám szerinti növekvő sorba rendezzük a sorokat: | ||
203. sor: | 212. sor: | ||
cat sg_utf8.html | egrep -o '<a href="cikkek/[^"]*">[^<>]+' | sed -r 's/.*>(.*)/\1/g' | cat sg_utf8.html | egrep -o '<a href="cikkek/[^"]*">[^<>]+' | sed -r 's/.*>(.*)/\1/g' | ||
− | A kiemelt cikk | + | 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 parancs pár opciója == |
A lap 2007. december 6., 14:42-kori változata
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
http://www.grymoire.com/Unix/Sed.html
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
Fontos, hogy az 50-es után legyen a file-ban newline karakter (az utolsó echo után nem kell -n opció)! Enélkül a bc hibát ad.
A szorzás eredménye pedig:
cat szorzas.txt | 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'
Ez megtalálja a tex_backup és tex~ kiterjesztésű file-okat is, úgyhogy helyette használjuk az alábbit (emlékezvén, hogy regexp-ben $ karakterrel hivatkozhatunk a sor végére):
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 | egrep '\.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.