Re: lug-bg: Елементарен въпрос за awk
- Subject: Re: lug-bg: Елементарен въпрос за awk
- From: Peter Pentchev <roam@xxxxxxxxxxx>
- Date: Mon, 19 Jul 2004 10:39:49 +0300
On Mon, Jul 19, 2004 at 10:36:39AM +0300, Peter Pentchev wrote:
> On Mon, Jul 19, 2004 at 08:31:29AM +0200, Nickolay Kolev wrote:
> > Здравейте,
> >
> > Написах си следното нещо, с което да мога да търся процеси:
> >
> > #!/bin/sh
> >
> > ps aux | grep -i $1 | grep -v grep | grep -v psf | awk '{FS="\t"; print
> > $1 "\t" $2 "\t" $11}'
> >
> > какво прави скриптът е очевидно - показва списъка на процесите с тази
> > разлика, зе се появяват само ПИД, потребител и самата команда,
> > стартирала процеса. Лошото е, че много често тази въпросна команда
> > съдържа в себе си и интервали. Например ако съм стратирел нещо със sudo
> > отпред, то това горното ще ми покаже само sudo, но не и командата
> > по-нанатък. Мислех си, че трябва да сложа \t като разделител на awk (в
> > първия опит просто го бях оставил на разделитяля по подразбиране), но
> > пак не става, резултатът е същият.
> >
> > Та как да кажа на авк да ми даде цялата команда? Демек, а оттук нататък
> > ми дай всичко останало...
>
> Мисля, че и с awk можеше да се направи, само че в момента не мога да се
> сетя точно как :( Но можеш да се справиш малко по-добре с Perl, като го
> направиш 1. с една команда (а не с три grep-а), 2. без да показва самия
> процес, който търси това, което търсиш:
>
> ps awwwfux | perl -ne 'next unless /rspawn/; split /\s+/; next if $_[0] == $$; print join(" ", @_[10..$#_])."\n"'
>
> Или, ако го искаш в малко по-чист вид, като отделно скриптче без
> hardcode-нат /rspawn/, погледни прикаченото pidof-pl :)
Е, разбира се, щеше да е малко по-хитро да го бях и прикачил наистина :)
Поздрави,
Петър
--
Peter Pentchev roam@xxxxxxxxxxx roam@xxxxxxxx roam@xxxxxxxxxxx
PGP key: http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint FDBA FD79 C26F 3C51 C95E DF9E ED18 B68D 1619 4553
You have, of course, just begun reading the sentence that you have just finished reading.
#!/usr/bin/perl
my $cmd = shift;
if (!defined($pid = open(PIPE, "-|"))) {
die("pipe: $!\n");
} elsif ($pid == 0) {
exec("ps awwwfux");
die("executing ps: $!\n");
}
while (<PIPE>) {
next unless /$cmd/;
split /\s+/;
next if $_[1] == $$;
print join("\t", $_[0], $_[1], join(" ", @_[10..$#_]))."\n"
}
Attachment:
pgpzR_qMSyQm_.pgp
Description: PGP signature
|