Как правильно выбрать два поля - PullRequest
1 голос
/ 15 апреля 2020

У меня есть журнал, подобный следующему:

[T:OK:OK:SV[server1-ph:12345]:PHP-APACHE:*] LastAccesssDate : 10-30-2019
[T:OK:OK:SV[server2-ph:12346]:PHP-APACHE:*] LastAccesssDate : 04-10-2020

Я хочу получить сервер и LastAccesssDate, как показано ниже:

server1 10-30-2019
server2 04-10-2020

I ' я пытаюсь с помощью этой команды sed, но она не работает.

echo "[T:OK:OK:SV[server2-ph:12346]:PHP-APACHE:*] LastAccesssDate : 04-10-2020" \
    | sed -r 's/SV\[([^-]*);^LastAccesssDate : ([^*]*).*/\1 \2/g'

Ответы [ 4 ]

2 голосов
/ 15 апреля 2020

С помощью sed я обнаружил, что удалить то, что вам не нужно, проще, чем захватить то, что вы хотите захватить.

Используя эту стратегию, попробуйте следующую команду sed:

sed -e 's/^[[].*[[]//' -e 's/-.*LastAccesssDate ://' 

Первое редактирование -e 's/^[[].*[[]//' удаляет все во вторую открытую квадратную скобку [. Важно отметить, что, поскольку [ распознается как специальный символ, вы должны экранировать его как: [[].

Второе редактирование -e 's/-.*LastAccesssDate ://' удаляет все из следующего da sh - двоеточие : после 'LastAccessDate'. Это оставляет нас с сервером и датой.

1 голос
/ 15 апреля 2020

Ваш sed не был вполне прав.

echo "[T:OK:OK:SV[server2-ph:12346]:PHP-APACHE:] LastAccesssDate : 04-10-2020" | sed -r 's/.*SV\[([^:]+).*LastAccesssDate : (.*)/\1 \2/g'
server2-ph 04-10-2020
0 голосов
/ 15 апреля 2020

Это может сработать для вас (GNU sed):

sed 's/^\[[^[]*\[\([^-]*\).*\s/\1 /' file

Удалите все с начального [ до следующего [ и затем все с следующего - до последнего пробела.

0 голосов
/ 15 апреля 2020

С помощью awk вы можете получить:

$ awk -F'[\[- ]' '{print $3, $(NF-2)"-"$(NF-1)"-"$NF}' filename
server1 10-30-2019
server2 04-10-2020
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...