LINUX.ORG.RU

Как правильно делать grep с регулярками?

 ,


0

1

Всем привет, подскажите как в баше правильно грепнуть, и выбрать, в выводе нужное выражение? К примеру мне нужно из вывода

ps -p пидпроцесса

выбрать название процесса К примеру Firefox у меня был запущен с pid 10326

вывод ps -p 10326 выдаёт:

[code] PID TTY TIME CMD 10326 ? 00:00:18 firefox [/code]

Получается мне надо «выгрепнуть» самое последнее целое слово, т.к. есть процессы в названиях которых не все так гладко как в фаерфоксе - там в названиях есть и цифры и точки и всякие символы и в будущем может понадобится грепать и их то получается что единственной особенностью названия процесса является то что он не содержит в себе пробелов

Тогда грепаю так:

ps -p 10326 | grep -E ‘10326.+(\S+)$’

Но получаю целую строчку

10326 ? 00:00:18 firefox

А мне надо только последний слитный набор символов кроме пробела, т.е. «firefox»

Уже сколько каких вариантов ни перепробовал но ничего не получается - я либо получаю всю строчку целиком либо не получаю ничего вообще! В этом можно просто убедится присвоив результаты вывода переменной например

a1=$(ps -p 10326 | grep -E ‘10326.+(\S+)$’)

echo $a1

Помогите плиз!



Последнее исправление: barmaley99 (всего исправлений: 3)

Даю подсказку. 1) ps умеет выдавать ТОЛЬКО нужные колонки, 2) используй awk.

anonymous
()
Ответ на: комментарий от anonymous

1 - да чтото сразу недогадался, но все равно хотелось бы освоить грепание, хотя перечитав кучу статей у меня уже возникла мысль что греп попросту не умеет того что мне нужно, либо же надо попросту последовательно грепать вывод предыдущего грепа и так грепать одно за другим, не слишком удобно тут видимо и подходит вариант №2

barmaley99
() автор топика

cat /proc/*/comm

anonymous
()

Он тебе всю регулярку и находит.

Во-первых опция -o.

Во-вторых только последняя часть.

В-третьих с чего ты взял что пробелов нет в имени программы.

ps -p 1708
  PID TTY          TIME CMD
 1708 ?        00:00:16 Web Content
sr11
()
Последнее исправление: sr11 (всего исправлений: 1)
ps -p 10326 -o command=

желаешь ты.

beastie ★★★★★
()
Ответ на: комментарий от barmaley99

А мне надо только последний слитный набор символов кроме пробела, т.е. «firefox»

echo " 117599 ?        00:00:04 firefox" | sed -nr 's|.*(\<.*\>)$|\1|p'
firefox
ubik
()
Последнее исправление: ubik (всего исправлений: 1)
Ответ на: комментарий от anonymous
echo " 117599 ?        00:00:04 firefox --test-test" | sed -nr 's|.*[0-9]\s(.*)$|\1|p'
firefox --test-test
ubik
()
Последнее исправление: ubik (всего исправлений: 1)
Ответ на: комментарий от ubik

Сорри глупый вопрос - что означает вертикальная черта | в выражении sed`а ‘s|.(<.>)$|\1|p’? читал man sed, гуглил, о вертикальной черте в седе там ничего

barmaley99
() автор топика
Ответ на: комментарий от barmaley99

Это разделитель, может быть другим.

anonymous
()

grep это фильтр. Он только оставляет строчки, подходящие под выражение, ничего из них выдёргивать он не может. Для выдёргивания можно использовать sed. Впрочем в этом случае и для поиска логично его использовать.

Ещё учитывай, что по умолчанию grep, sed и некоторые другие утилиты используют не те регулярные выражения, к которым все привыкли, а их древнюю примитивную версию. В целом её хватает для многих задач, но можно включить более современные выражения с помощью соответствующих флагов.

Ну и упомянутый awk тоже помогает в некоторых простых случаях.

Вообще советую хорошо изучить и sed, и awk. В них есть гораздо больше возможностей, это практически полноценные языки программирования.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

жаль, что большинство дистрибутивов не проходили unix сертификацию, и твой документик к ним не относится

anonymous
()
Ответ на: комментарий от anonymous

Мой документик относится к переносимым скриптам, которые работают на всех системах, включая большинство дистрибутивов, вне зависимости от того, проходили они сертификацию или нет. А за использование всяких башизмов и гнуизмов надо бить канделябром по кандибоберу.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

работают на всех

прям на всех? нет, не на всех. а сертификата нет - гарантий нет

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.