Câu trả lời:
Bạn có thể sử dụng điều này để tước hai dòng đầu tiên :
tail -n +3 foo.txt
và điều này để loại bỏ hai dòng cuối cùng :
head -n -2 foo.txt
(giả sử tập tin kết thúc bằng \n
cái sau)
Cũng giống như việc sử dụng tiêu chuẩn tail
và head
các hoạt động này không phá hủy. Sử dụng >out.txt
nếu bạn muốn chuyển hướng đầu ra sang một số tệp mới:
tail -n +3 foo.txt >out.txt
Trong trường hợp out.txt
đã tồn tại, nó sẽ ghi đè lên tệp này. Sử dụng >>out.txt
thay vì >out.txt
nếu bạn muốn có đầu ra được nối vào out.txt
.
head -n -2
không tương thích POSIX .
Nếu bạn muốn tất cả trừ các dòng N-1 đầu tiên, hãy gọi tail
với số lượng dòng +N
. (Số này là số của dòng đầu tiên bạn muốn giữ lại, bắt đầu từ 1, tức là +1 có nghĩa là bắt đầu ở trên cùng, +2 có nghĩa là bỏ qua một dòng và cứ thế).
tail -n +3 foo.txt >>other-document
Không có cách dễ dàng, di động để bỏ qua N dòng cuối cùng. GNU head
cho phép head -n +N
như là một đối tác của tail -n +N
. Mặt khác, nếu bạn có tac
(ví dụ GNU hoặc Busybox), bạn có thể kết hợp nó với đuôi:
tac | tail -n +3 | tac
Có thể sử dụng bộ lọc awk (chưa được kiểm tra):
awk -vskip=2 '{
lines[NR] = $0;
if (NR > skip) print lines[NR-skip];
delete lines[NR-skip];
}'
Nếu bạn muốn xóa một vài dòng cuối cùng khỏi một tệp lớn, bạn có thể xác định phần bù byte của đoạn để cắt bớt sau đó thực hiện cắt ngắn bằng 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))"
Bạn không thể cắt một tệp tại chỗ ngay từ đầu, mặc dù nếu bạn cần xóa một vài dòng đầu tiên của một tệp lớn, bạn có thể di chuyển nội dung xung quanh .
Từ tail
trang man (GNU tail
, nghĩa là):
-n, --lines=K
output the last K lines, instead of the last 10; or use -n +K to
output lines starting with the Kth
Do đó, phần sau đây sẽ nối thêm tất cả trừ 2 dòng đầu tiên somefile.txt
vào anotherfile.txt
:
tail --lines=+3 somefile.txt >> anotherfile.txt
Để loại bỏ n dòng GNU sed đầu tiên có thể được sử dụng. Ví dụ: nếu n = 2
sed -n '1,2!p' input-file
Có !
nghĩa là "loại trừ khoảng thời gian này". Như bạn có thể tưởng tượng, ví dụ phức tạp hơn có thể thu được
sed -n '3,5p;7p'
Điều đó sẽ hiển thị dòng 3,4,5,7. Nhiều sức mạnh hơn đến từ việc sử dụng các biểu thức thông thường thay vì địa chỉ.
Hạn chế là số dòng phải được biết trước.
sed 1,2d
? Đơn giản hơn thường tốt hơn. Ngoài ra, không có gì trong các ví dụ của bạn là dành riêng cho GNU Sed; tất cả các lệnh của bạn đều sử dụng các tính năng POSIX tiêu chuẩn của Sed .
Trong khi tail -n +4
để xuất tệp bắt đầu từ dòng thứ 4 (tất cả trừ 3 dòng đầu tiên) là tiêu chuẩn và di động, thì head
đối tác của nó ( head -n -3
, tất cả trừ 3 dòng cuối cùng) thì không.
Có thể, bạn sẽ làm:
sed '$d' | sed '$d' | sed '$d'
Hoặc là:
sed -ne :1 -e '1,3{N;b1' -e '}' -e 'P;N;D'
(lưu ý rằng trên một số hệ thống sed
có không gian mẫu có kích thước giới hạn, sẽ không mở rộng thành các giá trị lớn n
).
Hoặc là:
awk 'NR>3 {print l[NR%3]}; {l[NR%3]=$0}'
Hy vọng tôi hiểu rõ nhu cầu của bạn.
Bạn đã có một số cách để hoàn thành yêu cầu của bạn:
tail -n$(expr $(cat /etc/passwd|wc -l) - 2) /etc/passwd
Trong đó / etc / passwd là tệp của bạn
Giải pháp thứ 2 có thể hữu ích nếu bạn có tệp lớn:
my1stline=$(head -n1 /etc/passwd)
my2ndline=$(head -n2 /etc/passwd|grep -v "$my1stline")
cat /etc/passwd |grep -Ev "$my1stline|$my2ndline"
\n
" .. Nó hoạt động cho tất cả các số nguyên âm-n -0
mà không trả về gì cả , giống như-n 0
(sử dụng: head (GNU coreutils) 7.4) ... Tuy nhiên, khi\n
xuất hiện dấu vết ,-n -0
sẽ in như có thể được mong đợi từ-
, tức là. nó in toàn bộ tập tin ... Vì vậy, nó hoạt động với tất cả các giá trị âm khác không .. nhưng-0
không thành công khi không có dấu vết\n