Re: lug-bg: Елементарен въпрос за awk
- Subject: Re: lug-bg: Елементарен въпрос за awk
- From: Peter Pentchev <roam@xxxxxxxxxxx>
- Date: Mon, 19 Jul 2004 10:36:39 +0300
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 :)
[roam@straylight ~]> pidof-pl pidof
roam 10164 vim bin/pidof-pl
[roam@straylight ~]> pidof-pl mys
mysql 791 /usr/local/libexec/mysqld --basedir=/usr/local --datadir=/var/db/mysql --pid-file=/var/db/mysql/straylight.pid
root 648 /bin/sh /usr/local/bin/mysqld_safe --user=mysql --datadir=/var/db/mysql --pid-file=/var/db/mysql/straylight.pid
[roam@straylight ~]>
Защо се казва pidof-pl ли? Ами отчасти защото такова нещо вече има: в
почти всички Linux дистрибуции би трябвало да имаш pidof в пакета
procutils или нещо такова (май някъде съм го виждал като ps-procutils),
а ако използваш някой от вариантите на BSD, погледни това, което хората
от NetBSD направиха преди време: pgrep и pkill. Те май ще ти свършат
повече работа от pidof, защото извеждат и пълното име на програмата, не
само process ID-то.
[roam@straylight ~]> pgrep -lf mys
791 /usr/local/libexec/mysqld --basedir=/usr/local --datadir=/var/db/mysql --pid-file=/var/db/mysql/straylight.pid
648 /bin/sh /usr/local/bin/mysqld_safe --user=mysql --datadir=/var/db/mysql --pid-file=/var/db/mysql/straylight.pid
[roam@straylight ~]>
Поздрави,
Петър
--
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
If I had finished this sentence,
Attachment:
pgpjDx7A93Y6l.pgp
Description: PGP signature
|