Я думаю, что все знают полезные утилиты Linux cmd line head
и tail
. head
позволяет печатать первые X строк файла, tail
делает то же самое, но печатает конец файла. Что такое хорошая команда для печати середины файла? что-то вроде middle --start 10000000 --count 20
(выведите от 10 000 до 10 000 010 строк).
Я ищу то, что будет эффективно работать с большими файлами. Я пытался, tail -n 10000000 | head 10
и это ужасно медленно.
Ответы:
Вы могли бы ускорить это немного так:
В этих командах опция
-n
вызываетsed
«подавление автоматической печати пространства шаблона». Командаp
«print [s] текущее пространство шаблона» иq
команда «Немедленно завершить работу [s] сценария sed без обработки ввода ...» Цитаты взяты соsed
man
страницы .Кстати, ваша команда
начинается с десятимиллионной строки от конца файла, в то время как ваша «средняя» команда должна начинаться с десятимиллионной строки с начала, что будет эквивалентно:
Проблема в том, что для несортированных файлов со строками переменной длины любой процесс должен будет проходить через файл, считая новые строки. Там нет никакого способа, чтобы сократить это.
Однако, если файл отсортирован (например, файл журнала с метками времени) или имеет строки фиксированной длины, то вы можете искать в файле, основываясь на позиции байта. В этом примере файл журнала, вы могли бы сделать бинарный поиск в диапазоне времени , как мой сценарий Python здесь * делает. В случае файла с фиксированной длиной записи это действительно просто. Вы просто ищете
linelength * linecount
символы в файле.* У меня есть намерение опубликовать еще одно обновление этого скрипта. Может быть, я доберусь до этого на днях.
источник
sed
версия Чарльзаmiddle
функции:middle() { local s=$1 c=$2; shift 2; sed -n "$s,$(($s + $c -1))p; $(($s + $c))q" "$@"; }
. Он будет обрабатывать несколько файловых аргументов, имена файлов с пробелами и т. Д. Несколько файлов обрабатываются вместе, как если бы они были обработаны таким же образом,sed
как обычно (таким образом, средняя 1000 100 файл1 файл2 будет проходить от конца первого файла до начала второго, если первый имеет менее 1100 строк).middle startline count filename
имени файла:middle startline count file1 file2 file3
или с несколькими именами файлов: или с перенаправлением:middle startline count < filename
или в трубе:some_command |
среднее число начальных строк илиcat file* | middle startline count
Я обнаружил следующее использование
sed
Надеюсь, это кому-нибудь пригодится!
источник
sed -n
аргумента, который делает его вполне читабельным.extract_lines(){sed -n "$1,+$2p" <file>}
который пишет в стандартный вывод.Это мой первый пост здесь! Во всяком случае, это легко. Допустим, вы хотите извлечь строку 8872 из файла с именем file.txt. Вот как вы это делаете:
cat -n file.txt | grep '^ * 8872'
Теперь вопрос в том, чтобы найти 20 строк после этого. Для этого вы делаете
cat -n file.txt | grep -A 20 '^ * 8872'
Для линий вокруг или перед смотрите флаги -B и -C в руководстве grep.
источник
cat -n file.txt | grep '^ *1'
выведите все строки с 1 справа. Как вывести строку 1 с помощью этой техники? Я знаю, я могу голову -n 1 .... но как использовать grep?Ответ Денниса - это путь. Но используя только голову и хвост, под bash:
Это сканирует первые строки $ 1 + $ 2 дважды, так что это намного хуже, чем ответ Денниса. Но вам не нужно помнить все эти буквы, чтобы использовать его ....
источник
$[...]
не рекомендуется, по крайней мере, в Bash. Кроме того, вам не хватает параметра файла.middle 10 10 < /var/log/auth.log
.Используйте следующую команду, чтобы получить определенный диапазон строк
Здесь debug.log - мой файл, в котором отсутствуют строки, и я использовал его для печати строк с номера строки 1220974 до 1513793 в файл test.log. Надеюсь, это будет полезно для захвата диапазона линий.
источник
Рубиновая версия.
Это может быть полезно для кого-то. Решения с «sed», предоставленные Dennis и Dox, очень хороши, даже несмотря на то, что они кажутся быстрее.
источник
Вы можете использовать «нл».
источник
Например, этот awk будет печатать строки между 20 и 40
источник
Если вам известны нумерации строк, скажем, вы хотите получить строки 1, 3 и 5 из файла, скажем / etc / passwd:
источник
Perl - король:
источник