Чтобы получить один случайный блок смежных строк, используйте shuf
для получения одной случайной строки, затем используйте grep
для получения блока строк после случайно выбранной строки.
$ shuf -n 1 file | grep -f - -A 10 file
Это приведет к двойному доступу к файлу. Параметр -f указывает grep получить шаблон поиска из файла, в данном случае stdin (, используя тире в качестве значения параметра f ), который представляет собой одну случайно выбранную строку из файла.
Простая функция:
function random-block {
shuf -n 1 $1 | grep -f - -A $(($2>0?$2-1:0)) $1
}
Пример использования:
$ random-block /var/log/syslog 10
Действительно, это не будет гарантировать вывод запрошенного количества строк, если случайный выбор настолько далеко вниз, что при выборе блока остается недостаточно строк.
Расширенная функция может выглядеть так:
function random-block {
head -n $(($(wc -l | cut -f1 -d ' ')-$2+1)) $1 | shuf -n 1 | grep -f - -A $(($2>0?$2-1:0)) $1
}
Это захватит все строки в файле, кроме последних n строк, а затем перетасует этот список строк. Это гарантирует, что grep всегда сможет выбрать запрошенное количество строк.