Відповіді:
Ви можете використовувати це, щоб зняти перші два рядки:
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), ви можете комбінувати його з хвостом:
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
довідкової сторінки (GNU tail
, тобто):
-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 рядків можна використовувати sed GNU. Наприклад, якщо n = 2
sed -n '1,2!p' input-file
!
Середній «виключити цей інтервал». Як ви можете собі уявити, можна отримати більш складний результат, наприклад
sed -n '3,5p;7p'
що покаже рядок 3,4,5,7. Більшу силу отримує використання регулярних виразів замість адрес.
Обмеження полягає в тому, що номери рядків повинні бути відомі заздалегідь.
sed 1,2d
? Простіше, як правило, краще. Крім того, ніщо у ваших прикладах не є специфічним для GNU Sed; всі ваші команди використовують стандартні функції POSIX Sed .
Хоча 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 - ваш файл
2-е рішення може бути корисним, якщо у вас є величезний файл:
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