Fájlok soronkénti feldolgozása Linux Bash szkriptben

Avatar Gadam | 2021.02.04. 259 Views 0 Likes 0 Ratings

259 Views 0 Ratings Rate it

[ad_1]

Terminálablak egy Linux számítógépes rendszeren.
Fatmawati Achmad Zaenuri / Shutterstock

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 a read parancs sikert jelez a while , és a while hurok átadja a végrehajtási folyamatot a hurok testének. Vegye figyelembe, hogy a read 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 a read 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 a while 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


259 Views 0 Ratings Rate it