BASH - регулярное выражение grep - PullRequest
0 голосов
/ 02 августа 2020

Я читал множество разных людей, пытающихся делать похожие вещи (с такими инструментами, как sed / awk / grep), и я пробовал читать docs , чтобы создать свою собственную ... Но я не выполняя то, что я считал относительно простым регулярным выражением.

Я анализирую вывод netstat и изолирую PID.

Я знаю, что одно соединение может быть используются несколькими PID, но я также знаю, что определенные c типы соединений, которые я изолирую, будут отдельными пользователями в определенной службе.

Минимальный пример данных, которые я редактирую:

users:((sshd,pid=1762,fd=5))

Я пытаюсь выделить:

pid = 1762

Я собирался использовать (в качестве примера):

echo "users:(("sshd",pid=1762,fd=5))"| sed "s/users:((//" | sed "s/))//"| cut -d "," -f2

Что делает именно то, о чем я прошу ... Но я просто знаю, что это плохое решение. Может кто-нибудь мне немного помочь, пожалуйста? :)

Ответы [ 3 ]

0 голосов
/ 02 августа 2020

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

V='users:((sshd,pid=1762,fd=5))'

# Using Pattern
IFS=, read x1 x_pid x3 <<< "$V"
echo "$x_pid"

Или с использованием REGEX

V='users:((sshd,pid=1762,fd=5))'

[[ "$V" =~ ,(pid=[0-9]+), ]] && x_pid=${BASH_REMATCH[1]}
echo "$x_pid"
0 голосов
/ 02 августа 2020
echo "users:((sshd,pid=1762,fd=5))" | cut -d',' -f2

echo "users:((sshd,pid=1762,fd=5))" | grep -o "pid=[0-9]*"

Последнее, похоже, тоже работает, хотя я думаю, что -o является расширением GNU, поэтому его нельзя переносить.

0 голосов
/ 02 августа 2020

Комментарий Jetchisel предлагается использовать параметр разделителя полей в awk:

echo 'users:((sshd,pid=1762,fd=5))' | sed 's/^.*sshd,//;s/,fd=.*$//' или echo 'users:((sshd,pid=1762,fd=5))' | awk -F, '{print $2}'

Это сработало отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...