Пробовали ли вы source
файл, содержащий функцию?
т.е. если я добавлю функции bash в мой .bashrc
файл (там, где они мне нужны ); Мне нужно source
содержащий файл, .bashrc
в данном случае, чтобы они были доступны глобально.
NB:source
выполняется при загрузке, поэтому мне нужно вручную вызывать его, только если я редактирую функции, чтобы обновить исходный (код ).
Когда что-то не работает, вы должны попытаться разобрать это на части и посмотреть, что делают части, , чтобы вы могли выяснить, где это не удается. Попробуйте выполнить эту команду:
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.
Итак,
2017/04/18 01: ##: ## О выполнении следующая команда отправки:…
”)
и текущее время - 13:00,
ваша переменная $ currentdate
будет иметь вид 2017/04/18 01
, и поэтому он скажет, что сообщение 12-часовой давности является текущим, но 2017/04/18 13:05:32 О выполнении следующей команды отправки:…
»)
, а текущее время - 13:00,
ваш Переменная $ currentdate
(снова) будет 2017/04/18 01
, и поэтому будет указано, что текущее сообщение не является текущим. Вы должны использовать % H
, который находится в диапазоне (00..23).
Редактировать: кажется, вы не уверены в порядке дат в 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 проверяет, текущая дата находится среди этих пар