вырезать команду для извлечения полей

Если просто войти в процесс с PID 1, вы получите ответ:

strings /proc/1/exe |grep -q sysvinit
strings /proc/1/exe |grep -q systemd
-1
25.04.2018, 22:11
2 ответа
sed -E -e 's/^.*log\.//' -e 's/\.[A-Z].*//' -e 's/([0-9]{4})-/\1 /'

Первое выражение удалит все в строке до log.непосредственно перед датой.

Второе выражение удалит все из точки, следующей за временем (, единственной точкой, за которой следует -заглавная буква ).

Третье выражение заменит тире после четырехзначного -числа (года )пробелом.

Учитывая входные данные в вопросе, это даст

04-24-2018 08.36
0
28.01.2020, 05:12

Если дата и время имеют уникальный формат в каждой строке, который выглядит как NN-NN-NNNN-NN.NN, где N— число, вы можете использовать один grep:

$ grep -Eo '[0-9]{2}-[0-9]{2}-[0-9]{4}-[0-9]{2}[.][0-9]{2}' file1
04-24-2018-08.36
#to remove the third (last) dash you can pipe to sed
$ grep -Eo '[0-9]{2}-[0-9]{2}-[0-9]{4}-[0-9]{2}[.][0-9]{2}' file1 |sed 's/-/ /3g'
04-24-2018 08.36

Если вы хотите также «привязать» выше регулярное выражение после WPS.log., вы можете использовать gnu grep с -переключателем P (поддержкой регулярных выражений perl):

$ grep -Po '^.*WPS.log.\K[0-9]{2}-[0-9]{2}-[0-9]{4}-[0-9]{2}[.][0-9]{2}' file1 |sed 's/-/ /3g'
04-24-2018 08.36
#\K == forget everything captured so far == forget ^.*WPS.log.
0
28.01.2020, 05:12

Теги

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