Противоположность хвоста: все строки, кроме последних n строк

32150
Hans-Peter Störr

Как я могу отбросить последние n строк файла с помощью фильтра командной строки unix?

Это было бы как бы наоборот tail: tailотбрасывает первые n строк, но пропускает остальные, но я хочу, чтобы команда передавала все, кроме последних n строк.

К сожалению, я не нашел ничего подобного - headтоже не помогает. РЕДАКТИРОВАТЬ : по крайней мере, в Solaris это не принимает отрицательные аргументы.

26
К сведению, при использовании заголовка: поместив «-» перед числом с параметром -n, он печатает все строки каждого файла, но не последние N строк, как показано ниже, G Koe 11 лет назад 0

4 ответа на вопрос

31
user570500

If you have GNU head, you can use

head -n -5 file.txt 

to print all but the last 5 lines of file.txt.

If head -n takes no negative arguments, try

head -n $(( $(wc -l file.txt | awk '') - 5 )) file.txt 
(и молитесь, чтобы `file.txt` был длиной не менее шести строк ...) a CVn 11 лет назад 10
К сожалению, эта версия не GNU не работает с потоками, либо Armand 8 лет назад 1
@ MichaelKjörling По крайней мере на Ubuntu, это не проблема. Если в файлах меньше строк, чем указано в `head`, возвращается пустой вывод без ошибок. Alphaaa 6 лет назад 1
Если я не ошибаюсь, глава -n 5 напечатает первые 5 строк, не все, кроме последних 5 ... pypmannetjies 5 лет назад 0
5
jwd

Вот простой способ удалить последнюю строку, которая работает на BSD и т. Д.

sed '$d' input.txt 

Выражение гласит: «В последней строке удалите его». Другие строки будут напечатаны, так как это sedповедение по умолчанию.

Вы можете связать их вместе, чтобы удалить несколько строк

sed '$d' input.txt | sed '$d' | sed '$d' 

По общему признанию, это немного жестко, но делает только один просмотр файла.

Вы также можете взглянуть на это, чтобы получить дополнительные ответы: https://stackoverflow.com/questions/13380607/how-to-use-sed-to-remove-last-n-lines-of-a-file

Вот одна строка, адаптированная из одного из моих любимых там:

N=10 sed -n -e ':a' -e "1,$N!;N;ba" 

Мне было весело расшифровывать это, и я надеюсь, что и вы тоже (: Он выполняет буферизацию Nстрок при сканировании, но в остальном довольно эффективен.

4
Kjetil S.
head file.txt # first 10 lines tail file.txt # last 10 lines head -n 20 file.txt # first 20 lines tail -n 20 file.txt # last 20 lines head -20 file.txt # first 20 lines tail -20 file.txt # last 20 lines head -n -5 file.txt # all lines except the 5 last tail -n +5 file.txt # all lines except the 4 first, starts at line 5 
Что это добавляет, что не было ответа в принятом ответе? Также, как и в случае с другими вашими ответами, несколько строк объяснения вашего ответа значительно улучшат его. music2myear 7 лет назад 1
очень хорошее резюме ruanhao 6 лет назад 1
2
Anders R. Bystrup

I'm curious why you think head is not an option:

~$ man head ... -n, --lines=[-]K print the first K lines instead of the first 10; with the leading `-', print all but the last K lines of each file 

This seems to fit your purpose, using, for example:

head -n -20 yourfile.txt 
Обратите внимание, что это относится только к GNU `head`. BSD `head` не имеет этой опции, поэтому этот ответ не будет * работать * в Solaris или других Unixes без GNU coreutils. ОП специально пометил это с помощью Unix и Unix-Utils. slhck 11 лет назад 5
@slhck Не говоря уже о том, что ОП упомянул, что это для Соляриса. a CVn 11 лет назад 2
К сожалению, кто-то удалил мое упоминание о Солярисе. Но я все равно должен был упомянуть, что версия head не поддерживает это. Hans-Peter Störr 11 лет назад 0
Извините все. Я не заметил Соляриса, и я не знал о различных версиях головы. Anders R. Bystrup 11 лет назад 1
@hstoerr Solaris теперь в ваших тегах :) slhck 11 лет назад 0
не работает на Mac MichaelChirico 5 лет назад 0