'grep -v grep' helyett

Gyakori problema, hogy a ps | grep hasznalatakor a grep sajat magat is megtalalja, es azt kulon ki kell venni a kimenetbol. (A problema sed-del, awk-val es a tobbi szurovel is fennall.) Raadasul nem is minden esetben talalja meg sajat magat.


 $ ps -ef | grep syncd

vagy


 $ ps -ef | sed -n '/syncd/!d;p'

Ennek elkerulesere az alabbi megoldasok kinalkoznak, sorban a legjobb fele haladva:

'3rd party' lsof: Az lsof -t (terse output) csak a PID-eket adja vissza, illetve itt regexp is hasznalhato, csak sajna a slash-ekkel nem tud mit kezdeni. Arrol nem is beszelve, hogy lsof nincs mindenhol (pl AIX-en nincs a default telepitesben), illetve nehany rendszeren sima user nem futtathatja.


 $ lsof -t -c syncd

Temp file hasznalata: megoldja a problemat, barmivel feldolgozhato, de igenytelen is...


 $ ps -ef > /tmp/psef_$(date +%s)

Trivialis shell megoldas a grep dupla elofordulasara:


 $ ps -ef | while read line; do grep syncd; done

A legtokeletesebb megoldas a pgrep lenne, ami nem kenyes a slash-ekre, a teljes process cmdline-t tudja hasznalni, a kapott PID-del meg mar azt kezdunk, amit akarunk, de sajnos AIX-en ez elerhetetlen:


 $ pgrep dhcp | xargs ps -o pid=,comm=

Es itt a tuti befuto:


 $ ps -ef | grep [s]yncd

A regexp tartomany pontosan egy karakterre illeszkedik, de mivel a process tree-ben a grep argumentumaiban mar szerepel a szogletes zarojel is, ezert az nem illeszkedik a mintara... Raadasul ez viszonylag gyorsan is hasznalhato, tovabbi pipe-ok hasznalata nelkul.

Az utobbi tippet a HP ITRC HP-UX forumaban talaltam meg eloszor. Hasonlo BRE-vel mas megoldasokat is ki lehet otolni, pl bash-ben a 'grep \\bsyncd'-vel lehet a szo hatarara keresni (boundary), ez ksh88-ban nem mukodik, es csak ott jo, ahol a szo (string) hatara ismert.

Hozzászólások

Ez tetszik és megjegyzem, de mi a baj a "-v"-vel?

KisKresz

BÖFF!


#! /usr/bin/sh
ESZTETKERESD=cron
ps -ef | grep '[^][]'"$ESZTETKERESD"

linugzos gnu grep-es rendszerekben nem árthat egy "| grep ... -- minta" sem.

vagy esetleg:


#! /usr/bin/sh
ESZTETKERESD=cRoN
ps -ef | grep -E '(^|[^)])'"$ESZTETKERESD"

szerk: s/-E/-iE/

http://nocirc.org/

subscribe :)

-----
"Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben."

linuxon a pidof a legegyszerubb megoldas

--
Live free, or I f'ing kill you.

Update!

most futottam bele, hogy a search stringet is le kell vedeni, kulonben 'elvesznek' a zarojelek:


$ ps -ef | grep "[t]omcat"

Ez tenyleg jopofa hack.
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.