Weboldal keresés

Az Awk és a reguláris kifejezések használata szöveg vagy karakterlánc szűrésére a fájlokban


Amikor Unix/Linux rendszerben bizonyos parancsokat futtatunk, hogy szöveget olvassunk vagy szerkeszthessünk egy karakterláncból vagy fájlból, legtöbbször megpróbáljuk a kimenetet egy adott érdeklődési területre szűrni. Itt jön jól a reguláris kifejezések használata.

Olvassa el még: 10 hasznos Linux-láncoló operátor gyakorlati példákkal

Mik azok a reguláris kifejezések?

A reguláris kifejezés definiálható olyan karakterláncként, amely több karaktersorozatot képvisel. A reguláris kifejezésekkel kapcsolatos egyik legfontosabb dolog az, hogy lehetővé teszik egy parancs vagy fájl kimenetének szűrését, egy szöveg- vagy konfigurációs fájl egy részének szerkesztését és így tovább.

A reguláris kifejezés jellemzői

A reguláris kifejezések a következőkből állnak:

  1. Közönséges karakterek, például szóköz, aláhúzás (_), A-Z, a-z, 0-9.
  2. A közönséges karakterekre bővített metakarakterek a következők:

    1. (.) bármilyen karakterrel megegyezik, kivéve az újsort.
    2. (*) az őt megelőző közvetlen karakter nulla vagy több létezésének felel meg.
    3. [ karakter(ek) ] a karakter(ek)ben megadott karakterek bármelyikével egyezik, használhatunk egy kötőjelet is (-), amely olyan karaktertartományt jelent, mint pl. mint [a-f], [1-5] és így tovább.
    4. ^ egy fájl sor elejére egyezik.
    5. A $ megegyezik a fájl sorának végével.
    6. \ ez egy escape karakter.

A szöveg szűréséhez olyan szövegszűrő eszközt kell használni, mint az awk. Az awkra önálló programozási nyelvként gondolhat. Ennek az awk használatára vonatkozó útmutatónak a terjedelmét illetően azonban egy egyszerű parancssori szűrőeszközként fogunk foglalkozni vele.

Az awk általános szintaxisa a következő:

awk 'script' filename

Ahol a 'script' olyan parancsok halmaza, amelyeket az awk ért, és amelyeket a fájlon, fájlnéven hajtanak végre.

Úgy működik, hogy beolvas egy adott sort a fájlban, másolatot készít a sorról, majd végrehajtja a parancsfájlt a sorban. Ez megismétlődik a fájl összes sorában.

A 'script' formátuma '/pattern/ action', ahol a pattern egy reguláris kifejezés, az action pedig > ezt fogja tenni az awk, ha megtalálja az adott mintát egy sorban.

Az Awk szűrőeszköz használata Linuxban

A következő példákban azokra a metakarakterekre fogunk összpontosítani, amelyeket fentebb az awk jellemzői alatt tárgyaltunk.

Egy egyszerű példa az awk használatára:

Az alábbi példa az /etc/hosts fájl összes sorát kinyomtatja, mivel nincs megadva minta.

awk '//{print}'/etc/hosts

Az awk használata mintával:

Az alábbi példában egy localhost minta van megadva, így az awk megfelel a localhost sornak a /etc/hosts fájlban.

awk '/localhost/{print}' /etc/hosts 

Az Awk használata (.) helyettesítő karakterrel a mintában

Az alábbi példában a (.) megfelel a loc, localhost, localnet karakterláncoknak.

Vagyis * l some_single_character c *.

awk '/l.c/{print}' /etc/hosts

Az Awk használata (*) karakterrel egy mintában

Megfelel a localhost, localnet, lines, capable karakterláncoknak, mint az alábbi példában:

awk '/l*c/{print}' /etc/localhost

Azt is észre fogja venni, hogy a (*) a lehető leghosszabb egyezést próbálja megtalálni.

Nézzünk egy esetet, amely ezt szemlélteti, vegyük a t*t reguláris kifejezést, amely a t betűvel kezdődő és t-re végződő karakterláncokat jelenti. az alábbi sorban:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

A következő lehetőségeket kapja, ha a /t*t/ mintát használja:

this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint

És a (*) a /t*t/ helyettesítő karakterben lehetővé teszi az awk számára, hogy az utolsó lehetőséget válassza:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint

Az Awk használata a [ karakter(ek) ] készlettel

Vegyük például a [al1] halmazt, itt az awk minden olyan karakterláncot fog egyezni, amely a vagy l vagy 1 karaktert tartalmaz. a /etc/hosts fájl egy sorában.

awk '/[al1]/{print}' /etc/hosts

A következő példa a K vagy a k karakterláncokkal kezdődő karakterláncokra egyezik, amelyeket a T követ:

awk '/[Kk]T/{print}' /etc/hosts 

Karakterek megadása egy tartományban

Az awk karakterek megértése:

  1. A [0-9] egyetlen számot jelent
  2. Az [a-z] azt jelenti, hogy egyetlen kisbetűre egyezik
  3. A [A-Z] azt jelenti, hogy egyetlen nagybetűre egyezik
  4. Az [a-zA-Z] azt jelenti, hogy egyetlen betűre egyezik
  5. [a-zA-Z 0-9] azt jelenti, hogy egyetlen betűre vagy számra egyezik

Nézzünk egy példát alább:

awk '/[0-9]/{print}' /etc/hosts 

A fenti példában az /etc/hosts fájl összes sora legalább egy [0-9] számot tartalmaz.

Az Awk használata (^) metakarakterrel

Megfelel az összes olyan sornak, amely az alábbi példában megadott mintával kezdődik:

awk '/^fe/{print}' /etc/hosts
awk '/^ff/{print}' /etc/hosts

Az Awk használata ($) metakarakterrel

Az összes olyan sorhoz illeszkedik, amely a megadott mintával végződik:

awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts

Az Awk használata (\) Escape karakterrel

Lehetővé teszi, hogy az őt követő karaktert szó szerint vegye fel, vagyis tekintse úgy, ahogy van.

Az alábbi példában az első parancs kinyomtatja a fájl összes sorát, a második parancs nem ír ki semmit, mert olyan sort akarok egyeztetni, amelyben 25,00 USD van, de nem használ escape karaktert.

A harmadik parancs helyes, mivel egy escape karaktert használtak a $ olvasásához úgy, ahogy van.

awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt

Összegzés

Ez még nem minden az awk parancssori szűrőeszközzel, a fenti példák az awk alapvető műveletei. A következő részekben az awk összetett funkcióinak használatáról fogunk haladni. Köszönjük, hogy végigolvasta, és ha bármilyen kiegészítést vagy pontosítást ad, írjon megjegyzést a megjegyzés rovatba.