BASH Regex създаване на променливи

Ticketa

Registered
Привет,
вземам информация от /var/log/messages т.е. чета логовете

Имам следния примерен лог:
Mar 13 19:15:24 pineapple software[25570]: CTRL: Client 10.0.0.50 control connection started
Mar 13 19:45:24
pineapple software[25570]: CTRL: Client 10.0.0.50 control connection finished

Това, което искам да извлека като променливи е удебеленото:
Дата, IP, Started или Finished
 

Ticketa

Registered
Нещо не ми се случват нещата. Може би правилната посока би била използването на:
awk

EDIT:
Дори сега след като се замислих, би било още по-добър вариант да има търсене на конкретно IP + изрязване на нужните данни тоест:

Mar 13 19:15:24 pineapple software[25570]: CTRL: Client 10.0.0.50 control connection started
Mar 13 19:45:24 pineapple software[25570]: CTRL: Client 10.0.0.50 control connection finished

Когато скрипта открие ip: 10.0.0.50 , тогава да изреже/създаде нужните променливи:
дата, ip, started/finished


Bash:
grep -P "(?<=Client\s)10.0.0.50" /var/log/messages
Ще ни изведе резултат:

Mar 13 19:15:24 pineapple software[25570]: CTRL: Client 10.0.0.50 control connection started
Mar 13 19:45:24
pineapple software[25570]: CTRL: Client 10.0.0.50 control connection finished

Тоест, мачването/намирането е ОК, въпроса е как да обработиме вече намерения лог :sneaky:
 
Последно редактирано:

Ticketa

Registered
Така; примерен начин, по който вземам Х променливата намерих чрез awk:
grep -P "(?<=Client\s)10.0.0.50" /var/log/messages | awk '{ date=$1 " " $2 " " $3 ; print date; }'
grep -P "(?<=Client\s)10.0.0.50" /var/log/messages | awk '{ IP=$8 ; print IP; }'
grep -P "(?<=Client\s)10.0.0.50" /var/log/messages | awk '{ START_FINISHED=$11 ; print START_FINISHED; }'

Сега хватката е да се сглобят нещата и да работят, ако успея ще пусна кода тук

Все пак,ако някой удари рамо ще съм благодарен :)


EDIT:
Bash:
#!/bin/bash
i=$1
MESSAGE="/var/log/messages"
[ $# -eq 0 ] && { echo "Usage: $0 IP"; exit 999; }
if [ -f $MESSAGE ];
then
    grep -P "(?<=Client\s)$1" /var/log/messages   | awk '{ date=$1 " "  $2 " " $3 ; IP=$8 ; START_FINISHED=$11 ; print "DATE: "date" IP: "IP" STATUS: "START_FINISHED ; }'
else
    echo "$MESSAGE not found."
fi

Ако някой има някакви препоръки нека ме коригира, за момента е както искам а именно:

[root@localhost ~]# ./check 10.0.0.50
DATE: Sep 25 23:22:48 IP: 10.0.0.50 STATUS: finished
DATE: Sep 25 23:26:18 IP: 10.0.0.50 STATUS: started

Като във самият скрипт: променливите: date, IP, START_FINISHED


Опитвам се да конвертирам датата във формат: годинамесецден
20220925

grep -P "(?<=Client\s)10.0.0.50" /var/log/messages | awk '{ getDate="date -f \"%b %d %H:%M:%S\" "$1 " " $2 " " $3" \"+%Y%m%d %H:%M:%S\"" ; print getDate; }'

Обаче не ми се получава:

[root@localhost ~]# grep -P "(?<=Client\s)10.0.0.50" /var/log/messages | awk '{ getDate="date -f \"%b %d %H:%M:%S\" "$1 " " $2 " " $3" \"+%Y%m%d %H:%M:%S\"" ; print getDate; }'
date -f "%b %d %H:%M:%S" Sep 25 23:22:48 "+%Y%m%d %H:%M:%S"
date -f "%b %d %H:%M:%S" Sep 25 23:26:18 "+%Y%m%d %H:%M:%S"
[root@localhost ~]#


Някакви насоки?
 
Последно редактирано:

Горе