Szkriptek: Python, Perl, Bash, ...

digitalstand.hu wrapper script

Sziasztok!

Érdeklődök, hogy nincs egy wrapper script a tárgyban írt oldalhoz, hogy egy megvásárolt könyvet oldalanként le tudjak kép formátumban menteni, majd PDF-et csinálni belőle? Ahhoz hogy le tudjam szedni, be kell jelentkezni, majd a könyv 2 oldalanként megjelenik, illetve felnagyítható oldalanként, de macerás nézegetni. Torrent oldalon meg nincs fent a könyv.

Üdv:
Laci

mappa létezésének vizsgálata case segítségével

Mappák létezését vizsgálnám. Sima ügy:


if [ -d "${folder}" ]; then 
blabla
fi
<>

No de a mappákban fájlok találhatók, melyekkel kezdeni szeretnék valamit.
Ha a mappa létezik, kérdezd le a benne lévő N fájl verziószámát. Igen ám de a verziószámokat különbözőképpen lehet lekérdezni.
Ezért az else ág sem elég. Teszem azt 5 könyvtárról, és 5 fájlról beszélünk.
Gondoltam a case szerkezetre, de így nem működik:


if [ -d "${folder}" ]; then 
   case "${name}" in
       file1)
          installed_version=$(${oname} --version)
          blabla
          csináld az A-t  
          ;;
       file2)
          installed_version=$(${oname} --version | awk -vFS=' ' '{print $2}')
          blabla
          csináld az A-t
          ;;
        file3)
          installed_version=$(${name} --version | awk '{print $3}')
          blabla
          csináld a B-t
          ;;
    esac
fi

Miért nem tartja meg a formázást?

szkript kapcsolóval

Felvetődött bennem egy olyan kérdés hogy miként oldható meg a következő dolog.
Adott egy szkript mely frankón lefut. De ha például egy -o kapcsolóval indítanám, akkor magában a futó szkriptben felvesz egy adott változó egy másik értéket, és annak megfelelően fut le. Ergo a kapcsolóval felülírom a bent lévő változót.
Kéne mondjuk 4 kapcsoló bele. -o, -od, -v, -vs
Persze mint ismertek, ez továbbra is bash. A getopts dolgot nézegetem, de olyan példát amit fentebb vázoltam, még nem találtam.

stringcsere és bővítés pythonban [megoldva]

Sziasztok.

Adott 232032313^23 db txt fájl, melyek elején van egy ilyen stringelrendezés:

\lnff elsoszo innen meg jon atobbiszoveg

Az elsoszo hossza változó lehet, a többi lényegtelen, ami jön.

Cserélendő az \lnff és az elsoszo oly módon, hogy még {} használat is van:

\letf{e}{lsoszo} innen meg jon atobbiszoveg

Erre megoldottam egy pitonkódot', ami itt van:


#!/usr/bin/python

def make_atiras(mondat):
    print len(mondat)
    atiras_mondat = '\letf{' + mondat[6:7] + '}{' +  mondat[8:len(mondat)]+ '}'
    return atiras_mondat

print(make_atiras('\lnff elsoszo'))

Kérdés:

ha a fájlokban egynél több sor van, de ez a fenti sorelőfordulás mindben csak egyszer áll fenn, hogyan tudom megkérni a pythont arra, hogy az aktuális könyvtárban az összes fájlon hajtsa ezt végre?

bash color debug

Van valami feature arra hogy a bash a debuggolás kimenetét színesben nyomtassa?
#!bin/bash -xv (Már ez is jobb mint a sima -x) De az lenne az igazi, ha az olvasott parancsokat, és végrehajtást két különböző színnel nyomtatná ki. A hibát mondjuk pirossal, a jókat zölddel, a beolvasott dolgokat fehérrel, stb.

bash tömbök

Létrehoztam két tömböt a readarray segítségével.
Mind a kettő fájlneveket tárol. Ez most csak tesztfájl, és nem a valódi cronnal dolgozom, csak annak egy kimásolt tartalmával!

# sh fájlok a mappákból
readarray Array1 <<< "$(find ${path} -name *.sh | awk -vFS="/" '{print $7}' | sort)"

# fájlnevek a cron tartalomból
readarray Array2 <<< "$(cat ${cron_data} | awk -vFS="/" '{print $7}' | sed -e '/^$/d' | sort)"

Ha kilistázom az első kettő tömb tartalmát, akkor úgy látom nincs hiba.

echo "${Array1[@]}"
echo "${Array2[@]}"

Egy 3. tömbbe beletettem a kettő közti különbséget.

# A cél a 3. tömbbe beletenni a két fájllista tatalmának különbségét. Tehát ha az sh fájlok már nem léteznek, de a cron tartalomban igen, akkor azokat ki kell törölni onnan.
readarray Array3 <<< "$(echo ${Array2[@]} ${Array1[@]} | tr '' '' | sort | uniq -u | sed -e 's/^ //g')"

Ezzel a sed-del kitörlöm a szó eleji szóközt. Lehet hogy az üres sort is kikéne? De attól ez még szvsz hibás.

echo "${Array2[0]}"
Itt már érdekességek adódnak. A 0 index csak egy üres sor. ???

echo "${Array2[1]}"
Ez az 1 index az első látható bejegyzés.

echo "${Array2[2]}"
Ezt meg már egy szóközzel kezdi.
Mi lehet ennek az oka?

Amikor a két tömb összehasonlításra kerül, akkor van valami gond?

Ugyanakkor egy ciklus keretén belül kiolvasom a 3. tömb tartalmát, és ami parancssorban jól működik, itt nem.
A sed: -e kifejezés #1, karakter 1: Befejezetlen regex cím - hibát ír ki. Gondolom a 0 index üressége miatt.


for name in ${Array3[@]}; do
echo nevek: ${name}
echo ${cron_data}
sleep 3
sed -i "/${name}/d" "${cron_data}"
done

Hogy lehet ezt orvosolni?

sed: [] közti string cseréje [megoldva]

Sziasztok.

Van egy nagy szövegfájlom, amiben véletlenszerűen vannak a sorokban ilyenek:
[valami]
Szögletes zárójellel együtt.
Azt szeretném, hogy a sed a zárójellel együtt cserélje ki ezeket a semmire, azaz az üres karakterre ("").

Milyen reguláris kifejezést kell használnom a sed után?

cat szovegfile | sed 's/[valamivaltozatos]//g' >idebele.txt

fájlok létezésének ellenőrzése listából

Merre induljak el? (bash)

Adott a CRONTAB, melyben ott figyelnek a periodikusan lefutó feladatok.
Adott egy FŐKÖNYVTÁR, melyben számos véletlenszerű alkönyvtár jöhet létre, és abban számos olyan sh parancs, mely belekerült a CRONTAB-ba.
Ha letörlöm a már szükségtelenné vált sh állományt, szeretném ha automatikusan törlődne a CRONTAB-ból is az őt futtató bejegyzés.

Az sh fájloknak különböző nevei lehetnek, és különböző mappákban helyezkedhetnek el a FŐKÖNYVTÁRON belül.

Egyetlen közös pont van. Minden sh fájlban benne van a CRON szó. De az adott helyen nem csak az sh fájl rendelkezhet a CRON szóval.
De azoknak más a kiterjesztésük.

Arra gondoltam hogy kigyűjtöm a CRONTAB-ból pld. grep segítségével a CRON szót tartalmazó fájlneveket, de ez sem egyszerű.
Mivel változhatnak a fájlnevek, melyben szóközök is lehetnek. Inkább csak a fájlnév egy részét gyűjteném ki.
Például a CRON szótól jobbra, a sor végéig.
Ekkor ilyesmik kerülnének a fájllistába.
CRON_1515083934.sh
CRON_1515062712.sh
Ezek alapján kéne megtalálni az ezt tartalmazó fájlokat a FŐKÖNYVTÁR almappáiban. Ha nincs eredmény akkor az adott sort a CRONTAB-ból ki lehet törölni. (Sóhaj - Ezt is hogyan? - gondolom sed-del.)

Van-e esetleg erre kész feature? Vagy meg kell írni szkriptet?
De mégis milyen parancsokat vessek be? Én nem vagyok programozó, és ráadásul csak a bash szintaktikáját ismerem úgy ahogy.
S nyilván ezt az ellenőrző rutint is be kell majd tennem a CRON-ba. De ez inkább az /etc/cron,daily-ba kerül.

bash loop

Hogyan tudnám loopolni a szkriptet saját magát?

Adott egy kis szkript mely kidob egy számozott listát, és kéri hogy válaszunk EGY számot. Ekkor végrehajtja a feladatot, és jelenleg kilép. Ha a 0 számot választjuk (ez nem szerepel a listában), akkor is kilép.

Ezt szeretném úgy megoldani hogy ne lépjen ki a feladat elvégzése után, hanem térjen vissza a kiinduló állapotba.
Csak akkor lépjen ki, ha 0-t írnak be.

Ismerem a "for" ciklust, a "while" ciklust, de ezek mindig egy feltételhez kötik a dolgot. Itt viszont nincs feltétel.
A "0" nem jó feltétel mert hierarchikusan nem ott helyezkedik el a szkriptben.

at időzitő

Adott egy egyszerű szkript melyet megadtam az AT időzítőnek.
Ezt az egyszerű szkriptet is már egy másik szkript hozta létre.
Tehát változhatnak a mappa és fájlnevek, meg a szkriptben lévő dolgok is,

Az AT időzítőben minden helyesen meg is jelenik (sudo cat /var/spool/at/*feladat)

cd /home/user/my pathX/my dirX (MOST éppen ebben van a futtatandó szkript)
sh futtatandó szkript (szintén akad benne szóköz)
rm -f futtatandó szkript (törölje a szkriptet ha végzett)

Az AT parancs nem hajtódik végre a mappa szerkezet, és a fájlnevekben lévő szóközök miatt.

Már próbáltam az IFS=" "-t. Próbáltam az idézőjelekkel escapelni.
De míg a terminálban jó,

echo ""cd '"/home/user/my path/my dir"' ""

a szkriptben már nem, mivel az idézőjelek miatt szöveg lett a változó.
S ez az eredmény:

echo cd "${első}/${szkript}/${változója}" - Ez meg értelmetlen

Megakadtam. A létrehozó szkriptben kell finomítani a dolgokat, de még nem tudom mit.