Это переработанная версия аккуратной функции Стивена Пенни. Она печатает свои аргументы в цвете и заключает их в кавычки по мере необходимости. Используйте ее для выборочного вывода эхом команд, которые вы хотите отследить. Поскольку кавычки выводятся, вы можете копировать напечатанные строки и вставлять их в терминал для немедленного повторного выполнения во время отладки сценария. Прочитайте первый комментарий, чтобы узнать, что я изменил и почему.
xc() # $@-args
{
cecho "$@"
"$@"
}
cecho() # $@-args
{
awk '
BEGIN {
x = "\047"
printf "\033[36m"
while (++i < ARGC) {
if (! (y = split(ARGV[i], z, x))) {
printf (x x)
} else {
for (j = 1; j <= y; j++) {
printf "%s", z[j] ~ /[^[:alnum:]%+,./:=@_-]/ ? (x z[j] x) : z[j]
if (j < y) printf "\\" x
}
}
printf i == ARGC - 1 ? "\033[m\n" : FS
}
}
' "$@"
}
Пример использования с выводом:
# xc echo "a b" "c'd" "'" '"' '"' "fg" '' " " " " \# эта строка печатается зеленым цветом
echo 'a b' c\'d \' '"' fg '' ' ' ''' '#' эта строка печатается зеленым
a b c'd ' " fg # эта строка печатается зеленым
Вторая строка выше печатается зеленым и может быть скопирована для воспроизведения третьей строки.
Дальнейшие замечания
Оригинальный xc Стивена Пенни очень умен, и он заслуживает всех похвал за него. Однако я заметил некоторые проблемы, но я не мог прокомментировать его сообщение напрямую, потому что у меня недостаточно репутации. Поэтому я внес предложенную правку в его сообщение, но рецензенты отклонили мою правку. Поэтому я прибегнул к публикации своих комментариев в виде этого ответа, хотя я бы предпочел иметь возможность редактировать ответ самого Стива Пенни.
Что я изменил в ответе Стивена Пенни
Исправлено: печать нулевых строк - они не печатались. Исправлено: печать строк, включающих %
- они вызывали синтаксические ошибки awk. Заменен for (j in ...)
на for (j = 0, ...)
, поскольку первый не гарантирует порядок обхода массива (это зависит от реализации awk). Добавлен 0 к восьмеричным числам для переносимости.
Обновление
Стивен Пенни исправил эти проблемы в своем ответе, так что эти замечания остались только для исторической справки о моем ответе. Более подробную информацию см. в разделе "Комментарии".
Вы можете использовать для этого awk.
1)
echo server.log.2016-03-20-14 | awk -F'[.]' '{print $3}' | awk -F'[-]' '{print $1$2$3}'
2)
echo server-2016-03-17-13-16-Restart.log | awk -F'[-]' '{print $2$3$4}'
Вы можете передать имя файла для проверки регулярного выражения с помощью sed:
echo server.log.2016-03-20-14 | sed 's/server\.log\.\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\1\2\3/g'
echo server-2016-03-17-13-16-Restart.log | sed 's/server-\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)-Restart.log/\1\2\3/g'
Если вам нужно более строгое регулярное выражение, например, месяцы можно описать с помощью регулярного выражения
0[0-9]\|1[12]
, а дни -
0[1-9]\|[12][0-9]\|3[01]
Это можно сделать с помощью конструкций управления строками оболочки. Для этого требуется оболочка POSIX, поэтому, если вы используете старую версию HP-UX, вам может потребоваться вызвать оболочку POSIX, такую как ksh, а не оболочку Bourne.
Вы не полностью указали, как анализировать дату. Я предполагаю, что первое совпадение ???? - ?? - ??
, где каждая из ??
является цифрой, - это желаемая дата.
p=${0#*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]}
s=${0#"$p"}; p=${0%"$p"}
p=${p#"${p%??????????}"}
year=${p%??????}; p=${p#?????}
month=${p%???}; day=${p#???}
echo "$year$month$day"
Не самый читаемый код, но он работает.