Ako zavolať externý program pomocou awk


Úvod

Awk je výkonný nástroj na spracovanie textu, ktorý možno použiť na automatizáciu rôznych úloh, ako je manipulácia s údajmi, filtrovanie a vytváranie prehľadov. Jednou zo zaujímavých vlastností awk je jeho schopnosť volať externé programy zo skriptu. V tomto článku preskúmame, ako zavolať externý program pomocou awk.

Pochopenie funkcie System().

Funkcia system() sa používa na vykonávanie externých príkazov z awk. syntax funkcie system() je nasledovná −

system(command)

Argument príkazu je externý príkaz, ktorý chceme vykonať. Keď sa vykoná funkcia system(), awk odovzdá argument príkazu shellu na vykonanie. shell potom vykoná príkaz a vráti stav ukončenia na awk.

Volanie externého programu

Na zavolanie externého programu pomocou awk musíme zadať príkaz, ktorý chceme vykonať ako argument funkcie system(). Povedzme napríklad, že chceme spustiť príkaz dátumu zo skriptu awk. Môžeme to urobiť nasledovne -

{ 
   system("date") 
}

V tomto príklade voláme príkaz date pomocou funkcie system(). Po spustení skriptu sa vykoná príkaz dátumu a na obrazovke sa zobrazí aktuálny dátum a čas.

Odovzdávanie vstupu do externého programu

Vstup do externého programu môžeme odovzdať pomocou funkcie system(). Povedzme napríklad, že chceme triediť zoznam čísel pomocou príkazu sort. Môžeme to urobiť nasledovne -

{ 
   print "3
1
2" | "sort" 
}

V tomto príklade používame príkaz print na vygenerovanie zoznamu čísel (3, 1, 2). Potom použijeme symbol zvislej čiary (|) na odovzdanie tohto zoznamu čísel ako vstup príkazu na triedenie. príkaz sort potom zoradí čísla a vráti výsledok do awk.

Ukladanie výstupu externého programu

Výstup externého programu môžeme uložiť do premennej pomocou funkcie getline(). Funkcia getline() sa používa na čítanie riadku vstupu zo súboru alebo príkazu. Na zachytenie výstupu externého programu môžeme použiť funkciu getline(). Povedzme napríklad, že chceme zachytiť výstup príkazu ls do premennej. Môžeme to urobiť nasledovne -

{ 
   "ls" | getline output 
   print output 
}

V tomto príklade používame funkciu system() na vykonanie príkazu ls. Potom používame funkciu getline() na zachytenie výstupu príkazu ls do výstupnej premennej. Nakoniec používame príkaz print na zobrazenie výstupu príkazu ls.

Odovzdávanie argumentov externému programu

Argumenty môžeme odovzdať externému programu pomocou funkcie system(). Povedzme napríklad, že chceme previesť reťazec na veľké písmená pomocou príkazu tr. Môžeme to urobiť nasledovne -

{ 
   str = "hello world" 
   cmd = "echo " str " | tr '[:lower:]' '[:upper:]'" 
   cmd | getline output 
   print output 
}

V tomto príklade používame príkaz echo na odovzdanie reťazca „hello world“ ako vstup do príkazu tr. Potom používame príkaz tr na prevod reťazca na veľké písmená. Nakoniec používame funkciu getline() na zachytenie výstupu príkazu tr do výstupnej premennej.

Spracovanie chýb

Pri volaní externého programu pomocou awk je dôležité zvládnuť chyby, ktoré sa môžu vyskytnúť počas vykonávania. Stav ukončenia externého programu môžeme skontrolovať pomocou funkcie system(). výstupný stav je číslo, ktoré označuje úspech alebo zlyhanie príkazu. Hodnota nula znamená úspech, zatiaľ čo nenulová hodnota znamená zlyhanie.

Povedzme napríklad, že chceme pomocou príkazu test skontrolovať, či súbor existuje. Môžeme to urobiť nasledovne -

{ 
   file = "myfile.txt" 
   cmd = "test -e " file 
   if (system(cmd) != 0) { 
      print "File does not exist" 
   } else { 
      print "File exists" 
   } 
}

V tomto príklade používame príkaz test na kontrolu, či súbor "myfile.txt" existuje. Potom používame funkciu system() na vykonanie testovacieho príkazu. Ak je výstupný stav testovacieho príkazu nenulový, vypíšeme "Súbor neexistuje". V opačnom prípade vytlačíme „Súbor existuje“.

Pokročilé príklady

  • Filtrovanie výstupu externého programu Výstup externého programu môžeme filtrovať pomocou awk. Povedzme napríklad, že chceme zobraziť iba prvý riadok výstupu príkazu ps. Môžeme to urobiť nasledovne -

{ 
   cmd = "ps" 
   cmd | getline output 
   close(cmd) 
   split(output, lines, "
") 
   print lines[1] 
}

V tomto príklade používame funkciu getline() na zachytenie výstupu príkazu ps do výstupnej premennej. Potom používame funkciu split() na rozdelenie výstupu do poľa riadkov. Nakoniec používame príkaz print na zobrazenie prvého riadku výstupu.

  • Používanie premenných awk v externých príkazoch Premenné awk môžeme použiť v externých príkazoch. Povedzme napríklad, že chceme vytvoriť súbor s názvom na základe premennej pomocou dotykového príkazu. Môžeme to urobiť nasledovne -

{ 
   filename = "myfile.txt" 
   cmd = "touch " filename 
   system(cmd) 
}

V tomto príklade používame premennú názvu súboru v dotykovom príkaze na vytvorenie súboru s názvom "myfile.txt".

  • Použitie awk na formátovanie výstupu externého programu Awk môžeme použiť na formátovanie výstupu externého programu. Povedzme napríklad, že chceme zobraziť výstup príkazu df v čitateľnejšom formáte. Môžeme to urobiť nasledovne -

{ 
   cmd = "df -h" 
   cmd | getline output 
   close(cmd) 
   printf "%-20s%-10s%-10s%-10s%-10s%s
", "Filesystem", "Size", "Used", "Avail", "Use%", 
   "Mounted on" 
   split(output, lines, "
") 
   for (i=2; i<=length(lines); i++) { 
      printf "%-20s%-10s%-10s%-10s%-10s%s
", $1, $2, $3, $4, $5, $6 
   } 
}

V tomto príklade používame príkaz printf na formátovanie výstupu príkazu df. Tlačíme riadok hlavičky s nadpismi stĺpcov, po ktorom nasleduje výstup príkazu df s každým stĺpcom zarovnaným na pevnú šírku.

Záver

V tomto článku sme skúmali, ako zavolať externý program pomocou awk. Videli sme, ako odovzdať vstup externému programu, zachytiť výstup externého programu a zvládnuť chyby, ktoré sa môžu vyskytnúť počas vykonávania. Použitím schopnosti awk volať externé programy môžeme automatizovať rôzne úlohy a urobiť naše skripty výkonnejšími a flexibilnejšími.