Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Blog Ubuntu -- Správa "projektů" české komunity Ubuntu

Novinky: Školení nejen k OS Ubuntu pro širokou veřejnost, více informací zde.

Autor Téma: Vyhledávání v Logách a základní použití RE ..  (Přečteno 28550 krát)

nettezzaumana

  • Host
Vyhledávání v Logách a základní použití RE ..
« kdy: 23 Listopad 2007, 14:33:11 »
Fujtajbl vespolek..

dnes si povíme o logování v Linuxu a způsobech, jak díky němu odhalit příčiny mnoha běžných problémů..
Na příspěvku jsem si dal docela dost práce, ale pokud ho dočtete do konce, nebudete zklamáni, protože v samotném závěru se na vlastní oči přesvědčíte, že i vy se můžete dostat až přímo k srdci problému, protože abych demonstroval co jsem zde napsal, demaskoval jsem v rámci tohoto návodu a hledání v logách kernelový bug na svém ntb.. ;)

--------------------------------------------
Intro -- Úvod do Logů
--------------------------------------------

Co to je to Log? Log bohužel není dle rozšířené představy ono samotné hlášení, ale je to až výstup z programu (nebo fce), který tato hlášení zachytává a obvykle následně zapíše do souboru a uloží na místo k tomu určené. Nejrozšířenější logovací démon je syslogd/syslogd-ng // new generation //, který se specializuje na zachytávání hlášení kernelu a jeho modulů. Stejně tak i většina ostatních programů má určité logovací funkce, která zachytávají hlášení ze stdout (standartní výstup) a zapisují je do souboru na disk.. Log je tedy seznam interních hlášení programu o tom, co provádí a jeho případné upozornění na chyby a problémy za běhu..
Logy v Linuxu jde v zásadě rozdělit na 2 skupiny ::

1) Hlášení jádra: "ukecanost" kernelu jde změnit předáním parametru 'loglevel=n' při bootu systému. Místo 'n' se dává číslo v rozsahu 0-7, přičemž 0 je žádná hlášení a 7 je nejvyšší míra "ukecanosti". Defaultní hodnota je AFAIK 'loglevel=3' ..
Hlášení jádra při bootování obstarává log jménem 'dmesg' (/var/log/dmesg) .. Ostatní logování zajišťuje typicky syslog (/var/log/syslog, /var/log/messages, ..) .. Pokud by nám nestačila základní logovací schopnost kernelu, můžeme při jeho ruční kompilaci zaškrtnout položky "extra debugging symbols" v sekci "kernel hacking" a nebo většina distribucí nabízí předkompilované jádro s touto volbou, které obvykle bývá označeno linux-2.6.x-debug ..

2) Všechna ostatní hlášení zbývajících programů: obvykle se jedná o často konfigurovatelné funkce konkrétních programů, které z konvence zapisují hlášení o běhu do /var/log (aka Xorg.log, vsftpd.log aj), ale i různě jinam. Některé externí programy se přímo kompilují s podporou knihoven syslogu -- překvapivě to je <syslog.h>

Pokud tedy na našem běžícím systému identifikujeme nějaký problém, bývá užitečné zaslídit v logách, které by nám mohly napovědět a nebo rovnou pomoci diagnostikovat danou závadu. Tento článek budiž malý úvod i s příklady, jak vyhledávat v logách a jak diagnostikovat problémy.

Protože budeme pracovat s příkazovým interpretem, zopakujeme si v první části základní příkazy, které pro vyhledávání použijeme..
V rámci těchto příkladů si zopakujeme některé základní a jednoduché regulární výrazy, shellové struktury a přesměrování, která se pokusím srozumitelně popsat.

Ve druhé části se podíváme a popíšeme si možnosti při diagnostikování a řešení samotných problémů.

A nakonec ve třetí části demaskujeme kernelový bug nejen v syslogu, ale navíc přímo ve zdrojácích kernelu..

--------------------------------------------
První část -- Syntax Reference
--------------------------------------------

$ man cat  // příkaz cat je jeden z nejzákladnejších unixových příkazů a vypíše obsah souboru, ale umí i mnoho dalších věcí..
$ cat -n /etc/X11/xorg.conf  // vypíše xorg.conf a očísluje řádky
$ cat /dev/cdrom &>image.iso  // vytvoří z Vašeho cdčka image.iso
$ cat <<'EOF'>file.txt  // editor pro drsňáky pomocí cat. Otevře soubor pro zápis a ukončí ho napsáním a odklepnutím 'EOF' (End-Of-File) .. hodí se například v případě, že potřebujeme 'ohackovat' modem od o2, na který se sice přes telnet přihlásíme, ale který z bezpečnostních důvodů neobsahuje žádné nástroje pro práci s textem..

$ man grep // filtr pro vyhledávání. Příkaz grep je jeden z nejmocnějších unixových příkazů. Pokud hledáme něco konkrétního v dlouhém textovém souboru, je nenahraditelný. Dáte-li mu parametr "-E", bude fungovat jako 'egrep' (enhanced grep) a vstupní filtr bude automaticky považovat za regulární výraz (dále jen 'RE' aka 'regular expression' -- viz níže) a ne jako prostý 'řetězec'..
Nuže do toho.. grep se typicky používá v souvislosti s 'přesměrováním' :

$ dmesg | grep 'error' // vypíše všechny řádky, na kterých je výraz "error" (pozor - case sensitive) z příkazu dmesg.
$ cat /var/log/syslog | grep -E 'error|Error|ERROR'  // jako výše uvedený příklad, akorát zde jsem použil egrep a konstrukci OR (samotný grep OR neumí, a onen 'výraz' by považoval za prostý řetězec k vyhledání, takže parametr "-E" je zde nezbytný) pomoci znaku "|", která nám zajistí výpis řádků s rozdílným zápisem výrazu "error" (aka "Error", "ERROR", etc..).

!! Pro pochopení a používání RE je nezbytné, abychom si zapamatovali význam znaků "|" a "\" (escapování -- viz. níže). Je to důležité proto, že složitější RE vypadá často dost nečitelně, ale navyknete-li Vaše oko automaticky participovat části výrazu oddělené |, čitelnost a srozumitelnost se náležitě zvýší. Stejně platí u escapování: \ vypadá často dost "matoucně", ale v 95% případů escapuje znak za ním, který je pak většinou důležitý..

$ grep -Erv 'error' /var/log // parametr '-r' způsobí, že prohledá složku /var/log rekurzivně, '-E' už známe a v tomhle případě není třeba, protože nepředáváme RE, ale jednoduchý řetězec "error" a nakonec parametr '-v' způsobí, že naopak vyřadí všechny řádky obsahující tento výraz, takže vlastně toto byl příklad naprosto neužitečného vyhledávání, protože všechny řádky s výrazem "error" jsou nám zapovězeny..

$ grep -Ev '^#|^;|^$' /etc/samba/smb.conf  // podobný příklad jako výše. V tomto případě už používáme opravdové RE a volba '-E' je tedy nutná. Tento příkaz vypíše obsah souboru smb.conf a vyřadí z něj všechny komentáře a prázdné řádky (řádky začínající znaky "#" a ";") .. V této souvislosti si zapamatujeme dva metaznaky v regulárním výraze, a sice "^" -- začátek řádku, a "$" -- konec řádku. Takže například:

$ ls . | grep -E '\.sh$'  // způsobí, že výstup z příkazu 'ls .' filtrujeme grepem a zajímají nás v tuto chvíli všechny položky končící ".sh" .. Všimněte si také, že máme použitu konstrukci '\.', což znamená, že díky znaku "\" jsme vyescapovali další metaznak v regulárních výrazech a sice "." (escapovaním jsme ji nepoužili jako metaznak, ale jako klasický znak v řetězci), která znamená libovolný jeden znak. Takže teď je nám jasné, že pokud bychom chtěli najít v nějakém souboru řetězec "..^$^..", budeme muset zadat následující výraz '\.\.\^\$\^\.\.' aby se nám naše znaky interpretovaly jako znak v textu a ne jako metaznak RE. Takže..

$ prikaz | grep -Ev '^.$|^\.'  // ..v tomto případě vyřadí grep z výstupu prikazu všechny řádky na kterých je pouze jeden libovolny znak vč. mezery a dále všechny řádky začínající tečkou .. Dále si ukážeme, jak vyhledávat komplikovanější řetězec pomocí opakování žolíkového znaku tečky:

$ prikaz | grep -E 'ACPI.*(error|Error|ERROR)'  // vyhledá všechny řádky na nichž je výraz 'ACPI' následovaný libovolným řetězcem a dále slovem "error", "Error" a nebo "ERROR" (např. řetězec "ACPI is ERROR"). Všimněte si zde použití kulatých () pro "vložený výraz" a dalšího metaznaku "*", který znamená libovolné množství opakování předchozího znaku, takže například '^.*$' je elementární příklad pro řádek s libovolným obsahem, takže
$ '^a*x.*\.mp3$' je výraz pro vše co začíná "a" a jako další znak je neomezený počet dalších "a", následovaný jedním "x" a dalšími libovolnými znaky a končící ".mp3" (např. "aaxyz.mp3", ale už ne "aabxyz.mp3").. Je jasné, že chceme-li vyhledat výraz "*.mp3", musíme použít '\*\.mp3'..
!! Při použití * musíme výraz omezit jako '^vyraz*$' (začátek a konec řádku)
Nyní v rychlosti předvedu ještě jednu konstrukci pomocí "[]" na výše uvedených příkladech..

$ prikaz | grep -E '^[0-9]{2,3}\.'  // vyhledá ve výstupu příkazu všechny řádky začínající na 2-3 znaky dlouhý řetězec čísel následovaný tečkou -- takže např. začátek ip adresy .. tyto závorky [] se používají k přesnému vymezení znaku, a buď se do nich dá rozsah ala:
'[0-9]'" jako všecha čísla,
'[a-n]' jako písmena v lowercasu v rozsahu a-n,
'[a-zA-Z]' jako rozsah pro celou abecedu bez národních znaků jak kapitálkama, tak malým písmem,
'[#;@]' jako skupina znaku "#", ";" a "@" (takže výše uvedený příklad na vyřazení komentářů ze smb.conf jde udělat i takto grep -Ev '^[#;]')..

$ prikaz | grep -A2 -B2 'prdlajz'  // oddychový příklad na závěr, kdy grep navíc vypíše po dvou řádcích před (-B // aka before) a po (-A // aka after) kontextu "prdlajz" ..

$ man tail  // zobrazí jenom konec souboru, defaultně 10 řádků
$ man head  // zobrazí začátek souboru, o5 defaultně 10 řádků..
Když pro oba tyto příkazy použijeme přepínač "-n x", kde x je číslo, zobrazí se nám požadovaný počet řádků, takže:
$ dmesg | tail -n 25  // zobrazí posledních 25 řádků z dmesg

!! Cykly, které si předvedeme, rozhodně doporučuji vyzkoušet a pokusit se je pochopit. Cykly jako takové nebudu popisovat. Prostě je zkuste a pohrajte si s nima -- případně použijte google.
Nyní se podíváme na elementární použití a zápis cyklů na jeden řádek:


$ for x in klaus topolanek paroubek bursik; do echo "$x"; done  // základní zápis cyklu for
$ for x in $(ls ~); do echo "$x"; done  // stejný zápis jako o řádek výše, akorát že jednotlivé elementy zde nemáme ručně, ale dostaneme je z příkazu 'ls ~' .. Cykly jdou samozřejmě kombinovat:

$ for x in $(ls /etc); do if [ ! -d "/etc/$x" ]; then echo "$x"; fi; done // zde to po rozboru na řádky vypadá takto:
// for x in $(ls /etc); do    // "pro proměnou x obsahující výstup jednoho řádku při provádění 'ls /etc'
//    if [ ! -d "/etc/$x" ]; then    // "ověř, není-li řádek adresář. Pokud je, podmínka se nesplní a následuje další kolo..
//      echo "$x"    // "..a není-li, tak nám vytiskni jeho jméno v aktuálním kole jako proměnnou "$x"..
//    fi
// done

$ for ((x=1;x<10;x++)) { echo "$x"; }  // C-like syntaxe pri dalším typickém nasazení for..
$ echo $PATH | awk -F: '{ for(x=1;x<NF+1;x++) { print $x; }}'  // použití for s příkazem awk. Zde je použit přepínač "-F" (file separator) s hodnotou ":", který nám rozdělí $PATH na pole oddělená ":" a v každém průběhu cyklu vytiskne jedno pole. Za zmínku stojí proměnná "NF", což je interní proměnná příkazu awk (viz. 'man awk' a sekce built-in variables) a znamená "Number of Fields". Jedničku přičítáme abychom vytiskl i poslední člen, jinak bychom místo "<" (menší než) potřebovali "=<" (menší nebo rovno) ..

$ while :; do clear && cat /var/log/syslog | tail -n 20 && sleep 2; done  // takže zde si vytvoříme cyklus while, který probíhá dokud ho ručně nestopneme a zobrazuje nám v realtimu nové zápisy v syslogu na posledních 20 řádcích s obnovením jednou za 2 sekundy .. Zde si všimněte mého zápisu prikaz1 && prikaz2 && prikaz3 a vyzkousejte sami rozdil mezi:
$ sleep 100; echo "cucis, co.."  // spusťte tento příkaz a hned ho stopněte pomocí Ctrl+c
$ sleep 100 && echo "no, a ted uz nemas ani nac.."  // dtto

--------------------------------------------
Druhá část -- Slídění v logách
--------------------------------------------

Slabé chvilky systému se dělí na dvě kategorie :
a) na transparentní == kdy máme záznam ze situace jak systém a nebo jeho část selhala ..
b) a všechny ostatní == kdy kritická situace z nějakého důvodu zalogovaná není a nebo jsme ji ještě nenašli, a nemusí být tedy na první pohled patrné, o co přesně běží ..

Setkáme-li se s první kategorií, není co řešit. Obvykle proženeme googlem "ukořistěnou hlášku" (někteří se však neobtěžují a rovnou běží na zdejší fórum) a pak je jen otázka času, kdy se nám podaří daný problém opravit..

Na druhé kategorii je optimistické to, že je možnost, že se změní v první tím, že po nějaké době přijdeme na kámen úrazu a můžeme ji začít řešit výše zmíněným způsobem.

Takže setkáme-li se s problémem, provedeme kroky, jejichž výsledek by měl být následující:
1) Zjistit co se stalo, zajistit inkriminovanou hlášku a determinovat problémovou část..
2) Obstarat si reference k problému z netu, manuálu a nebo od třetí osoby -- a nebo jsme-li dobří, zajistit si reference sami.
3) Na základě získaných referencí problém odstranit -- je-li samozřejmě známo jak na to (HOWTO)..

1) Zamyslíme se ;) .. Je třeba určit základní kategorii problému -- ?kernel, ?konkrétní aplikace ?možná miskonfigurace. Máme-li štěstí a chybová hláška se nám ukáže sama a problémem je miskonfigurace (ať už po našem zásahu a nebo vinou distribučního nastavení balíku), lze to vyřešit. Nemáme-li štěstí a potkáme hlášku "core dumped" a nebo "buffer overflow", je chyba přímo v kódu programu a jedná se o Bug. Také se může stát, že nemáme z čeho soudit a v tom případě se vrhneme na prohledávání logů. Samozřejmě platí, že použijeme všech dostupných prostředků (nepomůžou-li logy, zeptáme se internetu)
  1.1) padá-li nám konkrétní aplikace, spustíme jí z terminálu, kam aplikace rovnou vypisujou zprávy o svém chodu.
       Jako první věc můžeme zkontrolovat manuálovou stránku, jestli program podporuje volbu "verbose" (zvýšení výřečnosti).
       Obvykle to bývá parametr "-v" nebo "-V". V případě potřeby (nesmyslně dlouhého a nebo nepřehledného outputu)
       můžeme použít program 'tee', který zdvojuje stdout a dovoluje nám ho duplikovat i do souboru:
       $ man tee && firefox | tee firefox.log  // vytvoří v aktuálním adresáři soubor firefox.log
       $ man strace  // mocnej diagnostickej příkaz. Nebudu ho tady nijak rozebírat, je to v manpage. Příklad:
       $ strace -e trace=open firefox  // vypíše všechny soubory, které firefox otevřel..
       Samozřejmě zkontrolujeme, zda-li program má svůj Log a ten prohlédneme..
-- výsledek by měl být zajištěná hláška o chybě..
  1.2) Padá-li nám kernel je situace horší. Můžeme v úvodu popsaným způsobem zvýšit při bootu jeho ukecanost.
       Můžeme v případě potřeby použít -debug jádro. Každopádně v tomto případě slídíme klasickými metodami v logách.
       Extrémně užitečné se zde jeví otevřít si realtimové sledování vybraného logu, např:
       $ while :; do clear && cat /var/log/syslog | tail -n 20 && sleep 1; done
-- výsledek by měl být zajištění chybové hlášky a determinování problémové části..
-- nepodaří-li se nám v rámci bodu 1 zjistit co se děje, máme smůlu ..

2) Máme-li log a nebo víme co se děje (např. já když zapojím sluchátka, tak mi stále hrajou i repráčky, takže u mě je problém očividný a log nepotřebuju), můžeme googlit, ptát se, otravovat na fórech.. je to na nás. V této fázi bychom měli umět problém reprodukovat.. Zde se také často stává, že se zaseknete, protože jako já se sluchátky zjistíte, že řešení problému je zatím neznámé a nebo nedostupné.
-- výsledkem by mělo být nalezení teoretického řešení problému a nebo jeho případného stavu, je-li to známý problém.

3) Zde se pouštíme do samotné opravy -- pánbůh nám pomáhej.
-- výsledek :D v ideálním případě je, že to nakonec opravíme..

--------------------------------------------
Třetí část -- Konkrétní Příklad
--------------------------------------------

Doporučuji Vám se na tento příklad podívat, protože zde máte ukázku toho, jak najít problém přímo ve zdrojáku a v rámci Našeho příkladu zde demonstruju, jak se dostat k "neřešitelnému" problému přímo na kobylku ..

Kód: [Vybrat]
// ok, koukneme se, jestli systém neobsahuje nějaké bugy..
# grep -Er 'error|Error|ERROR|fail|Fail|FAIL' /var/log  // výstup je příliš veliký, trocha ho omezíme, ale předtím zkusíme:

# find /var/log | less   // koukneme se, co všechno je v adresáři s logy a potom:

# for x in $(find /var/log); do if [ ! "$(echo "$x" | grep -E '\.tgz$|\.bz2|\.tar$|YaST2')" ] && [ ! -d "$x" ]; then
     grep -E 'error|Error|ERROR|fail|Fail|FAIL' $x; fi; done  // trocha si ten příkaz rozeberem..

// for x in $(find /var/log); do  // v každém průběhu cyklu budeme zacházet s jednou položkou z /var/log

//    if [ ! "$(echo "$x" | grep -E '\.tgz$|\.bz2|\.tar$|YaST2')" && [ ! -d "$x" ]; then
// pokud položka neobsahuje (!) koncovku jako archiv (tgz, bz2, tar), nepatří YaSTU (jehož errory me nezajímají)
// a není to zároveň (&&) adresář, tak..

//         grep -E 'error|Error|ERROR|fail|Fail|FAIL' $x;
// ..jí bezstarostně progrepujeme -- v každém průběhu cyklu jednu z 'find /var/log' - krom zahozených

//    fi
// done

// bohužel output je u mě stále příliš obrovský, takže já se jdu soustředit na užší vymezení 'error|Error|ERROR|fail|Fail|FAIL',
// budu slídit po 'ACPI' errors:

# for x in $(find /var/log); do if [ ! "$(echo "$x" | grep -E '\.tgz$|\.bz2|\.tar$|YaST2')" ] && [ ! -d "$x" ]; then
      grep -E 'error|Error|ERROR|fail|Fail|FAIL' $x; fi; done | grep 'ACPI'  // pripsal jsem to na konec..

// teď je to docela dobré.. mám asi 100 řádek díky výrazu 'ACPI|(error|Error|ERROR|fail|Fail|FAIL)' ..
// ok, vybírám si tuto hlášku:
// 'ACPI Error (psargs-0355): [BSTR] Namespace lookup failure, AE_NOT_FOUND'
// v google vyhledávám 'psargs-0355 Namespace lookup failure, AE_NOT_FOUND'
// nacházím spousta věcí, ale budu si hrát na moulu, páč do toho nevidím a zjistím si, co to přesně způsobuje:

# cd /usr/src/linux   // vlezu ke zdrojákům jádra
# find . | grep -E 'ACPI|acpi'   // kouknu se, kde je acpi schované, nacházím ho v ./drivers/acpi a nebo ./include/acpi

// ok, a teď se podíváme po naší hlášce:

# grep -rE -A3 'Namespace\ lookup\ failure' drivers/acpi   // dostávám:

drivers/acpi/namespace/nsutils.c:       acpi_os_printf(" Namespace lookup failure, %s\n",
drivers/acpi/namespace/nsutils.c-                      acpi_format_exception(lookup_status));

// a tady máme naši hlášku:
// stačí jen zjistit jak "acpi_format_exception(lookup_status)" vrací "AE_NOT_FOUND"

# grep -rE 'return\ .*AE_NOT_FOUND' drivers/acpi

drivers/acpi/ec.c:              return AE_NOT_FOUND;
drivers/acpi/osl.c:                     return AE_NOT_FOUND;
drivers/acpi/osl.c:                     return AE_NOT_FOUND;
drivers/acpi/namespace/nsobject.c:      return (AE_NOT_FOUND);
drivers/acpi/namespace/nsobject.c:      return (AE_NOT_FOUND);

// a jedna z výše uvedených fcí je ta naše.. Bohužel se mi do tohohle příspěvku už nic nevejde (je tu limit 20.000 znaků)


tak.. a kdybych rozuměl psaní driverů pro acpi, tak si to ohackuju sám!
takto se prosím reší problémy a vyhledává v logách pod Linuxem :D

enjoy by ntz

« Poslední změna: 08 Prosinec 2007, 15:44:31 od nettezzaumana »

nettezzaumana

  • Host
Re: Jak vyhledavat v Logach a zakladni reference RE
« Odpověď #1 kdy: 24 Listopad 2007, 00:05:12 »
ad.1)
opakovani v RE je zaludna vec a "*" se bo vic interpretuje v ruznych programech (perlRE Vs bashRE) ruzne..
vyraz '^20*' nefunguje, protoze jedna ze zaludnosti RE je, ze pri pouziti '*' musime specifikovat zacatek^ a konec$ radku, takze:

# muzete zkusit nasledujici prikazy:
####################################################
Kód: [Vybrat]
$ [b]for((x=0;x<10000;x++)) { echo $x >>numlist.txt; }[/b]  // vytvorime si file, kde je zapsano 1-9999

$ [b]egrep '^2$' numlist.txt[/b]  // vyhleda radky na kterych je "zacatek_radku-'2'-konec_radku"
2

$ [b]egrep '^2{2,}0.*[78]$' numlist.txt[/b] // vyhleda radky zacinajici min 2x"2", nasledovane 0 a koncici 7 nebo 8
2207
2208

$ [b]egrep '^([123])\1{1,}8$' numlist.txt[/b]  // vyhleda radky, zacinaji (1|2|3), nasleduje libovolne opakovani tohoto zacinajiciho pismena a koci 8kou
118
228
338
1118
2228
3338

$ [b]egrep '^2(0)\1*$' numlist.txt[/b]  // vyhleda pouze radky zacinajici 2kou a nasledovane uz pouze libovolnym mnozstvim 0 ..
20
200
2000

$ [b]egrep '^20*$' numlist.txt[/b]  // podobny jako vyse uvedeny priklad, nyni jsme vsak pouzili relativne "chatrny zapis"
2
20
200
2000

$ [b]egrep '^1*2$' numlist.txt[/b]  // zde o5 pouzivame opakovani "chatrnym zapisem". zde demonstrujeme, ze 'x*' znamena i zadne 'x'
2
12
112
1112


$ [b]egrep '^([56])\1{1}([78])\2{1}$' numlist.txt[/b]  // vyhleda radky zacinajici dvojici 5|6 a koncici dvojici 7|8
5577
5588
6677
6688

$ [b]egrep '^([56])([78])\2\1' numlist.txt[/b]  // vyhleda radky zacinajici a koncici 5 nebo 6 a mezi tim obsahujici zdvojeny vyskyt 7 nebo 8
5775
5885
6776
6886

$ [b]egrep '^([1-2])\1\1\1*$' numlist.txt[/b]  // vyhleda radky, na nichz jsou pouze stejne znaky v rozsahu 1-2 a minimalne 3x.
111
222
1111
2222

$ [b]egrep '^([12])\1{2,}$' numlist.txt[/b] // to same, jiny zapis
111
222
1111
2222

zdravi ntz

« Poslední změna: 08 Prosinec 2007, 21:02:51 od nettezzaumana »

Marcel 'Maky' Šuška

  • Závislák
  • ****
  • Příspěvků: 1425
  • Karma: +65/-8
  • Kdo si hraje s Ubuntu, nezlobí.
    • Zobrazit profil
Re: Vyhledávání v Logách a základní použití RE ..
« Odpověď #2 kdy: 25 Listopad 2007, 13:36:40 »
Super návod, moc se mi líbí.

Dobrá práce, jen by to chtělo ty konkrétní příklady - ale je to celkem pochopitelný.
:) chytrolín :)

Jak píše luisah, chce to více příkladů. No a taky začínat na zrovna v logách, málo kdo půjde tak do hloubky. Já bych spíše upřednostnil začít trochu od začátku, tak něco pro začátečníky. Taky oeňuji, že píšeš s diakritikou, lépe se to čte.

Např:

aplay -l           - vypíše všechna zvuková zařízení

Takhle vypadá výpis po zadání příkazu:

Kód: [Vybrat]
maky@maky-desktop:~$ aplay -l
**** Seznam PLAYBACK Hardwarových zařízení ****
karta 0: CMI8738 [C-Media PCI CMI8738], zařízení 0: CMI8738 [C-Media PCI DAC/ADC]
  Podzařízení: 1/1
  Podzařízení #0: subdevice #0
karta 0: CMI8738 [C-Media PCI CMI8738], zařízení 1: CMI8738 [C-Media PCI 2nd DAC]
  Podzařízení: 1/1
  Podzařízení #0: subdevice #0
karta 0: CMI8738 [C-Media PCI CMI8738], zařízení 2: CMI8738 [C-Media PCI IEC958]
  Podzařízení: 1/1
  Podzařízení #0: subdevice #0
karta 1: NVidia [HDA NVidia], zařízení 0: AD198x Analog [AD198x Analog]
  Podzařízení: 1/1
  Podzařízení #0: subdevice #0
karta 1: NVidia [HDA NVidia], zařízení 1: AD198x Digital [AD198x Digital]
  Podzařízení: 1/1
  Podzařízení #0: subdevice #0
maky@maky-desktop:~$
Z výpisu vidíme, že mám na PC dvě zvukovky, C-Media PCI CMI8738 a NVidia .......... a rozepsat se, třeba, proč je ta či ona ve výpisu první.......

nettezzaumana

  • Host
Re: Vyhledávání v Logách a základní použití RE ..
« Odpověď #3 kdy: 25 Listopad 2007, 15:11:08 »
me se tam nevejde uz ani radek -- nevedel jsem, ale je tu limit 200.000 znaku pro prispevek

ps. ja jsem puvodni text osekal minimalne o tretinu

nettezzaumana

  • Host
Re: Vyhledávání v Logách a základní použití RE ..
« Odpověď #4 kdy: 06 Prosinec 2007, 20:25:48 »
Ntz for president!
hmm, a ja se pritom snazim skodit kde muzu ..

MacHala

  • Závislák
  • ****
  • Příspěvků: 1104
  • Karma: +107/-11
  • Big Bro iz watching joo!
    • Zobrazit profil
    • ZlejT
Re: Vyhledávání v Logách a základní použití RE ..
« Odpověď #5 kdy: 06 Prosinec 2007, 22:57:30 »
Ntz for president!
hmm, a ja se pritom snazim skodit kde muzu ..
hm ,ale asi jsem to nejak prehnal :-D, ted jsem zkousel grepovat jeden soubor (cisla 1-1000, nahodne poradi, jedno cislo na radku) a pri zadani  egrep '^2$'  vstup1.txt to nenaslo nic (i kdyz tam dvojka zarucene je; vubec mi prijde, ze mi bash nejak ty $ nebere - kdyz zadam cokoliv s $, krome '^.*$', tak nic nenajde) a kdyz jsem prozmenu zadal egrep '^20*'  vstup1.txt tak to vyhodilo vsech 111 cisel zacinajicich dvojkou (z tveho clanku jsem pochopil, ze by to melo najit jen 20 a 200)

EDIT: to egrep '^2$' nefungovalo kvuli win zalamovani radku
« Poslední změna: 28 Srpen 2008, 17:07:06 od MacHala »
Prislusnik ligy, za kreativni pouzivani interpunkcnich znamenek, carek, predevsim.
=======================================
Tweetuju jako http://twitter.com/zl8

nettezzaumana

  • Host
Re: Vyhledávání v Logách a základní použití RE ..
« Odpověď #6 kdy: 08 Prosinec 2007, 15:26:45 »
hm ,ale asi jsem to nejak prehnal :-D, ted jsem zkousel grepovat jeden soubor (cisla 1-1000, nahodne poradi, jedno cislo na radku) a pri zadani  egrep '^2$'  vstup1.txt to nenaslo nic (i kdyz tam dvojka zarucene je; vubec mi prijde, ze mi bash nejak ty $ nebere - kdyz zadam cokoliv s $, krome '^.*$', tak nic nenajde) a kdyz jsem prozmenu zadal egrep '^20*'  vstup1.txt tak to vyhodilo vsech 111 cisel zacinajicich dvojkou (z tveho clanku jsem pochopil, ze by to melo najit jen 20 a 200)
jj. je to tam mozna nedurazne napsany. regularni vyrazy obsahuji spoustu zakernosti.. doplnil jsem tam na zaklade Tve poznamky pripominku..

opakovani v RE je zaludna vec a "*" se bo vic interpretuje v ruznych programech (perlRE Vs bashRE) ruzne..

vyraz '^20*' nefunguje, protoze jedna ze zaludnosti RE je, ze pri pouziti '*' musime specifikovat zacatek^ a konec$ radku, takze:
'^20*$' // takto ma vypadat vyraz na ktery jsi se ptal
'(7)\1\1*xx' // takto vypada libovolny retezec 2 a vice sedmicek nasledovany "xx" .. "\1" (escapovane cislo) vraci dle pozice obsah zavorek
'7{2,}xx'  // to same, pri jinem zapisu

zdravi ntz
« Poslední změna: 08 Prosinec 2007, 20:49:46 od nettezzaumana »

Duffy

  • Člen
  • **
  • Příspěvků: 436
  • Karma: +24/-6
    • Zobrazit profil
Re: Vyhledávání v Logách a základní použití RE ..
« Odpověď #7 kdy: 08 Prosinec 2007, 18:37:35 »
Možná by to chtělo třebas naznačit pár příkladů kde se to hodí :).
Notebook Fujitsu Siemens Amilo Xa 1526 s Ubuntu 8.04. Po dlouhém zkoušení jsem zůstal u Ubuntu a GNOME.

nettezzaumana

  • Host
Re: Vyhledávání v Logách a základní použití RE ..
« Odpověď #8 kdy: 28 Leden 2008, 16:45:07 »
pred nedavnem jsem odpovidal na dotaz, jak si zajistit jako vypis pouze ciselnou silu wifi signalu z prikazu iwlist :: zde je jako priklad odpoved

cat iwscan.info | sed '/Quality=/!d;s/\ \+Quality=\(\(\([0-9]\)\+\)\/\(\([0-9]\)\+\)\)\ .*$/\1/'  ## trocha si prikaz rozebereme:

tento vyraz je relativne spravne do skriptu, pac na konci::
\1 -- vrati vsechny cleny sily signalu aka '123/456'
\2 -- vrati prvni clen aka '123'
\3 -- vrati posledni cislo prvniho clenu aka '3'
\4 -- vrati druhy clen aka '456'
\5 -- vrati posledni cislo druheho clenu aka '6'
\6+ -- vrati error :D

/Quality=/!d; ## prvni samostatny vyraz, emulace grepu. vypiseme pouze radky, kde se vyskytuje vyraz 'Quality='
;s/ ## nahrazujeme, takze forma jest 's/regexp/nahrada/'
\ \+Quality= ## escapovana mezera je nutna, '+' znaci jeden povinny vyskyt +dalsi mozne predchoziho znaku, (narozdil od '*', ktera znamena, ze jeden povinny byt nemusi), '+' v sedu nutno escapovat
\(\(\([0-9]\)\+\)\/\(\([0-9]\)\+\)\) ## escapovane zavorky, jez maji ve zkutecnosti tento vyznam :: ((cislo)/(cislo))
)\ .*$ ## od prvni mezery do konce radku
\1 ## vkladani () vyrazu, jez jsou timto "v pameti"

nettezzaumana

  • Host
Re: Vyhledávání v Logách a základní použití RE ..
« Odpověď #9 kdy: 04 Březen 2008, 11:55:13 »
ted jsem jednomu zdejsimu ucastniku napsal maly tool na procvicovani sedacich RE (v perlu) :: (perl is?=http://forum.ubuntu.cz/index.php?topic=18621.0

skript si pastnete do editoru a ulozkte a nebo symlinknete do $PATH a procvicujte s nim perl-like (sed) RE
man perlretut
man perlrequick
man perlre
man perlreref

Ve skriptu je dulezita cast mezi ::
## This is your RE playground >>>>>>>>>>>>>>>>>>>>>>>>>>
..
## End of RE playground <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

uvedl jsem tam i zakomentovane nektere priklady..

Kód: [Vybrat]
#!/usr/bin/perl -w
# exclusively for existpierre from ntz..
# enjoy ;)

use strict;
use Getopt::Long;
use IO::File;

sub usage {
print << 'EOT';
edit script for suggested RE.. choose one of following
parameters ::
-?, -h, --help Prints this help message..
-s, --stdin Read standart input ..
-f <file>
--file=<file> Read file..

EOT
exit 0;
}

sub READ_STDIN {
while (<>) {
chomp($_);

## This is your RE playground >>>>>>>>>>>>>>>>>>>>>>>
# for examples and more info continue reading

## End of RE playground <<<<<<<<<<<<<<<<<<<<<<<<<<<

print "$_\n";
};
};

sub READ_FILE {
        my $ITEM = "@_";
        my @CONTENT_OF_FILE;

        my $file = new IO::File;
        if($file->open("<$ITEM")) {
                @CONTENT_OF_FILE = <$file>;
                $file->close;
        } else {
                print "unexpected error while opening $ITEM\n";
                exit 1;
        };
        return(@CONTENT_OF_FILE);
};


##---------------------------------------------------------------
my @CMDLINE = @ARGV;


my($help, $read_stdin, $read_file);
Getopt::Long::Configure("gnu_getopt", "no_auto_abbrev", "no_ignore_case_always");
GetOptions(
"help|?|h" => \$help,
"stdin|s" => \$read_stdin,
"file|f=s" => \$read_file
) || usage();

usage() if($help || !@CMDLINE || $read_stdin && $read_file);
READ_STDIN() if($read_stdin);
my @CONTENT_OF_FILE = READ_FILE($read_file) if($read_file);

foreach(@CONTENT_OF_FILE) {

## This is your RE playground >>>>>>>>>>>>>>>>>>>>>>>
# main usage is ::
# $_ =~ RE

# $_ =~ s/\s+/\ /g;  ## substitute globally whitspace with one '\ '

## substitute by nothing rest of line of 'ls -l >file.fo' from first whitespace
# $_ =~ s/\s+.*$//;

## prints quality of signal from 'iwlist ath0 scan >wnetworks.fo
# next if not m/Quality=/;s/\s+//;s/\s+.*$//;

## harvest from previous numerous quality of signal ::
# next if not s/Quality=//;s/\s+//;s/\s+.*$//;

## End of RE playground <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
print "$_";
};


exit 0;

mala poznamka k rizeni behu pri zkouseni RE ::

while TRUE {
next if(?podminka); ## pokud je splnena podminka, 'next' dane kolo cyklu ukonci a nasleduje nove, dalsi prikazy se nevykonaji
last if(?podminka); ## 'while TRUE' neznamena vzdy nekonecny cyklus. pokud splnena podminka, 'last' ho ukonci aka 'break' v c/c++
.. blok prikazu ..
};

jak jste jiste pochopili, tak 'next' zde strkame abychom emulovali grep, pac "$_" na konci (tisk aktualniho retezce) se pak nevykona, pokud ho zachytime 'if' a posleme pryc 'next'

ps. pripominam:: mejte radi RE. nastroje jako awk jsou pro lidi, kteri se nejsou RE schopni naucit ::

# vyzkousejte nasleduji dva priklady
echo $PATH | awk -F: '{for(x=1;x<NF+1;x++) { print $x; }}'

# neni tohle hezci zapis??
echo $PATH | sed 's/:/\n/g'

enjoy by ntz
« Poslední změna: 04 Březen 2008, 13:01:12 od nettezzaumana »

nettezzaumana

  • Host
Re: Vyhledávání v Logách a základní použití RE ..
« Odpověď #10 kdy: 04 Březen 2008, 13:55:03 »
ps. zaroven prosim, aby si ucastnici zdejsich prispevku prosli sve komentare a ty s nulovou ci nizkou informacni hodnotou smazali .. diky

jedna se zejmena o :: MacHala, Duffy, Czario, bodie a ntz

pps. prectete si muj predchozi prispevek, stahnete script a zacnete procvicovat ;)

karel kudrna

  • Stálý člen
  • ***
  • Příspěvků: 869
  • Karma: +64/-10
  • skill :: googllama
    • Zobrazit profil
Re: Vyhledávání v Logách a základní použití RE ..
« Odpověď #11 kdy: 04 Březen 2008, 21:02:52 »
Mega dobrý, mega mě bolí hlava, budu si to muset vytisknout. Hodil by se k tomu i seznam literatury, nejlíp pro amatéry...asi.


P.S. geniální na tom je že po letech googlení mi věta "grep je filtr" objasnila hafo věcí... ;D
« Poslední změna: 04 Březen 2008, 21:17:31 od karel kudrna »
prostý user
...selským rozumem...

nettezzaumana

  • Host
Re: Vyhledávání v Logách a základní použití RE ..
« Odpověď #12 kdy: 05 Březen 2008, 14:00:36 »
obcas se setkame s tim, ze potrebujeme vytridit z nejakeho souboru napr. cesty s mezerama ::
Vytvoril jsem si soubor playlist.m3u, ktery ma nasledujici strukturu ::
Kód: [Vybrat]
nettezzaumana@kokina:~/Desktop> cat playlist.m3u | head -n 25
#EXTM3U
#EXTINF:164,Resist
../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/01 Resist.mp3
#EXTINF:214,Switchback
../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/02 Switchback.mp3
#EXTINF:236,Salvation
../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/03 Salvation.mp3
#EXTINF:223,End Of My Rope
../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/04 End Of My Rope.mp3
#EXTINF:232,All For None
../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/05 All For None.mp3
#EXTINF:172,Breakdown
../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/06 Breakdown.mp3
#EXTINF:208,Inner Fear On
../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/07 Inner Fear On.mp3
#EXTINF:225,Abandon In Place
../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/08 Abandon In Place.mp3
#EXTINF:208,Skin
../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/09 Skin.mp3
#EXTINF:168,Camouflage
../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/10 Camouflage.mp3
#EXTINF:225,Decline
../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/11 Decline.mp3
#EXTINF:292,Cycle Of Abuse
../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/12 Cycle Of Abuse.mp3
pokud z toho potrebujeme dostat nejak pouzitelne cesty, mame samozrejme vice moznosti, pricemz ja se budu drzet dvou zakladnich:
a) escapovat mezery
b) strcit do uvozovek

a) escapovani mezer obstara nasledujici vyraz :: 's/\ /\\\ /g'  // 'g' na konci znamena 'global', pokud by chybelo, byla by nahrazena pouze prvni mezera
.. je zde samozrejme chytak, protoze neni mezera jako mezera, a my musime pocitat s celou rodinou bilych znaku aka tabelator aj, takze spravne bude nas vyraz vypadat takto :: 's/\s/\\\ /g' // '\s' = bily znak, takze ::
Kód: [Vybrat]
nettezzaumana@kokina:~/Desktop> cat playlist.m3u | sed '/^#/d;s/\s/\\\ /g' | head -n 25
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/01\ Resist.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/02\ Switchback.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/03\ Salvation.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/04\ End\ Of\ My\ Rope.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/05\ All\ For\ None.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/06\ Breakdown.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/07\ Inner\ Fear\ On.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/08\ Abandon\ In\ Place.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/09\ Skin.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/10\ Camouflage.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/11\ Decline.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/12\ Cycle\ Of\ Abuse.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/13\ Dogs\ Of\ War.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ New\ World\ Disorder/14\ New\ World\ Disorder(feat.Sticky\ Fingas).mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ No\ Holds\ Barred\ (LIVE\ in\ EU)/01\ Shades\ Of\ Grey.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ No\ Holds\ Barred\ (LIVE\ in\ EU)/02\ What\ Makes\ Us\ Tick.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ No\ Holds\ Barred\ (LIVE\ in\ EU)/03\ Authority.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ No\ Holds\ Barred\ (LIVE\ in\ EU)/04\ Urban\ Discipline.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ No\ Holds\ Barred\ (LIVE\ in\ EU)/05\ Modern\ Democracy.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ No\ Holds\ Barred\ (LIVE\ in\ EU)/06\ Love\ Denied.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ No\ Holds\ Barred\ (LIVE\ in\ EU)/07\ Bussines.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ No\ Holds\ Barred\ (LIVE\ in\ EU)/08\ Tales\ From\ The\ Hardside.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ No\ Holds\ Barred\ (LIVE\ in\ EU)/09\ Betters\ Days.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ No\ Holds\ Barred\ (LIVE\ in\ EU)/10\ Victory.mp3
../../../mnt/data/+MUSIC/Biohazard/Biohazard\ -\ No\ Holds\ Barred\ (LIVE\ in\ EU)/11\ Survival\ Of\ The\ Fittest.mp3
<< pripominam, ze zde jsou vyrazy dva (sed 'RE1;RE2), pricemz ten prvni '/^#/d' jest emulace grepu a maze nam vsechny radky zacinajici '#'

b) strceni cesty do uvozovek obstara nasledujici vyraz: 's/^\(.*\)$/\"\1\"/' // pricemz obsah v () se zpetne vola jako '\<index_cislo>' a v perlu jako $<index_cislo>, takze ::
Kód: [Vybrat]
nettezzaumana@kokina:~/Desktop> cat playlist.m3u | sed '/^#/d;s/^\(.*\)$/\"\1\"/' | head -n 25
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/01 Resist.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/02 Switchback.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/03 Salvation.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/04 End Of My Rope.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/05 All For None.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/06 Breakdown.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/07 Inner Fear On.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/08 Abandon In Place.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/09 Skin.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/10 Camouflage.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/11 Decline.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/12 Cycle Of Abuse.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/13 Dogs Of War.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/14 New World Disorder(feat.Sticky Fingas).mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/01 Shades Of Grey.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/02 What Makes Us Tick.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/03 Authority.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/04 Urban Discipline.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/05 Modern Democracy.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/06 Love Denied.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/07 Bussines.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/08 Tales From The Hardside.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/09 Betters Days.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/10 Victory.mp3"
"../../../mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/11 Survival Of The Fittest.mp3"
Vetsinu z Vas jiste napadlo, jak dostat pryc onen podivny zacatek '../../..', reseni je jednoduche :: 's/^\(\.\.\/\)\+/\//' .. misto abychom 'otrocky' psali cely zacatek aka substituci 's/VYRAZ1/VYRAZ2/', jsme provedli :: "nahrad (s) libovolne dlouhou (VYRAZ)+ posloupnost vyrazu '../' za '/', takze ::
Kód: [Vybrat]
nettezzaumana@kokina:~/Desktop> cat playlist.m3u | sed '/^#/d;s/^\(\.\.\/\)\+/\//;s/^\(.*\)$/\"\1\"/' | head -n 25
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/01 Resist.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/02 Switchback.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/03 Salvation.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/04 End Of My Rope.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/05 All For None.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/06 Breakdown.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/07 Inner Fear On.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/08 Abandon In Place.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/09 Skin.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/10 Camouflage.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/11 Decline.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/12 Cycle Of Abuse.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/13 Dogs Of War.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - New World Disorder/14 New World Disorder(feat.Sticky Fingas).mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/01 Shades Of Grey.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/02 What Makes Us Tick.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/03 Authority.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/04 Urban Discipline.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/05 Modern Democracy.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/06 Love Denied.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/07 Bussines.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/08 Tales From The Hardside.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/09 Betters Days.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/10 Victory.mp3"
"/mnt/data/+MUSIC/Biohazard/Biohazard - No Holds Barred (LIVE in EU)/11 Survival Of The Fittest.mp3"
<< nam dopadne takto ..

enjoy by ntz ;)
« Poslední změna: 05 Březen 2008, 14:02:19 od nettezzaumana »

nettezzaumana

  • Host
Re: Vyhledávání v Logách a základní použití RE ..
« Odpověď #13 kdy: 05 Únor 2009, 16:00:10 »
Kód: [Vybrat]
#!/bin/bash
#
# stahne do aktualni slozky celej serial rodinka od kaisera a labuse ..
# regards by ntz

(wget -O - http://www.radio.cz/cz/rodinka 2>/dev/null | grep '/cz/rodinka/' | grep '^<TD' | sed 's/^.*href="\(.[^"]*\).*$/\1/' | while read line; do wget -t 3 -T 30 -O - http://radio.cz$line 2>/dev/null; done ) >/tmp/rodinka.txt

cat /tmp/rodinka.txt | sed 's@</TR>@\n@g'| sed '/>[0-9][0-9]*</!d' | sed 's/^.*>\([0-9][0-9]*<.*\)/\1/' | sed 's@\(class\|bgcolor\|width\|href\)=".[^"]*"@@g' | sed 's@<\?TD\ *>@@g' | sed 's@^\([0-9][0-9]*</.[^<]*\).*@\1@;s@&#[0-9]*;@@g;s@^273907.*@728</273907@;s@/@@' | while read line; do echo $line | sed 's/^\([0-9]<\)\(.*\)$/00\1\2/;s/^\([0-9][0-9]<\)\(.*\)$/0\1\2/'; done | while read line; do wget -t 5 -T 30 --retry-connrefused http://radio.cz/rodinka-download/$(echo $line | sed 's/<.*//')-32.mp3 -O "$(echo $line | sed 's/<.*//')-$(echo $line | sed 's/.*<//').mp3"; done

.. stahujte prosim az vecer

nettezzaumana

  • Host
Re: Vyhledávání v Logách a základní použití RE ..
« Odpověď #14 kdy: 19 Březen 2009, 13:19:56 »
Citace
$ ls -1
Bad Religion - Against the Grain (1990, V0)
Bad Religion - Back To the Known (1984)
Bad Religion - Bad Religion (1981)
Bad Religion - Generator (1992, V0)
Bad Religion - How Could Hell Be Any Worse (1982, V0)
Bad Religion - Into the Unknown (1983, V0)
Bad Religion - New Maps of Hell (2007, V0)
Bad Religion - No Control (1989, V0)
Bad Religion - No Substance (1998, V0)
Bad Religion - Recipe For Hate (1993, V0)
Bad Religion - Stranger Than Fiction (1994, V0)
Bad Religion - Suffer (1988, V0)
Bad Religion - The Empire Strikes First (2004, V0)
Bad Religion - The Gray Race (1996, V0)
Bad Religion - The New America (2000, V0)
Bad Religion - The Process Of Belief (2002, V0)
B-Sides and Rarities
Covers By Bad Religion
Suffer Demos

$ ls -1 | grep ^Bad | while read line; do mv "$line" "$(echo $line | perl -ne 'next if ! s@^(.[^-]*)-(.*)\ \((\d+).*@$1\[$3\]$2@; print')"; done
$ ls -1
Bad Religion [1981] Bad Religion
Bad Religion [1982] How Could Hell Be Any Worse
Bad Religion [1983] Into the Unknown
Bad Religion [1984] Back To the Known
Bad Religion [1988] Suffer
Bad Religion [1989] No Control
Bad Religion [1990] Against the Grain
Bad Religion [1992] Generator
Bad Religion [1993] Recipe For Hate
Bad Religion [1994] Stranger Than Fiction
Bad Religion [1996] The Gray Race
Bad Religion [1998] No Substance
Bad Religion [2000] The New America
Bad Religion [2002] The Process Of Belief
Bad Religion [2004] The Empire Strikes First
Bad Religion [2007] New Maps of Hell
B-Sides and Rarities
Covers By Bad Religion
Suffer Demos

## dostaneme rourou vystup prikazu do perlu (viz. `perl --help` pro seznam parametru)
echo $line | perl -ne \

## tohle tady bylo defakto zbytecne, znamena to, ze cyklus while(<>) skoci na dalsi obeh pokud se neaplikuje RE dale
'next if ! \

## dostaneme do *groups jednotlive casti radku a ty pak ve druhe casti preskladame jak potrebujeme ..
## v perlu netreba escapovat () a lze pouzit rozsireni jako \d apod .. viz. `man perlre`
s@^(.[^-]*)-(.*)\ \((\d+).*@$1\[$3\]$2@; \

## tisk nakonec
print'

ntz_reloaded

  • Lokaj
  • Moderátor
  • Závislák
  • *****
  • Příspěvků: 3660
  • Karma: +360/-65535
  • skill :: ur home erly
    • Zobrazit profil
Re:Vyhledávání v Logách a základní použití RE
« Odpověď #15 kdy: 17 Březen 2015, 12:02:14 »
renovoval jsem útočiště šampiona renovační sadou a budova vypadá jako zrenovovaná, ale v inventáři vojska je nový šampion nedohledatelný. Jsou zde pouze starší nezávislí šampioni ze starších dob, vyrobení Alcatrazem. Co s tím?

Díky xBizon
wtf o.O ?
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

Martin Šácha

  • Člen občanského sdružení Ubuntu ČR a placené komunitní podpory
  • Administrátor fóra
  • Guru
  • ******
  • Příspěvků: 5145
  • Karma: +302/-77
    • Zobrazit profil
Mint 17 MATE 64bit / DuckDuckGo.com
Programátoři považují WYSIWYG za špatné u kódu i u žen. Programátor chce "dostat to, co žádá“ – kód tajemný, neodpouštějící, nebezpečný.