/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
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."

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408893
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste