Разобрать строку с bash и извлечь номер - PullRequest
10 голосов
/ 15 июня 2010

У меня вывод статуса супервизора, похожий на этот.

frontend                         RUNNING    pid 16652, uptime 2:11:17
nginx                            RUNNING    pid 16651, uptime 2:11:17
redis                            RUNNING    pid 16607, uptime 2:11:32

Мне нужно извлечь PID nginx.Я сделал это с помощью команды grep -P, но на удаленной машине grep собирается без поддержки регулярных выражений perl.

Похоже, sed или awk - это именно то, что мне нужно, но я не знаком с ними.

Пожалуйста, помогите мне найти способ, как это сделать, заранее спасибо.

Ответы [ 6 ]

14 голосов
/ 15 июня 2010
sed 's/.*pid \([0-9]*\).*/\1/'
6 голосов
/ 15 июня 2010

Использование только AWK:

awk -F'[ ,]+' '{print $4}' inputfile
5 голосов
/ 15 июня 2010

Решение с awk и cut

vinko@parrot:~$ cat test
frontend                         RUNNING    pid 16652, uptime 2:11:17
nginx                            RUNNING    pid 16651, uptime 2:11:17
redis                            RUNNING    pid 16607, uptime 2:11:32
vinko@parrot:~$ awk '{print $4}' test | cut -d, -f 1
16652
16651
16607

только для nginx:

vinko@parrot:~$ grep nginx test | awk '{print $4}' | cut -d, -f 1
16651
2 голосов
/ 16 июня 2010

Взгляните на pgrep , вариант grep, специально предназначенный для таблиц процесса обработки.

2 голосов
/ 15 июня 2010
$ cat $your_output | sed -s 's/.*pid \([0-9]\+\),.*/\1/'
16652
16651
16607
1 голос
/ 15 июня 2010

при условии, что реализация grep поддерживает параметр -o, вы можете использовать два grep:

output \
  | grep -o '^nginx[[:space:]]\+[[:upper:]]\+[[:space:]]\+pid [0-9]\+' \
  | grep -o '[0-9]\+$'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...