Fájlok soronkénti feldolgozása Linux Bash szkriptben
[ad_1]
Elég könnyű elolvasni egy Linux szöveges fájl tartalmát soronként egy shell parancsfájlban – mindaddig, amíg néhány finom gotchával foglalkozol. Így teheti meg a biztonságos módon.
Fájlok, szöveg és idiómák
Minden programozási nyelvnek van egy idiómája. Ezek a szokásos, korszerűtlen módszerek a közös feladatsorok elvégzésére. A programozó által használt nyelv egyik funkciójának elemi vagy alapértelmezett módja. A programozó mentális tervrajzainak részévé válnak.
Jó példák olyan műveletekre, mint az adatok olvasása a fájlokból, a ciklusokkal való munka és a két változó értékeinek cseréje. A programozó tudni fogja legalább egy módját, hogy általános vagy vaníliás módon érjék el céljaikat. Talán ez elegendő lesz a szóban forgó követelményhez. Vagy talán szépíteni fogják a kódot, hogy hatékonyabbá váljon, vagy alkalmazható legyen az általuk fejlesztett konkrét megoldásra. Nagyszerű kiindulópont azonban, ha kéznél van az építőelem-idióma.
Az idiómák egy nyelven történő ismerete és megértése megkönnyíti az új programozási nyelv felvételét is. Annak ismerete, hogy a dolgok hogyan épülnek fel egy nyelven, és ennek megfelelője – vagy a legközelebbi dolog – keresése egy másik nyelven, jó módszer arra, hogy megbecsüljük a már ismert és a megtanult nyelvek közötti hasonlóságokat és különbségeket.
Vonalak olvasása fájlból: Az egyvonalas
A Bash-ban használhatja a while
hurok a parancssoron, hogy minden egyes szövegsort elolvashasson egy fájlból, és tegyen vele valamit. Szöveges fájlunk neve „data.txt”. Tartja az év hónapjainak listáját.
January February March . . October November December
Egyszerű béléscsövünk:
while read line; do echo $line; done < data.txt
Az while
A loop kiolvas egy sort a fájlból, és a kis program végrehajtási folyamata átkerül a hurok törzsébe. Az echo
a parancs beírja a szöveg sort a terminál ablakába. Az olvasási kísérlet sikertelen, ha már nincsenek sorok, amelyeket el kell olvasni, és a ciklus elkészült.
Az egyik ügyes trükk a képesség hogy egy fájlt hurokba irányítson. Más programozási nyelveken meg kell nyitnia a fájlt, ki kell olvasnia belőle, és a befejezés után újra be kell zárnia. A Bash használatával egyszerűen használhatja a fájlok átirányítását, és hagyhatja, hogy a shell kezelje az összes alacsony szintű dolgot.
Természetesen ez az egy vonalhajó nem túl hasznos. A Linux már biztosítja a cat
parancsot, amely pontosan ezt teszi meg helyettünk. Hosszú távon hoztuk létre a hárombetűs parancs helyettesítését. De szemmel láthatóan bemutatja az aktából történő olvasás elveit.
Ez elég jól működik, egy pontig. Tegyük fel, hogy van egy másik szöveges fájlunk, amely a hónapok nevét tartalmazza. Ebben a fájlban az új sor karakterének menekülési sorrendjét minden sorhoz csatolták. Hívjuk „data2.txt” -nek.
Januaryn Februaryn Marchn . . Octobern Novembern Decembern
Használjuk az egysoros vonalunkat az új fájlunkban.
while read line; do echo $line; done < data2.txt
A hátsó perjel menekülési karakter ” ”Eldobásra került. Ennek eredményeként minden sorhoz „n” -et fűztek. Bash a visszavágást az an kezdeteként értelmezi menekülési sorrend. Gyakran nem akarjuk, hogy Bash értelmezze, amit olvas. Kényelmesebb lehet elolvasni egy sort teljes egészében – a visszavágó menekülési szekvenciákat és mindet -, és kiválaszthatja, hogy mit elemezzen vagy cseréljen le saját kódján belül.
Ha bármilyen értelmes feldolgozást vagy elemzést akarunk végrehajtani a szöveg sorain, akkor szkriptet kell használnunk.
Vonalak olvasása egy fájlból egy szkript segítségével
Itt van a forgatókönyvünk. Ennek neve: script1.sh.
#!/bin/bash
Counter=0
while IFS='' read -r LinefromFile || [[ -n "${LinefromFile}" ]]; do
((Counter++))
echo "Accessing line $Counter: ${LinefromFile}"
done < "$1"
Beállítottunk egy változót Counter
nullára, akkor meghatározzuk a sajátunkat while
hurok.
A while sor első állítása az IFS=''
. IFS
a belső térelválasztót jelenti. Olyan értékeket tartalmaz, amelyeket Bash használ a szóhatárok azonosításához. Alapértelmezés szerint az read parancs eltávolítja a vezető és a záró szóközt. Ha pontosan úgy akarjuk olvasni a fájl sorait, amilyenek, akkor be kell állítanunk IFS
hogy üres húr legyen.
Beállíthatjuk ezt egyszer a cikluson kívülre, ugyanúgy, mint a Counter
. De összetettebb szkriptekkel – különösen azokkal, amelyekben sok felhasználó által definiált funkció van – lehetséges, hogy IFS
különböző értékekre lehet állítani a szkript másutt. Ennek biztosítása IFS
minden alkalommal üres karakterláncra van állítva while
a hurok ismétlése garantálja, hogy tudjuk, mi lesz a viselkedése.
Egy szövegrészt fel fogunk olvasni egy úgynevezett változóba LinefromFile
. Használjuk a -r
(a visszavágás olvasása normál karakterként) opció a visszavágások figyelmen kívül hagyására. Ugyanúgy bánnak velük, mint bármely más szereplővel, és nem részesülnek külön bánásban.
Két feltétel teljesíti a while
ciklust, és hagyja, hogy a szöveget a hurok törzse feldolgozza:
read -r LinefromFile
: Ha egy szövegsort sikeresen beolvastak a fájlból, akkor aread
parancs sikert jelez awhile
, és awhile
hurok átadja a végrehajtási folyamatot a hurok testének. Vegye figyelembe, hogy aread
parancsnak látnia kell a új sor karakter a szövegsor végén annak érdekében, hogy sikeres olvasmánynak tartsuk. Ha a fájl nem a POSIX kompatibilis szövegfájl, a az utolsó sor nem tartalmazhat új sor karaktert. Ha aread
parancs látja a fájl vége jelölő (EOF), mielőtt a vonalat új vonal zárná le, meg fog nem kezelje sikeres olvasmányként. Ha ez megtörténik, az utolsó szövegsor nem kerül a hurok törzsébe, és nem kerül feldolgozásra.[ -n "${LinefromFile}" ]
: További munkát kell végeznünk a nem POSIX-kompatibilis fájlok kezeléséhez. Ez az összehasonlítás ellenőrzi a fájlból olvasott szöveget. Ha nem új vonalas karakterrel zárjuk le, akkor ez az összehasonlítás továbbra is sikerrel jár awhile
hurok. Ez biztosítja, hogy az esetleges záróvonal töredékeket a hurok teste dolgozza fel.
Ezt a két tagot az OR logikai operátor választja el egymástól. ” ||
”Úgy, hogy ha bármelyik záradék sikert eredményez, a visszakeresett szöveget a hurok törzsének feldolgozása folyik, legyen új vonal karakter vagy sem.
A hurok testében növeljük a Counter
változó egyenként és használva echo
hogy kimenetet küldjön a terminál ablakába. Megjelenik a sor száma és az egyes sorok szövege.
Továbbra is használhatjuk az átirányítási trükköt egy fájl hurokba történő átirányítására. Ebben az esetben átirányítjuk a $ 1 értéket, egy olyan változót, amely az első parancssori paraméter nevét tartalmazza, amely a szkriptnek adódott át. Ezzel a trükkel könnyen átadhatjuk annak az adatfájlnak a nevét, amelyen azt akarjuk, hogy a szkript működjön.
Másolja és illessze be a szkriptet egy szerkesztőbe, és mentse el a „script1.sh” fájlnévvel. Használja a chmod
parancs hogy futtatható legyen.
chmod +x script1.sh
Lássuk, mit csinál a szkriptünk a data2.txt szövegfájlból és a benne található visszavágásból.
./script1.sh data2.txt
A sor minden karaktere szó szerint jelenik meg. A visszavágásokat nem értelmezzük menekülési karakterként. Normál karakterként vannak kinyomtatva.
A vonal átadása egy funkciónak
Még mindig csak visszhangozzuk a szöveget a képernyőre. Valós programozási forgatókönyv esetén valószínűleg valami érdekesebbet fogunk kezdeni a szövegsorral. A legtöbb esetben jó programozási gyakorlat a vonal további feldolgozásának kezelése egy másik funkcióban.
Így tehetnénk. Ez a „script2.sh.”
#!/bin/bash
Counter=0
function process_line() {
echo "Processing line $Counter: $1"
}
while IFS='' read -r LinefromFile || [[ -n "${LinefromFile}" ]]; do
((Counter++))
process_line "$LinefromFile"
done < "$1"
Meghatározzuk Counter
változó, mint korábban, majd meghatározzuk az úgynevezett függvényt process_line()
. Meg kell jelennie egy függvény definíciójának előtt a függvényt először a szkript hívja meg.
Funkciónknak át kell adni az újonnan olvasott szövegsort a while
hurok. A függvényen belül elérhetjük ezt az értéket a $1
változó. Ha két változó lett átadva a függvénynek, akkor az értékekkel elérhetjük $1
és $2
, és így további változók esetén.
A while
hurok főleg ugyanaz. Csak egy változás van a hurok testén belül. Az echo
vonal helyébe a. hívása lépett process_line()
funkció. Ne feledje, hogy a függvény nevében nem kell használni a „()” zárójelet, amikor hívja.
A szöveg sort tartó változó neve, LinefromFile
, idézőjelekbe van csomagolva, amikor átadják a függvénynek. Ez olyan vonalakat szolgál ki, amelyekben szóköz van. Idézőjelek nélkül az első szót úgy kezeljük $1
a függvény szerint a második szó az $2
, stb. Az idézőjelek használata biztosítja a teljes szövegsor kezelését, teljes egészében $1
. Vegye figyelembe, hogy ez az nem ugyanaz $1
amely ugyanazt az adatfájlt tárolja a szkript számára.
Mivel Counter
a szkript fő törzsében van deklarálva, és nem egy függvény belsejében, a process_line()
funkció.
Másolja vagy írja be a fenti szkriptet egy szerkesztőbe, és mentse a „script2.sh” fájlnévvel. Tegye futtathatóvá a chmod
:
chmod +x script2.sh
Most futtathatjuk és átadhatunk egy új adatfájlt, a „data3.txt” fájlt. Ebben szerepel a hónapok listája és egy sor, sok szóval.
January February March . . October November nMore text "at the end of the line" December
Parancsunk:
./script2.sh data3.txt
A sorokat kiolvassa a fájlból, és egyesével továbbítja a fájlba process_line()
funkció. Az összes sor helyesen jelenik meg, beleértve a páratlan sort, a visszalépést, az idézőjeleket és a több szót.
Az építőelemek hasznosak
Van egy gondolatmenet, amely szerint az idiómának tartalmaznia kell valamit, ami egyedi az adott nyelv számára. Ez nem egy meggyőződés, amelyre feliratkozom. Ami fontos, hogy jól használja a nyelvet, könnyen megjegyezhető, és megbízható és robusztus módot kínál bizonyos funkciók bevezetésére a kódban.
[ad_2]
Source link