Cái gì ngược lại với cái đầu? Tôi muốn tất cả trừ N dòng đầu tiên của một tập tin


142

Cho một tệp văn bản có độ dài không xác định, làm thế nào tôi có thể đọc, ví dụ như tất cả trừ 2 dòng đầu tiên của tệp? Tôi biết tailsẽ cho tôi những dòng N cuối cùng, nhưng tôi không biết N là gì trước thời hạn.

Vì vậy, cho một tập tin

AAAA
BBBB
CCCC
DDDD
EEEE

tôi muốn

CCCC
DDDD
EEEE

Và cho một tập tin

AAAA
BBBB
CCCC

Tôi chỉ nhận được

CCCC

Câu trả lời:


211

tail --help đưa ra như sau:

  -n, --lines=K            output the last K lines, instead of the last 10;
                           or use -n +K to output lines starting with the Kth

Vì vậy, để lọc ra các 2dòng đầu tiên , -n +3nên cung cấp cho bạn đầu ra mà bạn đang tìm kiếm (bắt đầu từ thứ 3).


2
Điều kỳ lạ là trang người đàn ông của tôi không liệt kê tùy chọn này, nhưng nó chỉ hoạt động tốt - cảm ơn!
Nicholas MT Elliott

@Nicholas: Lạ thật, tôi đoán nó sẽ là tài liệu chuẩn bất kể HĐH. Tôi đã lấy nó từ Cygwin trong Windows, vì vậy tôi không biết nó trông như thế nào trong các bản phát hành Linux khác nhau. Vui mừng nó đã làm việc.
Joe Enos

@NicholasMTElliott man7 liệt kê nó giống như trang của Joe Enos, vì vậy đây có thể là một vấn đề về phiên bản trang
Uli Köhler

@SteveJorgensen: Tôi không hiểu bình luận của bạn đề cập đến điều gì; dường như không ai đề nghị sử dụng headcho việc này?
ruakh

22

Giả sử phiên bản đuôi của bạn hỗ trợ nó, bạn có thể chỉ định bắt đầu đuôi sau các dòng X. Trong trường hợp của bạn, bạn sẽ làm 2 + 1.

tail -n +3

[mdemaria@oblivion ~]$ tail -n +3 stack_overflow.txt
CCCC
DDDD
EEEE

12

Một giải pháp đơn giản sử dụng awk:

awk 'NR > 2 { print }' file.name

Một người trong chúng tôi bối rối. Các câu hỏi cho biết: "tất cả trừ 2 dòng đầu tiên của tệp". Làm thế nào mà lệnh đó không đáp ứng yêu cầu?
janm

6
{ print }là hành động mặc định và có thể được bỏ qua.
tripleee

8

Hãy thử sed 1,2d. Thay thế 2 khi cần thiết.


làm việc như mong đợi .. vì số dòng sau 2 dòng đầu tiên không xác định.
kumarprd

6

tail -n +linecount filenamesẽ bắt đầu sản xuất tại dòng linecountcủa filename, vì vậy tail -n +3 filename nên làm những gì bạn muốn.


Điều này sẽ không hoạt động trong vỏ của tôi nhưng tail -n +17 filenamesẽ. Tôi sử dụng bash / ubfox LTS
isomorphismes

2
@iso: Cảm ơn bạn đã sẵn sàng - các phiên bản cũ hơn tailđã chấp nhận cú pháp tôi đã sử dụng trong câu trả lời ban đầu của mình, nhưng bây giờ người ta cần sử dụng -ntùy chọn rõ ràng . Tôi đã cập nhật câu trả lời của mình cho phù hợp.
Jim Lewis

0

Sử dụng cái này, giả sử mẫu đầu tiên được gọi là sample1.dat sau tail --lines=3 sample1.datđó sẽ in tất cả các dòng từ dòng thứ 3 đến dòng cuối cùng.

Đối với mẫu thứ hai, một lần nữa giả sử nó được gọi là sample2.dat, nó tail --lines=-1 sample2.datsẽ in dòng cuối cùng ...


@Jim: có gì khác biệt với bạn và của tôi? .... điều tương tự ....: o Tôi đã đề cập đến hai đầu vào tệp dữ liệu mẫu theo câu hỏi của anh ấy và chỉ ra cách đạt được những gì anh ấy đang tìm kiếm ... .
t0mm13b

Ok ... vậy tại sao anh ta yêu cầu mẫu thứ hai và cho thấy kết quả anh ta muốn, đó là những gì tôi đã sử dụng 'tail --lines = -1' ...... tất nhiên bạn có thể bỏ qua tên tệp hoàn toàn và nó vẫn còn có thể hoạt động như một đường ống ... hmm
t0mm13b

@tommie: Rất tiếc, hãy quên những gì tôi đã nói về đường ống ... Tôi phải nghĩ về một số tiện ích khác. Nhưng quan điểm của tôi là một lệnh duy nhất tail +3 anyfile, đưa ra kết quả mong muốn cho trường hợp chung, trong khi tail --lines=Nyêu cầu phải biết trước N để đưa ra kết quả mong muốn.
Jim Lewis

@tommie: Nhưng đây là tail... không nên "chạm đáy"? (Ba-dum TISH! Cảm ơn bạn, tôi sẽ ở đây cả tuần ...)
Jim Lewis

0

Tôi thực sự không biết làm thế nào chỉ từ đuôi hoặc đầu nhưng với sự trợ giúp của wc -l(đếm dòng) và biểu thức bash, bạn có thể đạt được điều đó.

tail -$(( $( wc -l $FILE | grep -Eo '[0-9]+' ) - 2 )) $FILE

Hi vọng điêu nay co ich.


1
Điều này đòi hỏi phải vượt qua hoàn toàn tập tin trước khi chạy đuôi. Nếu tệp lớn hơn kích thước của bộ nhớ thì điều này sẽ rất không hiệu quả. Nó không xử lý các tập tin ít hơn hai dòng. Nó không xử lý kích thước thay đổi tập tin giữa wc và đuôi.
janm

2
@janm: Bạn không sao cả. Các câu trả lời khác chỉ tốt hơn. Tôi cảm thấy xấu hổ. :-p
NawaMan

-1

sử dụng awk để có được tất cả trừ 2 dòng cuối cùng

awk 'FNR==NR{n=FNR}FNR<=n-3{print}' file file

awk để có được tất cả nhưng 2 dòng đầu tiên

awk 'NR>2' file

HOẶC bạn có thể sử dụng nhiều hơn

more +2 file

hoặc chỉ bash

#!/bin/bash

i=0
while read -r line
do
  [[ $i > 1 ]] && echo "$line"
  ((i++))
done <"file"

Bây giờ điều này không đáp ứng yêu cầu. Câu hỏi cho biết "tất cả trừ 2 dòng đầu tiên của tệp" và đưa ra hai ví dụ, mỗi ví dụ có một tệp duy nhất, trong đó hai dòng đầu tiên được bỏ qua và phần còn lại của tệp được gửi đến thiết bị xuất chuẩn. Đó không phải là những gì lệnh này làm.
janm

vâng tôi đọc sai câu hỏi nghĩ rằng anh ấy yêu cầu tất cả nhưng 2 dòng cuối cùng.
ghostdog74
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.