Jelenlegi hely
Egy feladat és egy megoldás II.
Térjünk rá a részletekre. Az Egy feladat és egy megoldás I. cikk folytatása.
A részfolyamatok
Azzal kezdtem, hogy lebontottam részfeladatokra a tevékenységet és megkerestem külön-külön ezekre a lehetőségeket. Megírtam a feladat végrehajtását ellátó szkriptet, leteszteltem, hogy az adott munkafolyamatot rendesen elvégzi-e. Amikor több ilyen részfeladat szkriptje működött, összerakosgattam azokat egy egésszé.
Az első feladat az az volt, hogy a kiindulási html-ből kinyerjem a megfelelő linkeket. Ehhez megnéztem, hogy is épülnek fel a linkek, mi jellemző azokra, amelyek számomra fontosak és mi a többire. Azonban alapfeladat, hogyan szedjük ki a linkeket a htmlből.
Ehhez ötletet adott, hogy a Midnight Commanderben, ha egy html fájlra F3-at nyomunk, akkor az oldal végére szépen sorba kilistázza a hivatkozásokat. A konzolon léteznek böngészők, mint a links és a lynx. Ez utóbbit a -dump kapcsolóval lehet úgy indítani, hogy a megnyitott html fájl linkjeit szépen kilistázza a lap aljára és ezt lehet aztán egy csövön keresztül továbbítani valamilyen kimenetre. Nos így már ki lehet szedni a linkeket mondjuk egy txt-be. Azért txt fájlba, mert a wget-et lehet úgy paraméterezni, hogy egy fájl tartalmát használja a letöltésekhez. Ez ám a download managger konzol alatt :)
Tehát az első lépés így alakult:
lynx -dump kiindulasi.html | grep -i npicture | awk '{print $2}' > linkek.txtTehát a lynx -ből a kiindulasi.html-t egy csövön (pipe) átküldjük a grepnek, ami azokat a sorokat adja aztán tovább az az awk részére, amelyekben szerepel az 'npicture' karaktersor - ezekre a linkekre volt szükségem - és ezeket az awk úgy írja ki, hogy minden sor második "szavát" teszi csak bele a linkek.txt-be. Erre azért van szükség, mert a linkeket sorszámozással adja át a lynx a grepnek és enélkül ilyen sorokat kapnánk a linkek.txt-be:
23. http://www.akarmi.hu/barmi/celfajl
Így viszont a wget nem fogja tudni értelmezni a hivatkozásokat.
Mivel a célfájlok nevét egy perl szkript produkálta és mindeneggyi ilyen ehhez hasonló furcsa elnevezéssel került volna a gépemre,
npicture.pl?cikk=ossffiwfirccoofawicf&belso=1
ezért ezeket a fájlokat az átláthatóság és kezelhetőség miatt már eleve átnevezve kellett lementenem. Ezt a letöltési és lementési folyamatot egy ciklussal oldottam meg:
n=1 for i in `cat linkek.txt`; do wget $i -O "$n.tif" n=`expr $n + 1` done
Itt azt a két dolgot kell megjegyeznem, hogy a wget sorába természetesen lehet további wget kapcsolókat beletenni, illetőleg mivel eleve tudtam, hogy a célképek formátuma tif, ezért az fixen van a ciklusban. Az előtte lévő változó pedig az elnevezést adja. Tehát ilyen fájlokat kaptam:
kesigomu@nexus:~/sajtoszemle/pic$ ls -l összesen 412 -rw-r--r-- 1 kesigomu users 31899 2005-07-29 09:36 1.tif -rw-r--r-- 1 kesigomu users 159211 2005-07-29 09:36 2.tif -rw-r--r-- 1 kesigomu users 69443 2005-07-29 09:36 3.tif -rw-r--r-- 1 kesigomu users 70199 2005-07-29 09:36 4.tif -rw-r--r-- 1 kesigomu users 65723 2005-07-29 09:36 5.tif
Mivel intranetre kerülnek a képek és a tiff fájlok megjelenítése egyes más operációs rendszerek alatti böngészőben itt-ott problémás, valamint a méretük is általában nagyobb, a képeket egy általános képformátumba kellett átkonvertálnom.
Erre a következő ciklust alkalmaztam:
for i in * do tmp=`echo $i | sed s/'\.[^.]*$'//` convert "$tmp.tif" "$tmp.gif" done
Ez a ciklus az adott mappa tartalmát kilistázza úgy, hogy a $tmp változóba emeli a fájlneveket a kiterjesztésüket levágva, majd a convert utasításnál ezt a nevet megadva egyik formátumról a másikra konvertálja azokat.
Arra ügyelni kell, hogy az adott könyvtárban más fájl ne legyen, csak amit konvertálni akarunk. Persze aztán lehet szépen ciffrázni, hogy a konvertálást követően a kiindulási fájlokat töröljük, a végtermékeket meg átpakoljuk máshová stb, stb.
Eljutottunk odáig, hogy kiszedtük a linkeket a html fájlból, wget-el leszedtük a fájlokat, átneveztük azokat, majd hogy teljes legyen a mutatvány át is konvertáltuk a képeket.
A következő feladat a kiindulási html saját célokra történő átalakítása volt.
Ez számomra nehezebb dió volt, mert soha életemben nem használtam sed-et, ami nagyon jó konzol alatt az ilyen feladatokra.
Az alap sed utasítás a következő:
sed -e 's/mintasztring/amirecsereljuksztring/g' munkafajl > celfajl
persze az utasítás elején az "-e" és végén a "g" egy-egy kapcsoló, melyekből elég sok van. Ráadásul a mintasztring tartalmától függően sokfajta jelet lehet, vagy szükséges beletenni a mintasztringünkbe. Nem szándékozom a teljes html átalakítást itt lépésról lépésre leírni, csak pár példát mutatok, ami esetleg jól jöhet valamikor. A komplett szkriptet meg úgyis a cikk végén elérhetővé teszem, ha valaki tanulni szeretne, vagy csak részeit hasznosítani. Amit hasznosítható tanácsként kaptam, a sed utasításban nem csak / jelekkel lehet elválasztani egymástól a mintasztring-et az amirecsereljuksztring-tól és a különböző kapcsokat, hanem megadhatjuk így is:
sed -e 's,mintasztring,amirecsereljuksztring,g' munkafajl > celfajl sed -e 's@mintasztring@amirecsereljuksztring@g' munkafajl > celfajl
Példák
sed -e 's,<td nowrap="nowrap" width="8%">2005.július 29.</td>,,g' $file > $tmp mv $tmp $file
Eltávolítja a mintában található sztringsort
sed -e 's,</td><td>,</td><td width="10">\ </td><td>,g' $file > $tmp mv $tmp $file
a </td><td> sztringet cseréli ki
Persze a kész szkript sem egy programozási csúcskód, - még fejlesztem tovább, mert egy-két kényelmi szolgáltatással kiegészítem - de legalább megmutatja, hogy konzolban is mennyi mindent meg lehet oldani, ráadásul gyorsan. Mellékesként megjegyzem, hogy nem szoktam bash szkripteket írni és nem vagyok programozó. 3 napig kísérletezgettem doksikat olvastam és kérdeztem meg másokat, akiknek nagyobb tapasztalata volt a bash terén.
Ezúton is szeretném megköszönni önzetlen segítségét külön is gif-nek a #beos.hu IRC csatiról, valamint locsemege, NevemTeve, ex_lx és Kyjan nicknevű szaktársaknak, akik ötleteikkel, tanácsaikkal segítettek.
- A hozzászóláshoz regisztráció és belépés szükséges

Friss hozzászólások