Wyrażenie regularne i globbing w jednym narzędziu czyli: czego nie da ci grep

regexpCzasem przydaje się narzędzie, które umożliwia szybkie znalezienie istotnych informacji w gąszczu informacyjnego szumu. Przykładem niech będzie chociaż przetwarzanie logów i dzienników zdarzeń systemów informatycznych.

Możemy oczywiście w tym celu posłużyć się narzędziami systemowymi typu grep, sed, ed czy awk, jeśli akurat mamy je pod ręką. Jednak możliwe jest także niemal błyskawiczne opracowanie własnego narzędzia skryptowego.

Dziś chciałbym zaprezentować jedno z takich właśnie narzędzi. Tym razem dla odmiany, jako niemal skryptowy poliglota🙂 posłużyłem się językiem Tcl, do którego od lat czuję głęboki i trwały sentyment.

Skrypt czyta dane ze standardowego wejścia, metodą wiersz po wierszu, aż do napotkania EOF (end of file), po czym przetwarza je zgodnie z uzyskanymi instrukcjami. Zaś instrukcje te możemy podzielić na dwie kategorie: wyrażenia regularne i globbing (czyli dopasowywanie do znaków uogólniających, takich jak w systemach unixowych – i nie tylko – używa się do uogólniania ścieżek i nazw obiektów w systemach plikowych).

Informację o poprawnej składni uzyskujemy posługując się opcją -help

$ tclsh regexp_and_globb.tcl -help
regexp_and_globb - A simple script to parsing logs (Janusz Nawrat - 2014)
 -o value             Which operation to perform (regexp or glob) 
 -p value             Matching pattern to apply <>
 --                   Forcibly stop option processing
 -help                Print this message
 -?                   Print this message

Jeśli użytkownik pominie w linii poleceń obowiązkowe parametry -o (rodzaj operacji) i -p (wzorzec dopasowania), to skrypt w trybie interakcyjnym zapyta o te parametry na etapie działania.

Danych wejściowy dostarczamy skryptowi na kilka sposobów:

 cat plik_z_danymi_wejsciowymi.log | tclsh skrypt.tcl -o operacja -p wzorzec_dopasowania

albo

tclsh skrypt.tcl -o operacja -p wzorzec_dopasowania < plik_z_danymi_wejsciowymi.log

…lub w najgorszym razie przez wprowadzenie danych z poziomu klawiatury.

Działając w trybie przetwarzania wyrażeń regularnych, skrypt pokazuje na wyjściu nie tylko znalezione globalne dopasowanie, ale – co bardzo pożyteczne – dopasowania do poszczególnych elementów (podgrup w nawiasach) wyrażenia regularnego.

Na przykład w odpowiedzi na: tclsh regexp_and_globb.tcl -o regexp -p „(while)(\s+)(.*?)(\[.+\])” < regexp_tool.tcl otrzymujemy coś takiego (fragment):

Not matched! :(
$-----
while { ![eof stdin] } {
1:      while { ![eof stdin]
2:      while
3:
4:      { !
5:      [eof stdin]
$-----
        set string [gets stdin]
Not matched! :(
$-----
        switch $operation {
Not matched! :(

Jak zwykle polecam modyfikowanie skryptu i jego dostosowywanie do własnych potrzeb.

Jeśli zastanawiacie się nad wyborem interpretera języka Tcl, to mogę Wam z pełnym przekonaniem polecić dystrybucję ActiveState dostępną w darmowej wersji na ich stronach internetowych.

Jeśli rozważacie możliwość udostępniania innym użytkownikom swoich narzędzi napisanych w Tcl-u, to możecie wziąć pod uwagę opcję ich pakowania do postaci plików wykonywalnych w środowisku Windows. Może do tego posłużyć darmowe narzędzie freewrap dostępne pod adresem: http://freewrap.sourceforge.net/.

Oto kod źródłowy skryptu:

package require cmdline

set parameters {
    {o.arg "regexp"   "Which operation to perform (regexp or glob)"}
    {p.arg ""         "Matching pattern to apply"}
}

set usage "- A simple script to parsing logs (Janusz Nawrat - 2014)"

if {[catch {array set options [cmdline::getoptions ::argv $parameters $usage]}]} {
    puts [cmdline::usage $parameters $usage]
} else {
    # parray options
   set param ""
   # Verify required parameters
   set requiredParameters {o p}
   foreach parameter $requiredParameters {
      if {$options($parameter) == ""} {
         puts stderr "Missing required parameter: $parameter"
         switch $parameter {
            o {
               set param "operation type (regexp or glob) parameter"
            }
            p {
               set param "matching pattern (appropriate to operation type)"
            }
         }
         puts -nonewline "Enter the $param: "; flush stdout
         gets stdin options($parameter)
      }
   }
   # parray options
   set operation $options(o); set pattern $options(p)
}

while { ![eof stdin] } {
   set string [gets stdin]
   switch $operation {
      regexp {
         if {[regexp $pattern $string match]} {
            set match_array [regexp -inline -all $pattern $string]
            set counter 1
            puts $-----\n$string
            foreach elem $match_array {
               puts [format "%i:\t%s" $counter $elem]
               set counter [incr counter]
            }
         } else {
            puts $-----\n$string
            puts "Not matched! :("
         }
      }
      glob {
         if [string match $pattern $string] {
            puts "Match found in string: $string"
         } else {
            puts $-----\n$string
            puts "Not matched :("
         }
      }
      default {
         if {[regexp $pattern $string match]} {
            set match_array [regexp -inline -all $pattern $string]
            set counter 1
            puts $-----\n$string
            foreach elem $match_array {
               puts [format "%i:\t%s" $counter $elem]
               set counter [incr counter]
            }
         } else {
            puts $-----\n$string
            puts "Not matched! :("
         }
      }
   }
}

Informacje Janusz Nawrat
Just ordinary man who likes thinking...

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

TOMASZ WEŁNA

artysta grafik | wykładowca

PRACOWNIA OKO

Szkoła Rysunku Malarstwa i Grafiki DR TOMASZA WEŁNY | KRAKÓW | Plac Matejki 10 | tel 691 81 75 74

Piękno neurobiologii

Blog Jerzego Vetulaniego

Teoria muzyki, zasady muzyki, podstawy muzyki

Teoria muzyki, zasady muzyki, podstawy muzyki - czyli to co każdy amator muzyki wiedzieć powinien :)

Personal Development & Inspirations

Przemyślenia i refleksje, którymi warto się podzielić (blog by Janusz Nawrat)

Business IT Cooperation Platform

Biznes i IT - dwa światy, które muszą współdziałać

%d bloggers like this: