Журналы брандмауэра Grep Syslog

Поскольку вы выполняете поиск по GID, а не по групповому имени , и вас интересует только первичный GID для каждого пользователя, это тривиально просто с Awk..

Формат /etc/passwdописан в man 5 passwd. Чтобы процитировать справочную страницу:

   There is one entry per line, and each line has the format:

          account:password:UID:GID:GECOS:directory:shell

Итак, вы хотите напечатать первое поле для каждой строки, где четвертое поле — это то, что передается вашему сценарию. Где «поля» разделены двоеточиями.

Лично я не стал бы заморачиваться со сценарием для этого; Я бы использовал функцию оболочки. См.:

Итак, все, что вам нужно, это:

  • Понимание опции -Fдля Awk
  • Базовое понимание синтаксиса Awk,condition {action}
  • Понимание того, как ссылаться на поля при использовании Awk,и
  • Будет полезно, если вы поймете, как передавать переменные оболочки в Awk; посмотрите на опцию -vAwk.

Проверьте справочную страницу для Awk, чтобы получить эти пункты.


Я не буду делать за вас домашнюю работу — суть в том, чтобы научиться кодировать , а не копировать и вставлять. Но если вы застряли на этом, пожалуйста, прокомментируйте этот вопрос. Я могу добавить немного больше деталей, если это необходимо. (Через неделю или около того я смогу обновить и включить полное решение.)


Примечание :В реальном мире, как видно из других ответов, поиск пользователей сопряжен с гораздо большими сложностями. Существует множество различных способов хранения пользователей, и учет этих сложностей может быть… сложным.

Но ваш вопрос, по-видимому, представляет собой специальное задание -, которое легко выполнить с помощью Awk, а также представляет собой реалистичное приложение, которое было бы полезно в реальном мире.

1
08.06.2019, 02:38
2 ответа

Использованиеgrep:

$ grep -o '\(src\|dst\)=[^:]\+:[^:]\+\|proto=[^ ]\+' logfile.txt
src=12.1.1.11:49894
dst=4.2.2.2:53
proto=udp/dns

Описание:

  • '\(src\|dst\)=соответствует srcили dst, за которым следует=
  • [^:]\+:[^:]\+один или несколько символов, не являющихся двоеточиями -, за которыми следует :, а затем один или несколько символов, не являющихся двоеточиями -
  • \|или
  • proto=[^ ]\+'соответствует proto=, за которым следует один или несколько символов, не являющихся -пробелами

Мы можем склеить новые строки с помощьюpaste:

$ grep -o '\(src\|dst\)=[^:]\+:[^:]\+\|proto=[^ ]\+' logfile.txt | paste -s -d,
src=12.1.1.11:49894,dst=4.2.2.2:53,proto=udp/dns
1
27.01.2020, 23:30

Исходя из того, что у вас есть:

awk '{print $18,$19,$21}' OFS=", " logfile.txt | sed 's|:X[0-1]||g'

Вам не нужно cat, так как awkуже пишет в стандартный вывод. Приведенная выше команда печатает эти поля, разделенные пробелом, что и делает запятая, а затем устанавливает разделитель полей в виде запятой, окруженной пробелами, и использует sedдля удаления :X0и :X1.

Выход:

src=12.1.1.11:49894, dst=4.2.2.2:53, proto=udp/dns
1
27.01.2020, 23:30

Теги

Похожие вопросы