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
Как я могу отбросить последние n строк файла с помощью фильтра командной строки unix?
Это было бы как бы наоборот tail
: tail
отбрасывает первые n строк, но пропускает остальные, но я хочу, чтобы команда передавала все, кроме последних n строк.
К сожалению, я не нашел ничего подобного - head
тоже не помогает. РЕДАКТИРОВАТЬ : по крайней мере, в Solaris это не принимает отрицательные аргументы.
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
Вот простой способ удалить последнюю строку, которая работает на 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
строк при сканировании, но в остальном довольно эффективен.
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
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