Používáte GNU grep? A víte, jak funguje uvnitř? Ondřej Guth ondrej.guth@fit.cvut.cz LinuxDays 2017 Ondřej Guth GNU grep LD 17 1 / 14
1 Úvod 2 Přehled zpracování vstupu 3 Obyčejný řetězec jako regulární výraz BM algoritmus BM a grep 4 Shrnutí Ondřej Guth GNU grep LD 17 2 / 14
Úvod Čím se budeme zabývat Verze GNU grep 3.1 (Gentoo GNU/Linux) Configure --disable-nls --with-included-regex Ondřej Guth GNU grep LD 17 3 / 14
Úvod Rychlost Prohledávání souboru o velikosti 2,1G: time grep kernel /tmp/syslog > /dev/null real 0m0.023s user 0m0.001s sys 0m0.022s time awk /kernel/ /tmp/syslog > /dev/null real 0m7.233s user 0m6.850s sys 0m0.383s Ondřej Guth GNU grep LD 17 4 / 14
Přehled zpracování vstupu Postup 1 Tokenizace výrazu 2 Překlad výrazu do strukturního stromu (libc) 3 Zpracování vstupu prohledávací funkcí 4 V případě nalezeného výskytu vyhledání hranic řádku (a výpis) Ondřej Guth GNU grep LD 17 5 / 14
Přehled zpracování vstupu Překlad výrazu do strukturního stromu jojoj CONCAT CONCAT END OF RE CONCAT j CONCAT o CONCAT j j o Ondřej Guth GNU grep LD 17 6 / 14
Obyčejný řetězec jako regulární výraz Algoritmy Souvislé řetězce v RV kwset matcher jeden vzorek: algoritmus BM více vzorků: algoritmus AC Ondřej Guth GNU grep LD 17 7 / 14
Obyčejný řetězec jako regulární výraz BM algoritmus Protisměrné vyhledávání Méně porovnání než je znaků vstupu. Příklad j o j k j o j o j j o j o j j o j o j Ondřej Guth GNU grep LD 17 8 / 14
Obyčejný řetězec jako regulární výraz BM algoritmus Algoritmus Boyer-Moore Varianta použitá v GNU grep kwset matcher Posun v případě neshody: Bad character shift Nejbližší výskyt prvního přečteného znaku (zprava) z textu ve výrazu. delta2 Zarovnání výrazu na další opakování dosud přečtené části textu. Ondřej Guth GNU grep LD 17 9 / 14
Obyčejný řetězec jako regulární výraz BM algoritmus Algoritmus Boyer-Moore Bad character shift BCS pro jojoj j: 0 o: 1 k: 5 Příklad j o j o o k j o j o j j o j o j j o j o j j o j o j Posun: 1. Posun: 5. Posun: 0. Ondřej Guth GNU grep LD 17 10 / 14
Obyčejný řetězec jako regulární výraz BM algoritmus Algoritmus Boyer-Moore Varianta použitá v GNU grep kwset matcher Posun v případě neshody: Bad character shift Nejbližší výskyt prvního přečteného znaku (zprava) z textu ve výrazu. delta2 Zarovnání výrazu na další opakování dosud přečtené části textu. Ondřej Guth GNU grep LD 17 11 / 14
Obyčejný řetězec jako regulární výraz BM algoritmus Algoritmus Boyer-Moore delta2 Příklad K Y K Y R Y K Y 0 6 6 6 6 4 6 2 Ondřej Guth GNU grep LD 17 12 / 14
Obyčejný řetězec jako regulární výraz BM a grep Zpracování vstupu v GNU grep Příklad K Y K Y K Y K Y R Y K Y\nY K Y K Y R Y K Y K Y R Y K Y K Y K Y K Y RK Y K Y R Y K Y K YK KY YK RY YR KY YK Y BCS pro Y je 0 delta2 pro YKY je 4 výkyt, hranice řádku (memchr a memrchr), výpis, další řádek BCS pro K je 1 delta2 K Y K Y R Y K Y 0 6 6 6 6 4 6 2 Ondřej Guth GNU grep LD 17 13 / 14
Shrnutí Závěr hledání s kwset matcher pro jeden vzorek BM algoritmus hledání s kwset matcher pro více vzorků (grep -e vz1 -e vz2) AC algoritmus počítání tabulek pro posuvy komplikovanější vzorky Ondřej Guth GNU grep LD 17 14 / 14