lnum=$(($(sed -n '/^---$/=' file | sed '$!d') +1)); sed -n "${lnum},$ p" file
Первый sedвыводит номера строк строк "---" ...
Второй sedизвлекает последний номер из выходных данных первого sed ...
Добавьте 1 к этому числу, чтобы получить начало вашего блока "ccc" ...
Третий 'sed' выводит из начала блока "ccc" в EOF
Обновление (с исправленной информацией о методах Жиля)
Что ж, меня интересовало, как будут работать Гленн Джекман tac , поэтому я проверил время на три ответа (на момент написания) ... Каждый тестовый файл (-ы) содержал 1 миллион строк (их собственных номеров строк).
Все ответы сделали то, что ожидалось ...
Вот времена ..
Жиль sed (один проход)
# real 0m0.470s
# user 0m0.448s
# sys 0m0.020s
Жиль awk (один проход)
# very slow, but my data had a very large data block which awk needed to cache.
Жиль «два прохода» (первый метод)
# real 0m0.048s
# user 0m0.052s
# sys 0m0.008s
Жиль "два прохода" (второй метод) ... очень быстро
# real 0m0.204s
# user 0m0.196s
# sys 0m0.008s
Жиль «два прохода» (третий метод)
# real 0m0.774s
# user 0m0.688s
# sys 0m0.012s
Жиль "gawk" (метод RT) ... очень быстрый , но не POSIX.
# real 0m0.221s
# user 0m0.200s
# sys 0m0.020s
Гленн Джекман ... очень быстро , но не POSIX.
# real 0m0.022s
# user 0m0.000s
# sys 0m0.036s
fred.bear
# real 0m0.464s
# user 0m0.432s
# sys 0m0.052s
Маки Мессер
# real 0m0.856s
# user 0m0.832s
# sys 0m0.028s
sedработает нормально, но я не могуawkзапустить пример; он зависает ... и я получаю ошибку в 3-м примере:cut -f ':' -t 1... cut: неверный параметр - 't'