Проблема с awk и grep - PullRequest
       3

Проблема с awk и grep

0 голосов
/ 31 октября 2010

Я использую следующий скрипт, чтобы запустить работающий процесс для печати идентификатора, команды ..


if [ "`uname`" = "SunOS" ]  
then  
  awk_c="nawk"  
  ps_d="/usr/ucb/"  
  time_parameter=7  
else  
  awk_c="awk"  
  ps_d=""  
  time_parameter=5  
fi  

main_class=RiskEngine  
connection_string=db.regression  

AWK_CMD='BEGIN{printf "%-15s %-6s %-8s %s\n","ID","PID","STIME","Cmd"} {printf "%-15s %-6s %-8s %s %s %s\n","MY_APP",$2,$time_parameter, main_class, connection_string, port}'  

while getopts ":pnh" opt; do  
  case $opt in  
    p) AWK_CMD='{ print $2 }'  
       do_print_message=1;;  
    n) AWK_CMD='{printf "%-15s %-6s %-8s %s %s %s\n","MY_APP",$2,$time_parameter,main_class, connection_string, port}' ;;  
    h) print "usage  :  `basename ${0}` {-p} {-n}    : Returns details of process running "  
       print "  -p   :   Returns a list of PIDS"  
       print "  -n   :   Returns process list without preceding header"  
       exit 1 ;  

  esac  
done  

ps auxwww | grep $main_class | grep 10348 | grep -v grep | ${awk_c} -v main_class=$merlin_main_class -v connection_string=$merlin_connection_
string -v port=10348 -v time_parameter=$time_parameter "$AWK_CMD"  

# cat /etc/redhat-release  
Red Hat Enterprise Linux AS release 4 (Nahant Update 6)  
# uname -a  
Linux deapp25v 2.6.9-67.0.4.EL #1 Fri Jan 18 04:49:54 EST 2008 x86_64 x86_64 x86_64 GNU/Linux  

Когда я выполняю следующее из скрипта независимо или внутри скрипта

# ps auxwww | grep $main_class | grep 10348 | grep -v grep | ${awk_c} -v main_class=$merlin_main_class -v connection_string=$merlin_connection_string -v port=10348 -v time_parameter=$time_parameter "$AWK_CMD"  

Я получаю две строки в Linux:

ID              PID    STIME    Cmd  
MY_APP      6217   2355352   RiskEngine 10348  
MY_APP      21874  5316      RiskEngine 10348  

У меня только один jvm (команда Java) работает в фоновом режиме, но я все еще вижу 2 строки.

Я знаю, что один из них (Duplicate with pid 21874) происходит от команды awk, которую я выполняю. Он снова включает в себя основной класс и порт, поэтому две строки. Можете ли вы помочь мне избежать той, которая является дубликатом строки?

Не могли бы вы мне помочь?

Ответы [ 4 ]

2 голосов
/ 01 ноября 2010

AWK может сделать все это за вас.

Вот простой пример того, как команда AWK может быть избирательной:

ps auxww | awk -v select="$mainclass" '$0 ~ select && /10348/ && ! (/grep/ || /awk/) && {print}'

ps можно сделать для выборочного вывода полей, что поможет немного уменьшить количество ложных срабатываний. Однако pgrep может быть более полезным для вас, поскольку все, что вы действительно используете, это PID из результата.

pgrep -f "$mainclass.*10348"
0 голосов
/ 26 марта 2011

Вы можете добавить этот простой код перед всеми вашими аргументами awk: '! / Awk / {.... original awk code ....}'

The '! / Awk /' приведет к тому, что awk будет игнорировать любую строку, содержащую строку awk.

Вы также можете удалить свой 'grep -v', если вы расширили мое предложение awk вчто-то вроде: '! / awk / &&! / grep / {... оригинальный код awk ...}'.

0 голосов
/ 31 октября 2010

Я переформатировал код как код, но вам нужно узнать, что ключ возврата - ваш друг.Чудовищно длинные конвейеры должны быть разбиты на несколько строк - я обычно использую одну строку на команду в конвейере.Вы также можете написать сценарии awk более чем в одной строке.Это делает ваш код более читабельным.

Затем вам нужно объяснить нам, что вы делаете.

Однако вполне вероятно, что вы используете 'awk' в качестве варианта grep и обнаружили, что значение 10348 (возможно, предназначенное в качестве номера порта в некоторой командной строке) также выводится ps в качестве одного из аргументов awk (как и значение 'main_class'), поэтому выполучить дополнительную информацию.Вам нужно будет пересмотреть сценарий awk, чтобы исключить (игнорировать) строку, содержащую 'awk'.

Обратите внимание, что вы все еще можете быть обмануты командой, выполняющей ваш основной класс на порту 9999 (любое значение)кроме 10348), если это так, что он запускается процессом с PID или PPID, равным 10348. Если вы собираетесь выполнить работу полностью, то сценарий 'awk' должен анализировать только «команду плюс опции»часть линии.

0 голосов
/ 31 октября 2010

Вы уже используете трюк grep -v grep в своем коде, почему бы просто не обновить его, чтобы исключить также процесс awk с помощью grep -v ${awk_c}?

Другими словами, последняя строкаВаш сценарий будет (в одной строке и с реальными параметрами команды awk, а не blah blah blah).:

ps auxwww
    | grep $main_class
    | grep 10348
    | grep -v grep
    | grep -v ${awk_c}
    | ${awk_c} -v blah blah blah

Это обеспечит то, что список процессов не будет связан со словом awk в нем.

Имейте в виду, что это не всегда хорошая идея сделать это (ложные срабатывания), но, поскольку вы уже рискуете с процессами, содержащими grep, вы можететакже сделайте это с теми, кто содержит awk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...