Как извлечь пару значений ключа из команды ps

Я пытаюсь извлечь имя приложения из команды ps следующим образом:

 ps -af -u sas |grep "java"| grep -v "grep" 

и он производит следующее:

 sas 24431 1 0 Oct10 ? 00:51:08 /usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs 

Я пытался использовать egrep но, похоже, не работает:

 ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name" 

Как я могу получить только значение -Dapp.name «myApp»?

  • Как узнать общее использование ресурсов памяти с помощью ps?
  • Странное поведение «ps -o pgid»
  • Как я могу привязать strace к процессу, который не находится в выходе ps?
  • История процессов в системах Unix / Linux
  • ps широкий выход для одного процесса
  • Вывод ps lstart изменен
  • Общая оперативная память, используемая программой с `ps`?
  • Найти все незанятые экраны
  • 6 Solutions collect form web for “Как извлечь пару значений ключа из команды ps”

    С awk :

     ps -af -u sas | awk 'BEGIN {RS=" "}; /-Dapp.name/' 

    Вы не показываете сообщение об ошибке, которое вы получаете, но это, вероятно,

    Метод grep: неизвестные устройства

    Это потому, что, как и все или, по крайней мере, большинство других программ командной строки, grep предполагает, что все, что начинается с a, является опцией и пытается проанализировать ее как таковую. В этом случае -D используется для указания grep о том, как обращаться с файлом устройства (подробнее см. man grep ). Один из способов обойти это – использовать -- который сообщает grep что все последующее не является флажком опций.

    Объединяя это с возможностью PCRE GNU grep , вы можете:

     ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+' 

    Регулярное выражение ищет a - и отбрасывает его ( \K ), а затем строку Dapp.name= за которой следует как можно больше не пробелов. Выход:

     Dapp.name=myApp 

    Если вы хотите, myApp часть myApp сохранена в переменной, я бы искал ее:

     ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+' 

    Чтобы присвоить его переменной:

     $ app="$(ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+')" $ echo $app myApp 

    Однако вы никогда не должны grep выводить ps для такого рода вещей, вот что такое pgrep :

     app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')" 
     ps -af -u sas | sed -n '/[j]ava/s/.*-Dapp\.name=\([^ ]*\).*/\1/p' 

    Более сложные, чем другие ответы, но для этого используется getopt для обработки синтаксического анализа. Еще одна альтернатива.

     getopt -aql 'Dapp.name:' $(\ ps -af -u sas | grep java | grep -v grep | tr -s ' ' | cut -d' ' -f8-\ ) | cut -d"'" -f2 
    1. ваша команда: ps -af -u sas | grep java | grep -v grep ps -af -u sas | grep java | grep -v grep
    2. tr -s ' ' «сжимает» несколько пробелов в одном пространстве при подготовке к cut
    3. cut -d' ' -f8- разбивает строку пробелами и захватывает все поля после 8 включительно, результатом является /usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs
    4. getopts -aql 'Dapp.name:' $(...) анализирует параметры команды и выводит только длинное имя, соответствующее Dapp.name которого есть значение (обозначается как --Dapp.name 'myApp' -- , результатом является --Dapp.name 'myApp' --
    5. cut -d"'" -f2 захватывает материал в одинарных кавычках
    6. Результат: myApp

    Каждый раз, когда вы используете ps … | grep … ps … | grep … и нужно исключить grep из результатов, вы делаете это неправильно.

    Нулевым правилом анализа вывода ps является использование более надежных инструментов, таких как pgrep если они доступны. Если у вас есть pgrep, то pgrep -f java перечисляет все процессы, выполняющие команду java . Опция -l добавляет командную строку для каждого процесса.

    Чтобы извлечь аргумент в -Dapp.name , вы можете использовать sed. Сопоставьте всю строку, упорядочите интересную часть в группе и распечатайте эту группу.

     pgrep -lf java | sed -n 's/^.*-Dapp\.name=\([^ ]*\).*$/\1/p' 

    Первым правилом анализа вывода ps является использование опции -o для выбора полей, которые вам нужны. Здесь вас интересуют только аргументы команды, поэтому печатайте только это.

     ps -e -o args= | sed -n 's/^.*-Dapp\.name=\([^ ]*\).*$/\1/p' 

    Я бы использовал pgrep вместо ps так:

     $ pgrep -fa java | grep -op "(<=-Dapp.name=)\w+" 

    Это вернет все процессы, соответствующие java и затем отфильтрует их, показывая только те, которые содержат -Dapp.name= . Последний бит, \w+ будет показывать имя программы, предполагая, что он не содержит пробелов.

    ПРИМЕЧАНИЕ. Переключатель -P в grep обеспечивает возможность указания объектов с помощью регулярных выражений PCRE – Perl Compatible Regular . Не вся версия grep поддерживает его, но большинство из них включены в более современные версии Linux.

    Если вы хотите получить весь вывод ключа / значения, измените так:

     $ pgrep -fa java | grep -oP -- "-Dapp.name=\w+" 
    Linux и Unix - лучшая ОС в мире.