Как извлечь пару значений ключа из команды 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»?

  • Почему «cat / tmp / out1> / tmp / in2 &» отображается как «bash» с помощью команды «ps»?
  • grep случайно появляется и исчезает в ps aux (ps aux | grep python)
  • Завершение скрипта оболочки bash, работающего в фоновом режиме
  • Как узнать команду, выполняемую процессом?
  • Убивание процесса cron и предотвращение его перезапуска
  • Как фильтровать STAT с помощью ps?
  • Можно ли добавить описание к виртуальным машинам qemu?
  • Использование процессора в соответствии с ps и operf
  • 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+" 
    Interesting Posts

    Kali Linux – «пакет не имеет кандидата на установку» (также thinkpad-acpi)

    Как отслеживаются ошибки ядра Linux?

    Как я могу зашифровать файл?

    Передача значения в качестве параметра для xargs для использования с помощью eval echo

    Захват данных с Fluke 1620a через netcat

    как найти файлы текущей даты на удаленном сервере и скопировать их на локальный сервер, используя rcp, используя shell scripting (ksh)?

    Как настроить SSH, чтобы OTP можно было использовать с идентификатором ssh-copy-id, и тогда разрешена авторизация только для ключей?

    Bluetooth-мышь отключается через ~ 30 секунд

    ошибка разрушенной трубы

    Статус добавления Reiser4 в ядро ​​Linux

    Alias ​​команда, которая находится за SSH jumpbox

    Какая конфигурация существует в CentOS, но не в Ubuntu, которая показывает имя пользователя @ hostname для сеансов удаленного терминала?

    Почему «su -c <command> &», по-видимому, позволяет команде запускаться в фоновом режиме без зависания

    Где находится файл буфера обмена?

    Как должен передаваться параметр ядра `crypto`?

    Linux и Unix - лучшая ОС в мире.