Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 10.01.2019
Сообщений: 1

Скрипт парсинга syslog

10.01.2019, 08:01. Показов 3976. Ответов 5

Студворк — интернет-сервис помощи студентам
Добрый день.
Я новичок, пробую освоить Linux (экспериментирую с CetnOS). Возникла необходимость распарсить лог (на примере syslog'a) с помощью регулярок RegExp. Т.е. сделать некий Bash-скрипт. Помогите пожалуйста, если кому не сложно.

Имеется лог к примеру такого вида:

Кликните здесь для просмотра всего текста
Jan 10 08:01:01 localhost systemd: Created slice User Slice of root.
Jan 10 08:01:01 localhost systemd: Starting User Slice of root.
Jan 10 08:01:01 localhost systemd: Started Session 312 of user root.
Jan 10 08:01:01 localhost systemd: Starting Session 312 of user root.
Jan 10 08:01:01 localhost systemd: Removed slice User Slice of root.
Jan 10 08:01:01 localhost systemd: Stopping User Slice of root.
Jan 10 09:01:01 localhost systemd: Created slice User Slice of root.
Jan 10 09:01:01 localhost systemd: Starting User Slice of root.
Jan 10 09:01:01 localhost systemd: Started Session 313 of user root.
Jan 10 09:01:01 localhost systemd: Starting Session 313 of user root.
Jan 10 09:01:01 localhost systemd: Removed slice User Slice of root.
Jan 10 09:01:01 localhost systemd: Stopping User Slice of root.
Jan 10 09:19:49 localhost systemd: Created slice User Slice of testuser.
Jan 10 09:19:49 localhost systemd: Starting User Slice of testuser.
Jan 10 09:19:49 localhost systemd: Started Session 314 of user testuser.
Jan 10 09:19:49 localhost systemd-logind: New session 314 of user testuser.
Jan 10 09:19:49 localhost systemd: Starting Session 314 of user testuser.


Нужно вывести на экран следующие данные из лог-файла:
Значение date (в качестве этого параметра даты, типо Jan 10 09:19:49)
Значение hostname (в качестве этого параметра localhost из лог файла)
Имя процесса\службы (в качестве примера systemd из лог файла)
Далее в строке лога идёт сообщение, необходимо с помощью "регулярок" вывести на экран только строки содержащие к примеру testuser (далее в других логах это может быть заменено на парсинг по наличию в строке значения error, Error)

P.S. опционально - выбрать из всего найденного в логе только данные за последние 20 минут (значение date)

Результат должен быть примерно таким:
Jan 10 09:19:49 localhost systemd: Created slice User Slice of testuser.
Jan 10 09:19:49 localhost systemd: Starting User Slice of testuser.
Jan 10 09:19:49 localhost systemd: Started Session 314 of user testuser.
Jan 10 09:19:49 localhost systemd-logind: New session 314 of user testuser.
Jan 10 09:19:49 localhost systemd: Starting Session 314 of user testuser.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.01.2019, 08:01
Ответы с готовыми решениями:

Скрипт для парсинга страницы
Здравствуйте необходимо помочь починить sh скрипт, данный скрипт подключается по ip, парсит страницу по методам из файла <!DOCTYPE...

Скрипт для парсинга информации
Нам необходимо реализовать скрипт, который бы выделял из файла заголовки, то есть информацию заключенную между <span...

Скрипт для парсинга html на bash
Собственно задача: Спарсить html-страницу с помощью bash-скрипта. Гуглил. Везде предлагают регулярки. Меня регулярки не устраивают.

5
Эксперт NIX
 Аватар для nezabudka
3334 / 752 / 252
Регистрация: 28.06.2015
Сообщений: 1,552
Записей в блоге: 16
10.01.2019, 15:42
Bash
1
2
3
4
5
6
7
#!/bin/bash
awk -v dn=$(date --date "-$1" +%s) '{
        cmd = "date -d \""$3"\" +%s"
        cmd | getline d
        close(cmd)
        if(d<dn)print $1,$2,$3,$4,$5,$NF
}' log
Запускаем так
Bash
1
2
3
./test 20minute
./test 5hour
./test 2day
Добавлено через 2 часа 10 минут
Что то я накосячила
Bash
1
2
3
4
5
6
7
#!/bin/bash
awk -v dn=$(date --date "-$1" +%s) '{
        cmd = "date -d \""$1" "$2" "$3"\" +%s"
        cmd | getline d
        close(cmd)
        if(d>dn)print $1,$2,$3,$4,$5,$NF
}' log
1
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
11.01.2019, 17:34
Bash
1
grep testuser syslog
не?
1
Эксперт NIX
 Аватар для nezabudka
3334 / 752 / 252
Регистрация: 28.06.2015
Сообщений: 1,552
Записей в блоге: 16
11.01.2019, 19:01
А, я забыла
Цитата Сообщение от Anykey96 Посмотреть сообщение
только строки содержащие к примеру testuser (далее в других логах это может быть заменено на парсинг по наличию в строке значения error, Error)
Можно ввести вторым параметром
Bash
1
2
3
4
5
6
7
8
#!/bin/bash
awk -v dn=$(date --date "-$1" +%s) -v pt="$2" \
       '$0 ~ pt {
        cmd = "date -d \""$1" "$2" "$3"\" +%s"
        cmd | getline d
        close(cmd)
        if(d>dn)print $1,$2,$3,$4,$5,$NF
}' log
Запускаем так
Bash
1
./test 2day testuser
1
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
11.01.2019, 19:23
nezabudka, В современном (g)awk есть собственные функции времени
1
Эксперт NIX
 Аватар для nezabudka
3334 / 752 / 252
Регистрация: 28.06.2015
Сообщений: 1,552
Записей в блоге: 16
12.01.2019, 09:20
Marinero, Если использовать встроенные функции придется отбрасывать названия месяцев,
потому как я не знаю простого способа изменить их названия на числа, единственный формат доступный в mktime()
А если это сделать то отпадает необходимость в этих функциях, поскольку можно просто
создавать шаблон и сравнивать строки "10 09:19:49" < "10 19:19:49"

Добавлено через 1 час 33 минуты
Ну вот, если без месяцев, и пришлось добавлять нолики в дни
если они состоят из одной цифры, чтобы выровнять строки по длинне.
На выводе это ни как не сказывается, а нужно только для правильного сравнения.
Bash
1
2
3
4
5
6
#!/bin/bash
awk -v dp="$(date --date "-$1" +%d%H:%M:%S)" \
        -v pt="$2" '$0 ~ pt {
        if(gensub(/^[0-9]$/, "0&", 1, $2)$3 > dp) \
        print $1,$2,$3,$4,$5,$NF
}' log
Запускаем также
Bash
1
./test 3day root
Добавлено через 1 час 54 минуты
Здесь awk не даст прироста скорости. Переписала все на баше.
Первый скрипт работает быстрее но не учитывает месяцы в дате.
Bash
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
dp="$(date --date "-$1" +%d%H%M%S)"
while read m d t host com buf; do
        if [[ $buf =~ "$2" ]]; then
                var="0$d"
                if [ $dp \< "${var: -2}${t//[^0-9]}" ]; then
                        echo "$m $d $t $host $com ${buf##* }"
                fi
        fi
done < log
Этот скрипт учитывает месяцы но несколько проигрывает в скорости
Bash
1
2
3
4
5
6
7
8
9
#!/bin/bash
dp="$(date --date "-$1" +%s)"
while read m d t host com buf; do
        if [[ $buf =~ "$2" ]]; then
                if [ "$(date -d "$m $d $t" +%s)" -gt "$dp" ]; then
                        echo "$m $d $t $host $com ${buf##* }"
                fi
        fi
done < log
Оба скрипта запускаются так же как и предыдущий
Bash
1
2
3
4
./script 20minute testuser
./script 1week root
./script 2month #для второго скрипта
./script 5day
Если опустить второй параметр и не указывать пользователя
то выведутся строки в данном интервале для всех пользователей

Добавлено через 7 часов 4 минуты
Цитата Сообщение от Anykey96 Посмотреть сообщение
парсинг по наличию в строке значения error, Error
Чтобы совпадал регистронезависимый шаблон заменим эту строчку
Bash
1
if [[ $buf =~ "$2" ]]; then
На эту
Bash
1
if [[ "${buf,,}" =~ "${2,,}" ]]; then
Теперь будут совпадать и Error и error и даже ErRoR
А в выводе на экран командой echo параметр ${buf##* }
можно заменить на "$2"
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.01.2019, 09:20
Помогаю со студенческими работами здесь

скрипт парсинга текстового файла
Добрый день! Есть файл вида: 0|06.11.2016|номер||726.53|10.2016|счет|1|39420|3330000015 ...

Скрипт парсинга html-страницы на PowerShell
Есть некий скрипт, который парсит веб-страницу и выводит на экран содержимое таблицы (список сотрудников с их контактными данными): $uri...

Скрипт парсинга html-страницы на PowerShell
Здравствуйте, уважаемые знатоки! Очень прошу Вас помочь. Задача такая: необходимо написать скрипт (на PowerShell), который будет парсить...

Скрипт парсинга поисковой выдачи Google
Есть скрипт для парсинга результатов поиска Google, получая на входе ключевое слово и имя домена, на выходе должен вернуть номер позиции в...

Нужен скрипт для парсинга лога
Добрый день. Прошу помощи у гуру, вот задание Необходимо автоматизировать поиск минимального, максимального и среднего времени...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru