Поиск процесса по строке аргумента

Я использую ps, grep и sed, чтобы попытаться идентифицировать некоторые процессы Java, которые однозначно идентифицируются каким-либо конкретным аргументом, например. -DAppService=DDDABC_456 или -DAppService=DDDXYZ_456_cazorla. Я хочу вернуть список, разделенный запятыми: PID,argument,process

Я работаю на CentOS7. Пока я только на полпути по линии, но запутался.

Я стреляю для этого:

1234,-DAppService=DDDABC_456,/usr/java/jdk1.8.0_112/bin/java
2345,-DAppService=DDDABC_456_cazorla,/usr/java/jdk1.8.0_112/bin/java
3456,-DAppService=DDDXYZ_789,/usr/java/jdk1.8.0_112/bin/java
4567,-DAppService=DDDXYZ_789_cazorla,/usr/java/jdk1.8.0_112/bin/java

Обратите внимание, что аргумент может иметь или не иметь суффикс «_cazorla».

Я пробовал это, но он теряет аргументы (и количество аргументов может варьироваться, поэтому я не думаю, что смогу продолжить с $ 9, $ 10 и т. д.):

ps -ef | grep DAppService=DDD[A-Z]*_[0-9]*(?:_[a-z]*)? | grep -v grep | awk '{OFS=","; print $2,$8}'

Дает мне:

1234,/usr/java/jdk1.8.0_112/bin/java
2345,/usr/java/jdk1.8.0_112/bin/java
3456,/usr/java/jdk1.8.0_112/bin/java
4567,/usr/java/jdk1.8.0_112/bin/java

Также эта запятая разделяет все результаты столбца grep и все аргументы, которые мне не нужны:

ps -aef | grep DAppService=DDD[A-Z]*_[0-9]*(?:_[a-z]*)? | grep -v grep | sed -e "s/\s\+/,/g"

Фактический результат слишком велик, чтобы перечислять его здесь, но, например.

user,1234,1,0,Jul03,pts/0,00:03:21,/usr/java/jdk1.8.0_112/bin/java,arg1,arg2,arg3,argn...
user,2345,1,0,Jul03,pts/0,00:03:21,/usr/java/jdk1.8.0_112/bin/java,arg1,arg2,arg3,argn...
user,3456,1,0,Jul03,pts/0,00:03:21,/usr/java/jdk1.8.0_112/bin/java,arg1,arg2,arg3,argn...
user,4567,1,0,Jul03,pts/0,00:03:21,/usr/java/jdk1.8.0_112/bin/java,arg1,arg2,arg3,argn...

Мои познания в sed довольно скудны (как и в awk, но это тоже вариант). Как только я доволен командами, я хочу поместить их в сценарий bash, который я могу вызывать из любого места.


person leon.clements    schedule 03.07.2019    source источник
comment
Замечательно, что вы поместили свою проблему в контекст, но чтобы помочь с awk и/или sed, наиболее полезным было бы показать, что на самом деле вводится в эти команды, то есть включить в ваш вопрос вывод ps -aef | grep DAppService=DDD[A-Z]*_[0-9]*(?:_[a-z]*)? | grep -v grep   -  person jas    schedule 03.07.2019
comment
ваш ps понимает -o spec=name ?   -  person jhnc    schedule 03.07.2019
comment
Привет @jhnc, выдает ошибку: неизвестная спецификация определяемого пользователем формата. Я также не уверен, будет ли это работать на коробке моего клиента. Я знаю, что могу получить вывод с помощью ps, и знаю, что могу обработать вывод с помощью grep/sed/awk.   -  person leon.clements    schedule 03.07.2019
comment
Привет @jas, это для клиента, а данные конфиденциальны, поэтому мне нужно немного запутать. Замена DAppService=DDD[A-Z]*_[0-9]*(?:_[a-z]*)? Однако с любым аргументом любого процесса в выводе ps -ef будет сгенерирован тот же формат результата.   -  person leon.clements    schedule 03.07.2019


Ответы (1)


ps -eo pid=,args= |\
awk '
    {
        for (i=3; i<=NF; i++)
            if ($i ~ regex) {
                print $1, $i, $2
                next
            }
    }
' OFS=, regex='awk re to match arg'
  • попросить ps вывести только pid и командную строку
  • укажите регулярное выражение для awk и проверьте каждый аргумент (поля 3 до NF) на соответствие
  • если найдено, выведите pid ($1), команду ($2) и соответствующий аргумент ($i)

Примечания:

  • awk не может отличить cmd "arg1 with spaces" от cmd arg1 arg2 arg3, но здесь это может не иметь значения
  • пробелы в команде (например, в имени каталога в пути) приведут к усечению команды до первого пробела
  • запятые в команде (или соответствующем аргументе) сломают вывод csv
person jhnc    schedule 03.07.2019
comment
Спасибо за вклад jhnc, это помогло мне сформулировать мой сценарий, а также улучшить мое понимание ps и awk, но в итоге я получил что-то более длинное и понятное для человека. - person leon.clements; 05.07.2019