머리의 반대는 무엇입니까? 파일의 첫 N 줄을 제외한 모든 것을 원합니다.


142

알 수없는 길이의 텍스트 파일, 어떻게 모든 예를 들어, 읽을 수 감안할 하지만 파일의 첫 두 줄? 나는 tail마지막 N 줄을 줄 것이라는 것을 알고 있지만, N이 무엇인지 미리 모른다.

그래서 파일

AAAA
BBBB
CCCC
DDDD
EEEE

내가 원하는

CCCC
DDDD
EEEE

그리고 파일

AAAA
BBBB
CCCC

난 그냥 얻을

CCCC

답변:


211

tail --help 다음을 제공합니다.

  -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줄 을 걸러 내려면 -n +3찾고있는 출력을 제공해야합니다 (3 번째부터 시작).


2
이상하게도 내 맨 페이지에는 옵션이 나열되어 있지 않지만 제대로 작동합니다. 감사합니다!
니콜라스 MT 엘리엇

@Nicholas : 이상하게도 OS에 관계없이 표준 문서라고 생각했습니다. Windows의 Cygwin에서 가져 왔으므로 다양한 Linux 배포판에서 어떤 모양인지 알 수 없습니다. 다행이다.
Joe Enos

@NicholasMTElliott의 man7의 조 이노스 '맨 같은 목록은, 그래서 그것은 맨 버전 문제가 될 가능성이 높습니다
울리 쾰러

@SteveJorgensen : 귀하의 의견이 무엇을 말하는지 이해하지 못합니다. 아무도 이것에 사용할 것을 제안하지 않는 것 같 head습니까?
ruakh September

22

tail 버전이 지원한다고 가정하면 X 줄 다음에 tail 시작을 지정할 수 있습니다. 귀하의 경우 2 + 1을 수행합니다.

tail -n +3

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

12

awk를 사용하는 간단한 솔루션 :

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

우리 중 하나는 혼란스러워합니다. 질문은 "파일의 처음 두 줄을 제외하고"라고 말합니다. 해당 명령이 요구 사항을 어떻게 충족시키지 않습니까?
janm

6
{ print }기본 조치이며 생략 할 수 있습니다.
tripleee

8

시도하십시오 sed 1,2d. 필요에 따라 2를 교체하십시오.


처음 두 줄 이후 줄 수를 알 수 없으므로 예상대로 작동했습니다.
kumarprd

6

tail -n +linecount filename라인에서 출력이 시작됩니다 linecount의를 filename, 그래서 tail -n +3 filename 당신이 원하는해야한다.


이것은 내 껍질에서는 작동하지 않지만 tail -n +17 filename것입니다. 나는 bash / ubuntu LTS를 사용한다
동 형사상

2
@iso : 고마워요-구버전은 tail원래 답변에 사용한 구문 을 받아 들였지만 이제는 명시 적 -n옵션 을 사용해야합니다 . 이에 따라 답변을 업데이트했습니다.
Jim Lewis

0

첫 번째 샘플이 sample1.dat라고 가정하면 tail --lines=3 sample1.dat세 번째 줄에서 마지막 줄까지 모든 줄이 인쇄됩니다.

두 번째 샘플의 경우 다시 sample2.dat라고 가정 tail --lines=-1 sample2.dat하고 마지막 줄을 인쇄합니다.


@ Jim : 당신과 나의 차이점은 무엇입니까? .... 같은 것 .... : o 나는 그의 질문에 따라 두 개의 샘플 데이터 파일 입력을 언급하고 그가 찾고있는 것을 달성하는 방법을 보여주었습니다 ... .
t0mm13b

좋아 ... 그럼 왜 두 번째 샘플을 요청하고 내가 원하는 결과를 보여 주 었는지 'tail --lines = -1'...... 물론 파일 이름을 완전히 생략 할 수 있습니다. 파이프 역할을 할 수 있습니다 ... hmm
t0mm13b

@tommie : 죄송합니다. 파이프에 대해 말한 것을 잊어 버려요 ... 다른 유틸리티를 생각하고 있었을 것입니다. 그러나 내 요점은 단일 명령` tail +3 anyfile`이 일반적인 경우에 원하는 결과를 제공하지만 원하는 결과를 제공 tail --lines=N하려면 N을 미리 알아야한다는 것입니다.
Jim Lewis

@tommie : 그러나 이것은 tail... "아래쪽"이 아니어야합니까? (Ba-dum TISH! 감사합니다, 저는 1 주일 내내 여기에있을 것입니다 ...)
Jim Lewis

0

나는 꼬리 또는 머리만으로 그것을하는 법을 정말로 모른다. 그러나 wc -l(라인 수)와 bash 표현을 사용하면 그것을 달성 할 수있다.

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

도움이 되었기를 바랍니다.


1
이를 위해서는 tail을 실행하기 전에 파일을 완전히 통과해야합니다. 파일이 메모리 크기보다 크면 매우 비효율적입니다. 두 줄 미만의 파일은 처리하지 않습니다. wc와 tail 사이의 파일 변경 크기는 처리하지 않습니다.
janm

2
@janm : 괜찮습니다. 다른 답변이 더 좋습니다. 부끄러운 느낌이 듭니다. :-p
NawaMan

-1

awk를 사용하여 마지막 두 줄을 제외하고 모두 가져 오기

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

처음 두 줄을 제외한 모든 것을 얻는 awk

awk 'NR>2' file

또는 더 많이 사용할 수 있습니다

more +2 file

아니면 그냥 강타

#!/bin/bash

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

이제 이것은 요구 사항을 충족하지 않습니다. 이 질문은 "파일의 처음 두 줄을 제외한 나머지"라고 말하고 각각 하나의 파일을 가진 두 개의 예제를 제공합니다. 여기서 첫 두 줄은 건너 뛰고 파일의 나머지 부분은 stdout으로 전송됩니다. 그것은이 명령이하는 것이 아닙니다.
janm

예, 질문을 잘못 읽었습니다. 그가 마지막 2 줄을 제외한 모든 것을 요구한다고 생각했다.
ghostdog74
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.