|
| xargs problem Fra : Niels Andersen |
Dato : 16-02-01 11:12 |
|
Jeg har skrevet et halv-langt indlæge om mit problem, men må nu erkende at
det kan skrivet MEGET kortere...
xargs sætter en parameter på til sidst. Det er noget skidt, for der skal
være 3 parametre, og data fra pipen skal indsættes som parameter nummer to.
Hvordan gør man det? Jeg har brugt en hel del tid på manualen... :)
Læs evt. mit første forsøg på at forklare problemet:
Jeg sidder med en stak apache logfiler, hvor der skal fjernes nogle ting.
Fx. skal søgemaskiner fjernes. Så langt er jeg nået:
$ grep "/robots.txt" logfil | awk '{print $1}'
Dette giver en række ip-numre på søge-maskiner.
Søgemaskinen kan så fjernes med:
$ grep -v 111.222.333.444 logfil
Dvs. disse to kommandoer skal sammenflettes, sikkert med xargs:
$ grep "/robots.txt" logfil | awk '{print $1}' | xargs -n 1 grep -v logfil
Problemet er bare, at xargs kommer med parametrene i forkert rækkefølge:
grep -v logfil 111.222.333.444
og det virker jo ikke! Hvad kan jeg gøre?
Mvh.
Niels Andersen
| |
Martin Moller Peders~ (16-02-2001)
| Kommentar Fra : Martin Moller Peders~ |
Dato : 16-02-01 11:23 |
|
In <96iue5$edf$1@news.inet.tele.dk> "Niels Andersen" <niels-usenet@myplace.dk> writes:
>Jeg har skrevet et halv-langt indlæge om mit problem, men må nu erkende at
>det kan skrivet MEGET kortere...
>xargs sætter en parameter på til sidst. Det er noget skidt, for der skal
>være 3 parametre, og data fra pipen skal indsættes som parameter nummer to.
>Hvordan gør man det? Jeg har brugt en hel del tid på manualen... :)
>$ grep "/robots.txt" logfil | awk '{print $1}' | xargs -n 1 grep -v logfil
grep "/robots.txt" logfil | awk '{print $1}' > /tmp/deleteme ;
for f in `cat /tmp/deleteme` ; do grep -v $f logfile ; done
/Martin
| |
Niels Andersen (16-02-2001)
| Kommentar Fra : Niels Andersen |
Dato : 16-02-01 11:51 |
|
"Martin Moller Pedersen" <tusk@daimi.au.dk> wrote in message
news:96iv1s$c1i$1@news.net.uni-c.dk...
> >$ grep "/robots.txt" logfil | awk '{print $1}' | xargs -n 1 grep -v
logfil
>
> grep "/robots.txt" logfil | awk '{print $1}' > /tmp/deleteme ;
> for f in `cat /tmp/deleteme` ; do grep -v $f logfile ; done
Det virker fint, men jeg kom egentlig til at tænke på noget...
På denne måde vil logfilen blive kørt igennem lige så mange gange, som filen
"/robots.txt" er hentet. Det er da egentlig noget skidt.
Men jeg har ikke rigtigt nogen bedre ideer...
Mvh.
Niels Andersen
| |
Niels Andersen (16-02-2001)
| Kommentar Fra : Niels Andersen |
Dato : 16-02-01 11:53 |
|
"Niels Andersen" <niels-usenet@myplace.dk> wrote in message
news:96j0m3$nad$1@news.inet.tele.dk...
> > grep "/robots.txt" logfil | awk '{print $1}' > /tmp/deleteme ;
> > for f in `cat /tmp/deleteme` ; do grep -v $f logfile ; done
>
> Det virker fint, men jeg kom egentlig til at tænke på noget...
Rettelse, det jeg bad om virker. Det kan bare ikke bruges til at løse mit
problem... *g*
På denne måde opstår der en hulens masse dubletter. Hver linje der IKKE
kommer fra en søgemaskine, vil faktisk stå der lige så mange gange, som
filen "/robots.txt" er hentet.
Sikkert noget jeg kan hacke mig ud af, men jeg synes nu altså at dette
bliver mere og mere kluntet... :(
Er vist begyndt at snakke med mig selv her. :)
Mvh.
Niels Andersen
| |
Lars Balker Rasmusse~ (16-02-2001)
| Kommentar Fra : Lars Balker Rasmusse~ |
Dato : 16-02-01 12:05 |
|
"Niels Andersen" <niels-usenet@myplace.dk> writes:
> $ grep "/robots.txt" logfil | awk '{print $1}' | xargs -n 1 grep -v logfil
>
> Problemet er bare, at xargs kommer med parametrene i forkert rækkefølge:
>
> grep -v logfil 111.222.333.444
>
> og det virker jo ikke! Hvad kan jeg gøre?
$ grep /robots.txt logfil | awk '{print $1}' | xargs -i -n1 grep -v '{}' logfil
Men det vil ikke virke, tror jeg. Følgende virker.
#!/usr/bin/perl
$logfil = "logfil";
%ip = map { ($1, 1) if /^(\S+)/ } `grep /robots.txt $logfil`;
open LOG, $logfil;
while (<LOG>) {
next if /(^(\S+)/ && $ip{$1};
print;
}
--
Lars Balker Rasmussen "Special is bad."
| |
Niels Andersen (16-02-2001)
| Kommentar Fra : Niels Andersen |
Dato : 16-02-01 12:42 |
|
"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0fk86qanxc.fsf@humulus.daimi.au.dk...
> Men det vil ikke virke, tror jeg. Følgende virker.
Guld! :)
Lige et par småting:
> $logfil = "logfil";
Kan jeg ikke sætte $logfil med en parameter? Virker ikke:
$logfil = $1;
> %ip = map { ($1, 1) if /^(\S+)/ } `grep /robots.txt $logfil`;
Kan jeg ikke tilføje et par ip-adresser til listen?
> next if /(^(\S+)/ && $ip{$1};
parentesfejl, det ser ud til at dette virker:
next if /(^(\S+))/ && $ip{$1};
Lige en ting jeg ikke helt kan gennemskue:
Bliver logfilen kigget igennem én gang for hver ip, eller bare én gang for
alle?
Mvh.
Niels Andersen
| |
Dennis Haney (16-02-2001)
| Kommentar Fra : Dennis Haney |
Dato : 16-02-01 13:43 |
|
"Niels Andersen" <niels-usenet@myplace.dk> writes:
> "Lars Balker Rasmussen" <lars@balker.org> wrote in message
> news:0fk86qanxc.fsf@humulus.daimi.au.dk...
> > Men det vil ikke virke, tror jeg. Følgende virker.
>
> Guld! :)
>
> Lige et par småting:
>
> > $logfil = "logfil";
>
> Kan jeg ikke sætte $logfil med en parameter? Virker ikke:
> $logfil = $1;
$logfil = $ARGV[0];
> > %ip = map { ($1, 1) if /^(\S+)/ } `grep /robots.txt $logfil`;
>
> Kan jeg ikke tilføje et par ip-adresser til listen?
jo.
%ip{'ip1'} = 1;
%ip{'ip2'} = 1;
....
%ip{'ipn'} = 1;
tilsvarende kan du helliggøre andre ved:
%ip{'helligip1'} = 0;
(selvfølgelig efter du sætter den til 1)
> Lige en ting jeg ikke helt kan gennemskue:
> Bliver logfilen kigget igennem én gang for hver ip, eller bare én gang for
> alle?
Der er kun een OPEN og een grep, altså 2 gange.
--
--
::: Davh
:::
::: Mother said that there would be days like this,
::: but she never said there would be so many!
| |
Niels Andersen (16-02-2001)
| Kommentar Fra : Niels Andersen |
Dato : 16-02-01 14:04 |
|
"Dennis Haney" <davh@alvis.diku.dk> wrote in message
news:x6ewvaq23ys.fsf@alvis.diku.dk...
> > > %ip = map { ($1, 1) if /^(\S+)/ } `grep /robots.txt $logfil`;
> > Kan jeg ikke tilføje et par ip-adresser til listen?
> %ip{'ip1'} = 1;
5: %ip = map { ($1, 1) if /^(\S+)/ } `gunzip -c $logifl | grep /robots.txt
$logfil`;
6: %ip{'127.0.0.1'} = 1;
syntax error at ./script.pl line 6 near "%ip{"
Hmm...
Jeg bliver nok nødt til at lære Perl engang, men ikke lige nu. :)
> > Lige en ting jeg ikke helt kan gennemskue:
> > Bliver logfilen kigget igennem én gang for hver ip, eller bare én gang
for
> > alle?
>
> Der er kun een OPEN og een grep, altså 2 gange.
Perfekt! :)
Mvh.
Niels Andersen
| |
Dennis Haney (16-02-2001)
| Kommentar Fra : Dennis Haney |
Dato : 16-02-01 15:59 |
|
"Niels Andersen" <niels-usenet@myplace.dk> writes:
> "Dennis Haney" <davh@alvis.diku.dk> wrote in message
> news:x6ewvaq23ys.fsf@alvis.diku.dk...
> > > > %ip = map { ($1, 1) if /^(\S+)/ } `grep /robots.txt $logfil`;
> > > Kan jeg ikke tilføje et par ip-adresser til listen?
> > %ip{'ip1'} = 1;
Det er mig der laver tyrkfejl... Der skal selvfølgelig stå $ istedet
for %.
> 5: %ip = map { ($1, 1) if /^(\S+)/ } `gunzip -c $logifl | grep /robots.txt
> $logfil`;
> 6: %ip{'127.0.0.1'} = 1;
altså $ip{'127.0.0.1'} = 1;
--
--
::: Davh
:::
::: Mother said that there would be days like this,
::: but she never said there would be so many!
| |
Lars Balker Rasmusse~ (16-02-2001)
| Kommentar Fra : Lars Balker Rasmusse~ |
Dato : 16-02-01 21:05 |
|
"Niels Andersen" <niels-usenet@myplace.dk> writes:
> > next if /(^(\S+)/ && $ip{$1};
>
> parentesfejl, det ser ud til at dette virker:
> next if /(^(\S+))/ && $ip{$1};
men
next if /^(\S+)/ && $ip{$1};
er mere elegant, og det jeg mente jeg skrev :)
> Lige en ting jeg ikke helt kan gennemskue:
> Bliver logfilen kigget igennem én gang for hver ip, eller bare én gang for
> alle?
2 gange, men det er for at undgå man ikke læser hele filen ind i
hukommelsen.
--
Lars Balker Rasmussen "Special is bad."
| |
Niels Andersen (16-02-2001)
| Kommentar Fra : Niels Andersen |
Dato : 16-02-01 13:22 |
|
"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0fk86qanxc.fsf@humulus.daimi.au.dk...
> #!/usr/bin/perl
Lige en ting mere...
Logfilerne er pakket. Den kan jeg godt klare her:
> %ip = map { ($1, 1) if /^(\S+)/ } `grep /robots.txt $logfil`;
%ip = map { ($1, 1) if /^(\S+)/ } `gunzip $logfil -c | grep /robots.txt`;
Men hvad gør jeg her:
> open LOG, $logfil;
Er jeg nødt til at pakke den ud før jeg kører dette perl-script?
(Hvis jeg finder flere problemer skal jeg nok smutte over i perl-gruppen.
*s*)
Mvh.
Niels Andersen
| |
Christian Laursen (16-02-2001)
| Kommentar Fra : Christian Laursen |
Dato : 16-02-01 13:28 |
|
"Niels Andersen" <niels-usenet@myplace.dk> writes:
> "Lars Balker Rasmussen" <lars@balker.org> wrote in message
> news:0fk86qanxc.fsf@humulus.daimi.au.dk...
> > #!/usr/bin/perl
>
> Lige en ting mere...
>
> Logfilerne er pakket. Den kan jeg godt klare her:
>
> Men hvad gør jeg her:
> > open LOG, $logfil;
open (LOG, "gunzip -c $logfil|") or die "Couldn't unzip $logfil: $!";
--
Med venlig hilsen
Christian Laursen
| |
Niels Andersen (16-02-2001)
| Kommentar Fra : Niels Andersen |
Dato : 16-02-01 14:10 |
|
"Christian Laursen" <christian@pil.dk> wrote in message
news:841ysy4xsv.fsf@ymer.pil.dk...
> open (LOG, "gunzip -c $logfil|") or die "Couldn't unzip $logfil: $!";
Yeps, det funker... :)
Mvh.
Niels Andersen
| |
Lars Balker Rasmusse~ (16-02-2001)
| Kommentar Fra : Lars Balker Rasmusse~ |
Dato : 16-02-01 21:09 |
|
Christian Laursen <christian@pil.dk> writes:
> open (LOG, "gunzip -c $logfil|") or die "Couldn't unzip $logfil: $!";
Det er ikke korrekt diagnose. Hvis open ("...|") fejler er det fordi
den ikke kunne spawne den nye process, ikke fordi processen fejlede.
Det kan man ikke umiddelbart checke (vistnok).
Det korrekte er
open LOG, "gunzip -c $logfil|" or die "Couldn't fork: gunzip -c $logfil: $!";
XFUT: dk.edb.programmering.perl
--
Lars Balker Rasmussen "Special is bad."
| |
|
|