Я пытаюсь извлечь имя приложения из 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»?
grep
шаблон начинается с-
, вам нужно поставить его после-e
опции. В противном случае это будет рассматриваться как вариант. Но это будет соответствовать слову-Dapp.name
, а не части после него.grep -o -- -Dapp.name
grep [j]ava
чтобы избежать командыgrep -v "grep"
(проверено на bash)Ответы:
С
awk
:источник
Вы не видите сообщение об ошибке, которое вы получаете, но это, вероятно,
Это связано с тем, что, как и во всех или, по крайней мере, в большинстве других программ командной строки,
grep
предполагается, что все, что начинается с a,-
является опцией и пытается проанализировать его как таковое. В этом случае-D
используется для указанияgrep
того, как обращаться с файлом устройства (см.man grep
Подробности). Одним из способов обойти это является использование,--
которое говорит,grep
что все, что следует, не является флагом опции.Комбинируя это с возможностью GNU PCRE
grep
, вы можете сделать:Регулярное выражение ищет a
-
и отбрасывает его (\K
), затем за строкойDapp.name=
следует как можно больше непробельных символов. Выход:Если вы хотите, чтобы
myApp
часть была сохранена в переменной, я бы искал это один:Чтобы назначить его переменной:
Тем не менее, вы никогда не должны
grep
выводитьps
для такого рода вещи, вот для чегоpgrep
:источник
источник
Каждый раз, когда вы используете
ps … | grep …
и хотите исключить grep из результатов, вы делаете это неправильно.Основное правило анализа выходных данных
ps
- использовать более надежные инструменты, такие какpgrep
доступные. Если у вас есть pgrep,pgrep -f java
перечисляются все процессы, выполняющие командуjava
. Опция-l
добавляет командную строку для каждого процесса.Чтобы извлечь аргумент
-Dapp.name
, вы можете использовать sed. Подберите всю строку, составьте интересную часть в группе и распечатайте эту группу.Первое правило синтаксического анализа вывода
ps
состоит в том, чтобы использовать опцию-o
для выбора нужных полей. Здесь вас интересуют только аргументы команды, поэтому выведите только это.источник
Сложнее, чем другие ответы, но это использует
getopt
для обработки для вас. Еще одна альтернатива.ps -af -u sas | grep java | grep -v grep
tr -s ' '
"сжимает" несколько пробелов в одно место при подготовке кcut
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
getopts -aql 'Dapp.name:' $(...)
анализирует параметры команды и выводит только то длинное имя, которое соответствуетDapp.name
значению (обозначается символом:
), результат--Dapp.name 'myApp' --
cut -d"'" -f2
хватает вещи в одинарных кавычкахmyApp
источник
Я бы использовал
pgrep
вместо этогоps
так:Это вернет все процессы, которые соответствуют,
java
а затем отфильтрует те, которые показывают только те, которые содержат-Dapp.name=
. Последний бит,\w+
покажет имя программы, предполагая, что оно не содержит пробелов.ПРИМЕЧАНИЕ .
-P
Переключатель наgrep
включает возможность задавать вещи с помощью регулярных выражений, совместимых с PCRE - Perl . Не все версииgrep
поддерживают его, но большинство из них включены в более современные версии Linux.Если вы хотите получить весь ключ / значение, измените его следующим образом:
источник