Ostatní > Tipy a triky pro Linux
Vyhledávání v Logách a základní použití RE ..
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