Szavazás

Milyen virtualizációt használsz?

Online felhasználók

Jelenleg 0 felhasználó van a webhelyen

Új felhasználók

  • Morello
  • gyo
  • jbaksa
  • tomassy
  • Kalacska13

Ajánlott böngészők

Google Chrome

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.txt

Tehá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">\&nbsp;</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 teljes szkript

Témakörök: 

Belépés

Friss hozzászólások