Fórum Root.cz
Hlavní témata => Software => Téma založeno: mikesznovu 30. 09. 2024, 12:44:03
-
Mám problém u 3MB vstupního textu, pouštím na něj grep a vypisuje to na terminálu asi 4-8 výskytů za sekundu -což je tragédie. (armv7l Cortex A53 38 BogoMips) víc jak 30s. asi Jak to urychlit? Vtipný je ,že když místo patternu změním https: za http: tak je to do 5s hotové i když tam ponechám výraz, které je pro https: pomalý[^/]+. , neboli to není triviální https:..............
to nejduležitější: Přepínače jsou -o a -P. Výraz je
: "https://\\K[^/]+"
Zkoušel jsem to downgradovat postupně, až jsem došel na na grep -o https:................................. Což je dostatečně rychlé. Stejně rychlé jako -o -E https:.{60}... To by šlo použít (a následně použít pípu s druhým grepem, což bude mnohem rychlejší na menším množstvím textu), ale má to jednu nevýhodu, že to vyřadí některé výskyty, kde se vyskytuje nový řádek ,což tedy nechci. A znak CR+LF se javascriptu vyskytuje ,že
Varianty:
odmazat \K
nahradit [^/]+ za .+?/ (funguje jeno s grep -P , zatímcto s grep -E to tiše funguje chybně)
nahradit za ....
curl "https://www.nytimes.com/fides/api/v1/privacy-experience?show_disabled=false®ion=eea&component=overlay&has_notices=true&has_config=true&systems_applicable=true&include_gvl=true&include_meta=true" |grep -Eo ":\"https://.{45}" | grep
# je rychlé ale vyřadí to záznamy kde se vyskytuje newline po 45 znacích
Za další , zkusil jsem magický přepínač grep -z. ale s přepínačem -P je pomalý, -s E rychlý. proč?
https://www.nytimes.com/fides/api/v1/privacy-experience?show_disabled=false®ion=eea&component=overlay&has_notices=true&has_config=true&systems_applicable=true&include_gvl=true&include_meta=true
Mimochodem doporučuji to sosnout ,wgetnout grepnout ,sortnout a uniqnout a uvidíte věci . (Je tam pár false positives)
-
Perl regex (-P) a extended regex (-E) jsou dvě různé implementace, rychlost je může dost lišit. A mají trochu jinou syntax. Mimochodem, -P -z je experimentální kombinace.
Co má být ".+?"? Nemá to být ".*"? (Z hlavy nevím priority.)
Bez -K se lze obejít použitím nástroje sed. Buď následně odstranit všechna http:// ze začátku řádku, případně se na greo vykašlat úplně a řešit to jen sedem.
-
Problém se mi zredukoval na to, že -P je pomalejší než -E... Nakonec jsem přišel i na jednogrepovou pipeline |grep -Ezo ":\"https://.[^/]+" . Doba trvání je 2s cpu času mínus 1.6 na download ,což už jde (bohužel time měří i download a nechce se mi to ukládat, zatímco v bashi 5.1 jde příkaz time za pípu tak v 5.0 to nejde a curl zahlásí failed to) ...
Ale zarazilo mě, že to -P je šíleně pomalé.
Jo, \K je syntaktický sugar, navíc v -E nefunguje.
pps://.+?/ je "aspoň 1 znak, požrat minimum, co je možné" narozdíl od varianty bez "?", to je greddy/ungreedy operátor(modifikátor?), tím pádem by tam šlo i použít ttps://.*?/, protože doména má minimálně 7 znaků (snad to není Jirsák trigger)
Ale důležité je to lomítko za ,aby to kde to má skončit. takže ps://.*?/ je stejné jako ps://[^/]+/
-
Chápu, že jde o nevyžádanou radu a nevím, nakolik to na Tvé platformě je možné, ale zkusil jsi nepoužít grep a nahradit ho něčím jiným? Kupř. ripgrep (musí mít --features 'pcre2') to na mém laptopu chroupe 22 ms a grep 7,6 s. To je dost zásadní rozdíl a důvod grep nepoužívat, pokud to je možné.
-
+1 za ripgrep :) odkedy som nan presiel prakticky grep nepouzivam okrem trivialit.