Ответы:
Вы можете использовать это для удаления первых двух строк:
tail -n +3 foo.txt
и это, чтобы лишить последних двух строк:
head -n -2 foo.txt
(при условии, что файл заканчивается \n
на последний)
Так же, как для стандартного использования tail
и head
эти операции не являются разрушительными. Используйте, >out.txt
если вы хотите перенаправить вывод в новый файл:
tail -n +3 foo.txt >out.txt
В случае, если он out.txt
уже существует, он перезапишет этот файл. Используйте >>out.txt
вместо, >out.txt
если вы хотите, чтобы вывод был добавлен out.txt
.
head -n -2
не совместим с POSIX .
Если вы хотите все, кроме первых N-1 строк, звоните tail
с количеством строк +N
. (Число - это номер первой строки, которую вы хотите сохранить, начиная с 1, т.е. +1 означает начало сверху, +2 означает пропуск одной строки и т. Д.).
tail -n +3 foo.txt >>other-document
Нет простого, портативного способа пропустить последние N строк. GNU head
позволяет head -n +N
в качестве аналога tail -n +N
. В противном случае, если у вас есть tac
(например, GNU или Busybox), вы можете объединить его с tail:
tac | tail -n +3 | tac
В частности, вы можете использовать фильтр awk (не проверено):
awk -vskip=2 '{
lines[NR] = $0;
if (NR > skip) print lines[NR-skip];
delete lines[NR-skip];
}'
Если вы хотите удалить последние несколько строк из большого файла, вы можете определить смещение в байтах фрагмента для усечения, а затем выполнить усечение dd
.
total=$(wc -c < /file/to/truncate)
chop=$(tail -n 42 /file/to/truncate | wc -c)
dd if=/dev/null of=/file/to/truncate seek=1 bs="$((total-chop))"
Вы не можете обрезать файл на месте в начале, хотя, если вам нужно удалить первые несколько строк огромного файла, вы можете перемещать содержимое .
Со tail
страницы руководства ( tail
то есть GNU ):
-n, --lines=K
output the last K lines, instead of the last 10; or use -n +K to
output lines starting with the Kth
Таким образом, следующий должен приложить все , но первые 2 строки somefile.txt
в anotherfile.txt
:
tail --lines=+3 somefile.txt >> anotherfile.txt
Для удаления первых n строк можно использовать GNU sed. Например, если n = 2
sed -n '1,2!p' input-file
Имеется в !
виду «исключить этот интервал». Как вы можете себе представить, более сложный результат может быть получен, например,
sed -n '3,5p;7p'
это покажет строку 3,4,5,7. Больше силы приходит от использования регулярных выражений вместо адресов.
Ограничение заключается в том, что номера строк должны быть известны заранее.
sed 1,2d
? Проще обычно лучше. Кроме того, ничто в ваших примерах не относится к GNU Sed; все ваши команды используют стандартные функции Sed POSIX .
Хотя tail -n +4
вывод файла, начинающегося с 4-й строки (все, кроме первых 3 строк), является стандартным и переносимым, его head
аналог ( head -n -3
все, кроме последних 3 строк) - нет.
Портативно, вы бы сделали:
sed '$d' | sed '$d' | sed '$d'
Или же:
sed -ne :1 -e '1,3{N;b1' -e '}' -e 'P;N;D'
(имейте в виду, что в некоторых системах, где sed
имеется шаблонное пространство ограниченного размера, оно не масштабируется до больших значений n
).
Или же:
awk 'NR>3 {print l[NR%3]}; {l[NR%3]=$0}'
Надеюсь, я ясно понял вашу потребность.
У вас есть несколько способов выполнить ваш запрос:
tail -n$(expr $(cat /etc/passwd|wc -l) - 2) /etc/passwd
Где / etc / passwd - ваш файл
Второе решение может быть полезным, если у вас большой файл:
my1stline=$(head -n1 /etc/passwd)
my2ndline=$(head -n2 /etc/passwd|grep -v "$my1stline")
cat /etc/passwd |grep -Ev "$my1stline|$my2ndline"
\n
" . Он работает для всех отрицательных целых чисел, кроме тех,-n -0
которые вообще ничего не возвращают , как если-n 0
бы (используя: head (GNU coreutils) 7.4) ... Однако, когда присутствует трейлинг\n
,-n -0
выводит как и следовало ожидать от-
, т.е. он печатает весь файл ... Так что он работает для всех ненулевых отрицательных значений ... но-0
завершается неудачно, когда нет трейлинга\n