Как сопоставить дату после совпадения с шаблоном в awk, чтобы убедиться, что совпадение актуально?

Пробовали ли вы sourceфайл, содержащий функцию?

т.е. если я добавлю функции bash в мой .bashrcфайл (там, где они мне нужны ); Мне нужно sourceсодержащий файл, .bashrcв данном случае, чтобы они были доступны глобально.

NB:sourceвыполняется при загрузке, поэтому мне нужно вручную вызывать его, только если я редактирую функции, чтобы обновить исходный (код ).

0
19.04.2017, 21:30
2 ответа

Когда что-то не работает, вы должны попытаться разобрать это на части и посмотреть, что делают части, , чтобы вы могли выяснить, где это не удается. Попробуйте выполнить эту команду:

echo "$LOGGER" | awk "/Send Command has completed Successfully/"

Что вы получите? Только *** Команда отправки успешно завершена строка. Так что, конечно, поиск с указанием даты не работает; эта строка не содержит даты.

Если вам нужно решение для awk, попробуйте что-нибудь вроде

echo "$LOGGER" | awk -vc="$currentdate" '
    /Send Command has completed Successfully/ { flag1=1 }
    $0 ~ c { flag2=1 }
END { if (flag1 && flag2) print "Yes"; else print "No" }'

, которое передает переменную оболочки currentdate в awk как переменную awk c , а затем проверяет, и строка «Отправить команду…» присутствуют во входных данных.

И, кстати,

  • Вы всегда должны указывать ссылки на переменные оболочки (например, "$ currentdate" ), если у вас нет веской причины не делать этого, {{1 }} и вы уверены, что знаете, что делаете. Ваша команда grep… $ currentdate никогда не могла бы работать без кавычек, если в "$ currentdate" есть пробел.
  • Если вы хотите убедиться, что запись журнала актуальна до часа, вы не должны использовать % I в своей команде date - {{1 }} он возвращает час в диапазоне 01..12. Итак,

    • Если запись в журнале сделана с 01:00 (и поэтому написано « 2017/04/18 01: ##: ## О выполнении следующая команда отправки:… ”) и текущее время - 13:00, ваша переменная $ currentdate будет иметь вид 2017/04/18 01 , и поэтому он скажет, что сообщение 12-часовой давности является текущим, но
    • , если, как в вашем примере, запись в журнале сделана с 13:00 (и, следовательно, говорит { {1}} « 2017/04/18 13:05:32 О выполнении следующей команды отправки:… ») , а текущее время - 13:00, ваш Переменная $ currentdate (снова) будет 2017/04/18 01 , и поэтому будет указано, что текущее сообщение не является текущим.

    Вы должны использовать % H , который находится в диапазоне (00..23).

1
28.01.2020, 02:46

Редактировать: кажется, вы не уверены в порядке дат в LOGGER, поэтому я изменил свою запись, чтобы она соответствовала дате "где угодно"

В вашем примере не показаны несколько записей, поэтому я предполагаю вот они:

2017/04/....
(several lines)
*** Send Command has completed Successfully
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
*** Send Command has completed Successfully
2017/04/.... (another time, maybe before or after, no ordering )
(several lines)
2017/04/.... (another time, maybe before or after, no ordering )

Я считаю, что вам просто нужно:

dateappearsas="^[0-9][0-9][0-9][0-9]/[0-9][0-9]/"
looking_for="Send Command has completed Successfully"

echo "$LOGGER" \
| egrep -i "${dateappearsas}|${looking_for}" \
|  grep -i -B 1 "${looking_for}" \
| grep -A 1 "$currentdate"
returncode="$?" # in bash, gets the latest command in the preceding pipe, ie the grep's exit code
# the egrep: outputs all dates, and interspered among those some "successfully"
# the 2nd grep: transform those into pairs of date & successfully
# the last grep find only the matching currentdate and the line after it  
if [ "$returncode" = "0" ]
then
   echo "There is a transfer that matches the current date, AND was successful"
else
   echo "There is either no date matching the current date, or it wasn't successfull"
fi

В основном: egrep, чтобы получить как то, что вы ищете, так и контекст (здесь: дата). Это дает, возможно, несколько строк контекста, и некоторые из них также содержат то, что вы ищете. Затем grep -B 1 'то, что вы ищете' перегруппирует эти пары: контекст/искомые пары вместе (собирая вместе искомые строки и дату непосредственно перед ней), а последний grep проверяет, текущая дата находится среди этих пар

0
28.01.2020, 02:46

Теги

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