A Linux operációs rendszerben számos segédeszköz létezik, amelyek segítségével szöveges adatokból vagy fájlokból kereshetnek és készíthetnek jelentést. A felhasználó az awk, grep és sed parancsok segítségével könnyen végezhet sokféle keresést, cserét és jelentést generáló feladatokat. Az awk nem csak parancs. Ez egy szkriptnyelv, amely mind a terminálból, mind az awk fájlból használható. Támogatja a változó, feltételes utasítást, tömböt, ciklusokat stb., Mint más szkriptnyelvek. Bármely fájltartalmat képes soronként olvasni, és a mezőket vagy oszlopokat egy adott határoló alapján elválaszthatja. Ezenkívül támogatja a reguláris kifejezést a szöveges tartalomban vagy fájlban lévő karakterláncok kereséséhez, és intézkedéseket tesz, ha talál egyezést. Az awk parancs és parancsfájl használatának módját ebben az oktatóanyagban mutatjuk be 20 hasznos példával.
Tartalom:
- awk printf -el
- awk hasítani a fehér területen
- awk, hogy változtass a határolón
- awk tabulátorral határolt adatokkal
- awk csv adatokkal
- awk regex
- awk nem érzékeny regex
- awk nf (mezők száma) változóval
- awk gensub () függvény
- awk rand () függvénnyel
- awk felhasználó által definiált függvény
- awk ha
- awk változók
- awk tömbök
- awk hurok
- awk az első oszlop kinyomtatásához
- awk az utolsó oszlop kinyomtatásához
- awk a greppel
- awk a bash script fájllal
- awk seddel
Az awk használata a printf használatával
printf () funkció a kimenet formázására szolgál a legtöbb programozási nyelvben. Ez a funkció együtt használható awk parancs különböző típusú formázott kimenetek létrehozásához. Az awk parancsot elsősorban bármilyen szövegfájlhoz használják. Hozzon létre egy szöveges fájlt alkalmazott.txt az alábbi tartalommal, ahol a mezőket tabulátor választja el egymástól („ t”).
alkalmazott.txt
1001 János sena 40000
1002 Jafar Iqbal 60000
1003 Meher Nigar 30000
1004 Jonny máj 70000
A következő awk parancs kiolvassa az adatokat alkalmazott.txt sorról sorra, és formázás után nyomtassa ki az első fájlt. Itt, %10s n azt jelenti, hogy a kimenet 10 karakter hosszú lesz. Ha a kimenet értéke kevesebb, mint 10 karakter, akkor a szóközök hozzáadódnak az érték elé.
$ awk'{printf'%10s n', 1 USD'munkavállaló.txt
Kimenet:
awk hasítani a fehér területen
A szöveg felosztásához az alapértelmezett szó- vagy mezőelválasztó szóköz. Az awk parancs különféle módon veheti be a szöveg értékét bemenetként. A bemeneti szöveg innen kerül továbbításra kidobta parancsot a következő példában. A szöveg, ' Szeretek programozni ”Alapértelmezett elválasztóval lesz felosztva, tér , és a harmadik szó lesz nyomtatva kimenetként.
$kidobta 'Szeretek programozni' | awk '{print $ 3}'Kimenet:
awk, hogy változtass a határolón
Az awk paranccsal megváltoztatható a határoló bármely fájltartalomhoz. Tegyük fel, hogy szöveges fájlja van telefon.txt a következő tartalommal, ahol a „:” a fájltartalom mezőelválasztója.
telefon.txt
+123: 334: 889: 778+880: 1855: 456: 907
+9: 7777: 38644: 808
Futtassa a következő awk parancsot a határoló megváltoztatásához, ':' által '-' a fájl tartalmára, telefon.txt .
$ cat phone.txt$ awk '$ 1 = $ 1' FS = ':' OFS = '-' phone.txt
Kimenet:
awk tabulátorral határolt adatokkal
Az awk parancsnak sok beépített változója van, amelyek a szöveg különböző módon történő olvasására szolgálnak. Közülük kettő az FS és OFS . FS a beviteli mező elválasztó és OFS a kimeneti mező elválasztó változói. Ezen változók felhasználását ebben a részben mutatjuk be. Hozzon létre egy fülre elkülönített fájl neve input.txt a következő tartalommal a használatának teszteléséhez FS és OFS változók.
Input.txt
Ügyféloldali szkriptnyelvSzerveroldali szkriptnyelv
Adatbázis szerver
Web szerver
FS változó használata lappal
A következő parancs minden sorát felosztja input.txt fájlt a lap alapján („ t”), és nyomtassa ki minden sor első mezőjét.
$awk '{print $ 1}' FS=' t'input.txtKimenet:
OFS változó használata lappal
A következő awk parancs kinyomtatja a 9th és 5th mezői 'Ls -l' parancs kimenet tabulátor elválasztóval az oszlop címének kinyomtatása után Név és Méret . Itt, OFS változó a kimenet tabulátoros formázására szolgál.
$ls -az$ls -az | awk -v OFS=' t' 'BEGIN {printf'%s t%s n ',' Name ',' Size '} {print $ 9, $ 5}'
Kimenet:
awk CSV adatokkal
Bármely CSV -fájl tartalma többféleképpen értelmezhető az awk paranccsal. Hozzon létre egy CSV -fájlt ügyfél.csv ’A következő tartalommal az awk parancs alkalmazásához.
ügyfél.txt
Id, név, e -mail, telefon1, Sophia, [email protected], (862) 478-7263
2, Amelia, [email protected], (530) 764-8000
3, Emma, [email protected], (542) 986-2390
A CSV -fájl egyetlen mezőjének olvasása
'-F' opciót az awk paranccsal használjuk a határoló beállításához a fájl egyes sorainak felosztásához. A következő awk parancs kinyomtatja a név mezője az ügyfél.csv fájlt.
$macskaügyfél.csv$awk -F ',' '{print $ 2}'ügyfél.csv
Kimenet:
Több mező olvasása más szöveggel kombinálva
A következő parancs három mezőt nyomtat ki ügyfél.csv a címszöveg kombinálásával, Név, e -mail és telefon . Az első sor a ügyfél.csv fájl tartalmazza az egyes mezők címét. NEM változó tartalmazza a fájl sorszámát, amikor az awk parancs elemzi a fájlt. Ebben a példában az NR változó a fájl első sorának kihagyására szolgál. A kimeneten megjelenik a 2nd, 3rdés 4thaz első sor kivételével minden sor mezői.
$awk -F ',' 'NR> 1 {print' Name: '$ 2', Email: '$ 3', Phone: '$ 4}'ügyfél.csvKimenet:
CSV fájl olvasása awk szkript használatával
Az awk parancsfájl végrehajtható az awk fájl futtatásával. Ebben a példában bemutatjuk, hogyan hozhat létre awk fájlt és futtathatja azt. Hozzon létre egy nevű fájlt awkcsv.awk a következő kóddal. KEZDŐDIK kulcsszót használják a szkriptben, hogy tájékoztassák az awk parancsot a parancsfájl végrehajtásához KEZDŐDIK részt, mielőtt más feladatokat hajt végre. Itt a mezőelválasztó ( FS ) a hasító határoló és 2ndés 1utcaa mezőket a printf () függvényben használt formátum szerint nyomtatja ki.
awkcsv.awkKEZDŐDIK{FS= ','} { printf '% 5s (% s) n',$2,$1}
Fuss awkcsv.awk fájl tartalmával az ügyfél.csv fájlt a következő paranccsal.
$awk -fawkcsv.awk ügyfél.csvKimenet:
awk regex
A reguláris kifejezés egy minta, amelyet a szövegben lévő karakterláncok keresésére használnak. Különféle típusú bonyolult keresési és cserefeladatok nagyon egyszerűen elvégezhetők a reguláris kifejezés használatával. Ebben a részben bemutatjuk az awk paranccsal rendelkező reguláris kifejezés néhány egyszerű használatát.
Egyező karakterkészletA következő parancs illeszkedik a szóhoz Bolond vagy bolond vagy Menő a beviteli karakterlánccal, és nyomtassa ki, ha a szó megtalálható. Itt, Baba nem egyezik és nem nyomtat.
$printf 'Bolond nMenő nBaba nbool ' | awk '/[FbC] ool/'Kimenet:
Karakterlánc keresése a sor elején
'^' szimbólumot használják a reguláris kifejezésben a sor elején található minták keresésére. ' Linux ” a szót a következő példában a szöveg minden sora elején keresik. Itt két sor kezdődik a szöveggel, 'Linux ', És ez a két sor megjelenik a kimenetben.
$kidobta -És 'A Linux szabadon használható nEz egy nyílt forráskódú szoftver nA LinuxHint aznépszerű blogoldal ' | awk '/^Linux/'
Kimenet:
Karakterlánc keresése a sor végén
'$' szimbólumot használják a reguláris kifejezésben, hogy bármilyen mintát keresjenek a szöveg minden sora végén. ' Forgatókönyv ’Szót keresi a következő példa. Itt két sor tartalmazza a szót, Forgatókönyv a sor végén.
$kidobta -És 'PHP szkript nJavaScript nVizuális programozás ' | awk '/Script $/'Kimenet:
Keresés az adott karakterkészlet kihagyásával
'^' szimbólum jelzi a szöveg kezdetét, ha azt bármilyen karakterlánc előtt használjuk (‘ / ^… /’) vagy a által deklarált karakterkészlet előtt ^ […] . Ha a '^' szimbólumot használja a harmadik zárójelben, [^…], akkor a zárójelben lévő meghatározott karakterkészlet kimarad a kereséskor. A következő parancs megkeres minden olyan szót, amely nem ezzel kezdődik „F” de a végével: ool '. Menő és bool minta és szöveges adatok szerint lesz kinyomtatva.
$ printf 'Bolond nMenő nBaba nbool ' |awk' / [^ F] ool /'Kimenet:
awk nem érzékeny regex
Alapértelmezés szerint a reguláris kifejezés kis- és nagybetűket keres a karakterlánc bármely mintájának keresésekor. A kis- és nagybetűk megkülönböztetés nélküli keresést az awk paranccsal lehet elvégezni a reguláris kifejezéssel. A következő példában leenged () függvény a kis- és nagybetűk megkülönböztetés nélküli keresésére szolgál. Itt a beviteli szöveg minden sorának első szava kisbetűvé konvertálódik a használatával leenged () funkció és illeszkedik a reguláris kifejezés mintájához. felfelé () függvény is használható erre a célra, ebben az esetben a mintát nagybetűvel kell meghatározni. A következő példában meghatározott szöveg tartalmazza a keresett szót, 'Web ”Két sorban, amelyeket kimenetként nyomtatnak ki.
$kidobta -És 'Webdesign nwebfejlesztés nKeretrendszer' | awk 'tolower ($ 0) ~ /^web /;'Kimenet:
awk NF (mezők száma) változóval
NF az awk parancs beépített változója, amely a bemeneti szöveg minden sorában lévő mezők teljes számának számlálására szolgál. Hozzon létre bármilyen szöveges fájlt több sorból és több szóból. az input.txt fájlt itt az előző példában létrehozott fájlt használjuk.
Az NF használata a parancssorból
Itt az első parancs a tartalom megjelenítésére szolgál input.txt fájl és a második parancs a mező minden számának megjelenítésére szolgál a fájl használatával NF változó.
$ cat input.txt$ awk '{print NF}' input.txt
Kimenet:
NF használata awk fájlban
Hozzon létre egy nevű awk fájlt gróf.wak az alábbi forgatókönyvvel. Ha ez a szkript bármilyen szöveges adatokkal végrehajtódik, akkor minden soros tartalom teljes mezővel nyomtatásra kerül.
gróf.wak
{print $0}{nyomtatás'[Összes mező:'NF']'}
Futtassa a szkriptet a következő paranccsal.
$awk -fcount.awk input.txtKimenet:
awk gensub () függvény
getub () egy helyettesítő függvény, amely a karakterláncok keresésére szolgál meghatározott elválasztó vagy reguláris kifejezési minta alapján. Ezt a funkciót a 'Gawk' csomag, amely alapértelmezés szerint nincs telepítve. Ennek a függvénynek a szintaxisa az alábbiakban található. Az első paraméter a reguláris kifejezés mintáját vagy keresési elválasztót tartalmazza, a második paraméter a helyettesítő szöveget, a harmadik paraméter a keresés módját jelzi, az utolsó paraméter pedig azt a szöveget, amelyben ezt a funkciót alkalmazni kell.
Szintaxis:
gensub(regexp, csere, hogyan[, cél])Futtassa a következő parancsot a telepítéshez gawk csomag a használathoz getub () függvény awk paranccsal.
$ sudo apt-get install gawkHozzon létre egy '' nevű szövegfájlt salesinfo.txt ’A következő tartalommal a példa gyakorlásához. Itt a mezőket tabulátor választja el.
salesinfo.txt
Az én 700 000 -emA te 800 000 -ed
Szerda 750000
Gyűjts össze 200000
P: 430000
Szo 820000
Futtassa a következő parancsot a salesinfo.txt fájlt és nyomtassa ki az összes értékesítési összeg teljes összegét. Itt a harmadik paraméter, a „G” jelzi a globális keresést. Ez azt jelenti, hogy a mintát a fájl teljes tartalmában keresik.
$awk '{x = gensub (' t ',' ',' G ', 2 USD); printf x '+'} VÉGE {print 0} 'salesinfo.txt| időszámításunk előtt -azKimenet:
awk rand () függvénnyel
sor() függvényt bármely 0 -nál nagyobb és 1 -nél kisebb véletlen szám előállítására használjuk. Tehát mindig 1 -nél kisebb törtszámot generál. A következő parancs egy töredékes véletlen számot generál, és megszorozza az értéket 10 -gyel, hogy több számot kapjon, mint 1. A printf () függvény alkalmazásához a tizedespont után két számjegyű tört szám kerül kinyomtatásra. Ha a következő parancsot többször futtatja, minden alkalommal más kimenetet kap.
$awk 'BEGIN {printf' Szám =%. 2f n ', rand ()*10}'Kimenet:
awk felhasználó által definiált függvény
Az előző példákban használt összes funkció beépített funkció. De deklarálhat egy felhasználó által definiált függvényt az awk szkriptjében, hogy elvégezzen egy adott feladatot. Tegyük fel, hogy egyéni függvényt szeretne létrehozni egy téglalap területének kiszámításához. A feladat elvégzéséhez hozzon létre egy fájlt terület.wak ’A következő szkripttel. Ebben a példában egy felhasználó által definiált függvény terület() deklarálva van a szkriptben, amely a bemeneti paraméterek alapján kiszámítja a területet, és visszaadja a terület értékét. getline parancsot itt használjuk a felhasználótól.
terület.wak
# Terület kiszámításafunkcióterület(magasság,szélesség){
Visszatérésmagasság*szélesség
}
# Elindítja a végrehajtást
KEZDŐDIK{
nyomtatás'Adja meg a magasság értékét:'
getline h< '-'
nyomtatás'Adja meg a szélesség értékét:'
getline w< '-'
nyomtatás'Terület ='terület(h,ban ben)
}
Futtassa a szkriptet.
$awk -fterület.wakKimenet:
awk ha példa
Az awk támogatja a feltételes utasításokat, mint más szabványos programozási nyelvek. Három típusú if állítás jelenik meg ebben a részben három példa segítségével. Hozzon létre egy szöveges fájlt items.txt a következő tartalommal.
items.txt
HDD Samsung 100 dollárEgér A4Tech
HP nyomtató 200 dollár
Egyszerű, ha példa :
a következő parancs elolvassa a items.txt fájlt, és ellenőrizze a 3rd mező értéke minden sorban. Ha az érték üres, akkor hibaüzenetet nyomtat a sorszámmal.
$awk '{if ($ 3 ==' ') print' Hiányzik az ár mező az 'NR}' sorbanitems.txtKimenet:
ha-más példa:
A következő parancs kinyomtatja a cikk árát, ha a 3rdmező létezik a sorban, ellenkező esetben hibaüzenetet nyomtat.
$ awk'{if ($ 3 ==' ') print' Az ármező hiányzik 'else print 'elem ára' $ 3} 'tételeket.txt
Kimenet:
ha-más-ha példa:
Amikor a következő parancs végrehajtásra kerül a terminálról, akkor a felhasználótól veszi fel. A bemeneti értéket minden feltétellel összehasonlítjuk, ha a feltétel igaz. Ha bármely feltétel valóra válik, akkor kinyomtatja a megfelelő osztályzatot. Ha a bemeneti érték nem felel meg semmilyen feltételnek, akkor a nyomtatás sikertelen lesz.
$awk 'BEGIN {print' Írja be a jelet: 'getline jel<'-'
ha (jel> = 90) 'A+' nyomtat
egyébként ha (jel> = 80) 'A' nyomtatás
egyébként ha (jelölés> = 70) 'B+' nyomtat
else print 'Fail'} '
Kimenet:
awk változók
Az awk változó deklarálása hasonló a shell változó deklarálásához. Különbség van a változó értékének olvasásában. A „$” szimbólum a shell változó nevével használható az érték olvasásához. De nem szükséges az „aw” változóval a „$” -t használni az érték olvasásához.
Egyszerű változó használata:
A következő parancs deklarálja a nevű változót 'webhely' és egy karakterlánc érték van hozzárendelve ahhoz a változóhoz. A változó értéke a következő utasításban van kinyomtatva.
$awk 'BEGIN {site =' LinuxHint.com '; nyomtatási webhely} 'Kimenet:
Változó használata adatok lekéréséhez egy fájlból
A következő parancs megkeresi a szót 'Nyomtató' az aktában items.txt . Ha a fájl bármely sora azzal kezdődik 'Nyomtató ’, Majd tárolja az értékét 1utca , 2nd és 3rd mezőket három változóba. név és ár változók lesznek nyomtatva.
$ awk'/ Nyomtató/ {name = $ 1; brand = $ 2; price = $ 3; print' item name = 'name;print 'item price =' price} 'tételeket.txt
Kimenet:
awk tömbök
A numerikus és a hozzá tartozó tömbök is használhatók az awk -ban. Az awk tömbváltozó deklarálása ugyanaz, mint más programozási nyelveknél. Ebben a részben a tömbök néhány felhasználását mutatjuk be.
Asszociatív tömb:
A tömb indexe tetszőleges karakterlánc lesz az asszociatív tömbhöz. Ebben a példában egy három elemből álló asszociatív tömböt deklarálunk és kinyomtatunk.
$awk 'BEGIN {books ['Web Design'] = 'HTML 5 tanulása';
books ['Web Programming'] = 'PHP és MySQL'
books ['PHP Framework'] = 'Learning Laravel 5'
printf '%s n%s n%s n', könyvek ['Web Design'], könyvek ['Web Programozás'],
könyvek ['PHP -keretrendszer]]} ”
Kimenet:
Numerikus tömb:
A három elemből álló numerikus tömböt a tabulátor elválasztja.
$ awk'BEGIN {szám [0] = 80;
szám [1] = 55;
szám [2] = 76;
# nyomtatási tömb elem
printf 'Tömbértékek: %d t%d t%d n', szám [0], szám [1], szám [2]; } '
Kimenet:
awk hurok
Az awk háromféle hurkot támogat. Ezen hurkok felhasználását itt mutatjuk be három példával.
Ciklus közben:
míg a következő parancsban használt ciklus 5 -ször iterál, és kilép a ciklusból a break utasításhoz.
$ awk 'BEGIN {n = 1; míg (n 5) szünet; print n; n ++}} 'Kimenet:
A hurokhoz:
A következő awk parancsban használt ciklus esetén az összeg 1 -től 10 -ig lesz kiszámítva, és kinyomtatja az értéket.
$awk 'BEGIN {összeg = 0; mert (n = 1; n<= 10; n++) sum=sum+n; print sum }'Kimenet:
Do-while ciklus:
a következő parancs do-while ciklusa minden páros számot 10-től 5-ig nyomtat.
$awk 'BEGIN {számláló = 10; do {if (számláló%2 == 0) nyomtatási számláló; számláló-- }while (számláló> 5)} '
Kimenet:
awk az első oszlop kinyomtatásához
Bármely fájl első oszlopa kinyomtatható az $ 1 változó használatával az awk -ban. De ha az első oszlop értéke több szót tartalmaz, akkor csak az első oszlop első szava nyomtatódik ki. Egy meghatározott határoló használatával az első oszlop megfelelően nyomtatható. Hozzon létre egy szöveges fájlt diákok.txt a következő tartalommal. Itt az első oszlop két szó szövegét tartalmazza.
Diákok.txt
Kaniz Fatema 30thtételAbir Hossain 35thtétel
János Ábrahám 40thtétel
Futtassa az awk parancsot határoló nélkül. Az első oszlop első része kinyomtatásra kerül.
$awk '{print $ 1}'diákok.txtFuttassa az awk parancsot a következő elválasztóval. Az első oszlop teljes része kinyomtatásra kerül.
$awk -F '\ s \ s' '{print $ 1}'diákok.txtKimenet:
awk az utolsó oszlop kinyomtatásához
$ (NF) változó bármely fájl utolsó oszlopának kinyomtatására használható. A következő awk parancsok kinyomtatják az utolsó és teljes oszlopát a diákok.txt fájlt.
$awk '{print $ (NF)}'diákok.txt$awk -F '\ s \ s' '{print $ (NF)}'diákok.txt
Kimenet:
awk a greppel
A grep a Linux másik hasznos parancsa, hogy bármilyen szabályos kifejezés alapján keressen tartalmat a fájlban. Az awk és a grep parancsok együttes használatát az alábbi példa mutatja be. markolat parancsot a munkavállalói azonosító információinak keresésére használják, ' 1002 ' tól től az alkalmazott.txt fájlt. A grep parancs kimenete bemeneti adatként az awk -ba kerül. 5% bónuszt számolunk és nyomtatunk a munkavállalói azonosító fizetése alapján, ' 1002 ' awk parancsra.
$macskaalkalmazott.txt$markolat '1002'alkalmazott.txt| awk -F ' t' '{print $ 2' $ '($ 3*5)/100' bónuszt kap '}'
Kimenet:
awk BASH fájllal
A többi Linux parancshoz hasonlóan az awk parancs is használható egy BASH szkriptben. Hozzon létre egy szöveges fájlt ügyfelek.txt a következő tartalommal. A fájl minden sora négy mezőben tartalmaz információkat. Ezek az ügyfél azonosítója, neve, címe és mobilszáma '/ '.
ügyfelek.txt
AL4934 / Charles M Brunner / 4838 Beeghley Street, Huntsville, Alabama / 256-671-7942CA5455 / Virginia S Mota / 930 Bassel Street, VALLECITO, Kalifornia / 415-679-5908
IL4855 / Ann A Neale / 1932 Patterson Fork Road, Chicago, Illinois / 773-550-5107
Hozzon létre egy bash fájlt item_search.bash a következő forgatókönyvvel. Ennek a szkriptnek megfelelően az állapotértéket a felhasználó elveszi, és megkeresi az ügyfelek.txt fájlja markolat parancsot, és bemenetként átadta az awk parancsnak. Awk parancs olvasni fog 2nd és 4th minden sor mezőit. Ha a bemeneti érték megegyezik a ügyfelek.txt fájlt, akkor kinyomtatja az ügyfélét név és mobil szám , különben kinyomtatja az üzenetet Nem található ügyfél .
item_search.bash
#!/bin/bashkidobta 'Írja be az állam nevét:'
olvasállapot
ügyfelek=``markolat '$ állam'ügyfelek.txt| awk -F '/' '{print' Ügyfél neve: '$ 2,',
Mobilszám: '$ 4}'``
ha [ '$ ügyfelek' !='' ];azután
kidobta $ ügyfelek
más
kidobta 'Nem található ügyfél'
lenni
Futtassa a következő parancsokat a kimenetek megjelenítéséhez.
$macskaügyfelek.txt$bashitem_search.bash
Kimenet:
awk seddel
A Linux másik hasznos keresési eszköze sed . Ez a parancs használható bármely fájl keresésére és szövegének cseréjére. A következő példa az awk parancs használatát mutatja be sed parancs. Itt a sed parancs megkeresi az összes alkalmazott nevét: J ”És bemenetként átmegy az awk parancsra. awk kinyomtatja az alkalmazottat név és Azonosító formázás után.
$macskaalkalmazott.txt$sed -n '/J/p'alkalmazott.txt| awk -F ' t' '{printf'%s (%s) n ', $ 2, $ 1}'
Kimenet:
Következtetés:
Az awk paranccsal különböző típusú jelentéseket hozhat létre táblázatos vagy elhatárolt adatok alapján, az adatok megfelelő szűrése után. Remélhetőleg az ebben az oktatóanyagban bemutatott példák gyakorlása után megtudhatja, hogyan működik az awk parancs.