Получить имя каталога из имени файла

Это переработанная версия аккуратной функции Стивена Пенни. Она печатает свои аргументы в цвете и заключает их в кавычки по мере необходимости. Используйте ее для выборочного вывода эхом команд, которые вы хотите отследить. Поскольку кавычки выводятся, вы можете копировать напечатанные строки и вставлять их в терминал для немедленного повторного выполнения во время отладки сценария. Прочитайте первый комментарий, чтобы узнать, что я изменил и почему.

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 к восьмеричным числам для переносимости.

Обновление

Стивен Пенни исправил эти проблемы в своем ответе, так что эти замечания остались только для исторической справки о моем ответе. Более подробную информацию см. в разделе "Комментарии".

1
20.03.2016, 14:53
3 ответа

Вы можете использовать для этого 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}'
1
29.04.2021, 00:16

Вы можете передать имя файла для проверки регулярного выражения с помощью 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]
1
29.04.2021, 00:16

Это можно сделать с помощью конструкций управления строками оболочки. Для этого требуется оболочка 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"

Не самый читаемый код, но он работает.

0
29.04.2021, 00:16

Теги

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