Ostatní > Tipy a triky pro Linux

Vyhledávání v Logách a základní použití RE ..

<< < (2/4) > >>

MacHala:

--- Citace: nettezzaumana  06 Prosince 2007, 20:25:48 ---
--- Citace: MacHala  05 Prosince 2007, 18:12:11 ---Ntz for president!

--- Konce citace ---
hmm, a ja se pritom snazim skodit kde muzu ..

--- Konce citace ---
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

nettezzaumana:

--- Citace: MacHala  06 Prosince 2007, 22:57:30 ---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)

--- Konce citace ---
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

Duffy:
Možná by to chtělo třebas naznačit pár příkladů kde se to hodí :).

nettezzaumana:
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:
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: ---#!/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;

--- Konec kódu ---

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

Navigace

[0] Seznam témat

[#] Další strana

[*] Předchozí strana

Přejít na plnou verzi