Использование awk для получения определенной строки в строке

У меня есть процесс Java, содержащий несколько строк в выводе ps. Я просто хочу, чтобы из него вышла определенная строка.

Например, у меня есть

root 5565 7687  0 Nov20 ?  00:00:54 /bin/java -Xms256m -Xmx512m -XX:MaxPermSize=128m  -XX:PermSize=256m -XX:MaxPermSize=256m -Dstdout.file=/tmp/std.out -da -Dext.dir.class=profiles/ -Dprocess.name=java1 -Djava.security.policy=security.policy

Я хочу просто process.name=java1 и ничего больше не требую от ps вывода. Мне не удалось найти реальный способ сделать это с помощью awk или sed.

Я пытаюсь использовать:

ps -ef | grep java1 | grep -v grep | awk '/process.name/ {print $0}'

Вывод, который я получаю, это ps -ef out.

Есть ли более простой способ?


person Hououin Kyouma    schedule 26.11.2014    source источник
comment
Самый простой способ получить желаемый результат — выполнить echo "process.name=java1". Я сомневаюсь, что это полезно, но это не менее полезно, чем то, что вы до сих пор говорили нам, что хотите сделать с 2 greps и скриптом awk. Итак, если вы можете обновить свой вопрос, чтобы сообщить нам, что вы ДЕЙСТВИТЕЛЬНО пытаетесь сделать, мы можем помочь.   -  person Ed Morton    schedule 26.11.2014
comment
@EdMorton, вопрос был настолько конкретным и подробным, насколько это было возможно. Как бы вы предложили отредактировать вопрос? Учитывая ответы, которые я получил, я бы сказал, что сам вопрос был в порядке, ваша способность понять не так уж и велика. И просто чтобы вы знали, два greps очень распространены, и awk был примером того, что я пробовал. Пожалуйста, подумайте, прежде чем комментировать и голосовать.   -  person Hououin Kyouma    schedule 26.11.2014
comment
Я полностью согласен с тем, что сказал @Ed Morton. Многие люди ответили (включая меня), потому что мы интерпретировали ваш вопрос определенным образом. Как мы видим из ваших комментариев в каждом из них, вам ничего не помогло, кроме одного. Таким образом, это ясно показывает, насколько плохо объяснен вопрос... и как быстро мы отвечаем, не спрашивая дополнительных деталей.   -  person fedorqui 'SO stop harming'    schedule 26.11.2014
comment
Я не голосовал. Вы получили ответы, которые производят желаемый результат из определенного ввода — это только отправная точка для решения. Выбранный вами ответ, например, не будет выполнен с учетом ps -ef вывода. Подумайте о том, что вы опубликовали - вы сделали grep java1 | awk '/process.name/' и сказали, что хотите, чтобы скрипт выводил process.name=java1. Подумай об этом. Вы никогда не говорили, что вы действительно хотели сделать, и при этом вы не предоставили действительно репрезентативную выборку входных данных или ожидаемый результат, поэтому вы оставили нас всех просто гадать, и большинство людей, по-видимому, угадали неправильно.   -  person Ed Morton    schedule 26.11.2014
comment
@EdMorton, fedorqui Теперь, когда вы упомянули об этом, судя по ответам, мой вопрос можно сформулировать лучше. Когда я создавал его, я просто не знал, как сделать его лучше. В общем, я слишком много предполагал. Не поймите меня неправильно, я всем здесь благодарен за то, что нашли время, чтобы помочь мне, но, как я уже упоминал, когда я сформулировал вопрос, он выглядел совершенно понятным.   -  person Hououin Kyouma    schedule 26.11.2014
comment
Это хорошо, но, чтобы быть ясным, выбранный вами ответ почти наверняка НЕ ​​делает то, что вы действительно хотите, поскольку он выполняет особый тип соответствия регулярного выражения, называемый совпадением разделителя полей во входной строке, и будет соответствовать частям более длинных строк. Это МОЖЕТ быть тем, чего вы хотите, но это кажется крайне маловероятным, поскольку нет смысла хотеть этого. Все остальные ответы, которые вы получили до сих пор, имеют аналогичные проблемы. Просто потому, что это похоже на то, что вы думаете, что хотите, и выдает желаемый результат из одной выборки входной строки, не означает, что это правильный ответ и он не укусит вас позже с другим вводом.   -  person Ed Morton    schedule 26.11.2014


Ответы (5)


Вот один из способов:

ps -ef | awk -F"process.name" '{split($2,a," ");print FS a[1]}'
process.name=java1
person Jotne    schedule 26.11.2014
comment
Большое спасибо, это было то, что я искал. - person Hououin Kyouma; 26.11.2014

Есть более простой способ: используйте grep -o

ps -ef | grep -o 'process.name=java1'

Однако это выведет только строку «process.name=java1» (возможно, несколько раз, по одному разу для каждого процесса), что мне кажется немного бессмысленным. Что вы действительно пытаетесь сделать?

person glenn jackman    schedule 26.11.2014
comment
Спасибо за ваш ответ, но единственным общим фактором между несколькими процессами является process.name. Java$x входят в число многих созданных. - person Hououin Kyouma; 26.11.2014

Попробуйте сделать это:

ps -ef | grep -o 'process\.name=[a-z0-9]\+'
person Gilles Quenot    schedule 26.11.2014
comment
Это сработало очень, но я надеялся использовать awk. Большое спасибо за Ваш ответ! - person Hououin Kyouma; 26.11.2014

Использование gnu-awk:

ps -ef | awk -v s='process.name=' 'BEGIN{RS=s} !RT{print s $0}'
process.name=java1 -Djava.security.policy=security.policy
person anubhava    schedule 26.11.2014
comment
Мне нужно было все после process.name. С этим я вернулся только 1. У меня есть несколько процессов с формой process.name=java$x. Спасибо. - person Hououin Kyouma; 26.11.2014

Это МОЖЕТ быть тем, что вы хотите, но без дополнительных примеров ввода (ps -ef вывода) и лучшего описания того, что вы хотите сопоставить после знака =, это всего лишь еще одно предположение:

$ sed -r 's#.*[[:space:]]+-D(process\.name=[^[:space:]]+).*#\1#' file
process.name=java1
person Ed Morton    schedule 26.11.2014