꼬리 반대쪽 : 마지막 n 줄을 제외한 모든 줄 것을 파이프하는

유닉스 커맨드 라인 필터로 파일의 마지막 n 줄을 어떻게 버릴 수 있습니까?

그것은 일종의 반대입니다 tail: tail첫 번째 n 줄을 버리고 나머지는 파이프하지만 마지막 n 줄 을 제외한 모든 것을 파이프하는 명령을 원합니다 .

불행히도 나는 그런 것을 찾지 못했습니다 head.도 도움 이되지 않습니다 . 편집 : 적어도 Solaris에서는 부정적인 인수를 취하지 않습니다.

업데이트 : 나는 큰 파일, 즉 로그 파일과 같은 마지막 파일에서 발생한 일을 검사하려는 솔루션에 주로 관심이 있습니다.



답변

GNU가 있다면 head사용할 수 있습니다

head -n -5 file.txt

의 마지막 5 행을 제외한 모든 행을 인쇄합니다 file.txt.

경우 head -n부정적인 인수를 취하지 않는 시도

head -n $(( $(wc -l file.txt | awk '{print $1}') - 5 )) file.txt


답변

head file.txt               # first 10 lines
tail file.txt               # last 10 lines
head -n 20 file.txt         # first 20 lines
tail -n 20 file.txt         # last 20 lines
head -20 file.txt           # first 20 lines
tail -20 file.txt           # last 20 lines
head -n -5 file.txt         # all lines except the 5 last
tail -n +5 file.txt         # all lines except the 4 first, starts at line 5


답변

다음은 BSD 등에서 작동하는 마지막 줄을 삭제하는 간단한 방법입니다.

sed '$d' input.txt

표현식은 “마지막 줄에서 삭제합니다”라고 읽습니다. 다른 행은 sed기본 동작 이므로 인쇄됩니다 .

여러 줄을 제거하기 위해 함께 묶을 수 있습니다.

sed '$d' input.txt | sed '$d' | sed '$d'

어느 쪽이 든든하지만, 파일을 통해 한 번만 스캔합니다.

자세한 답변은 https://stackoverflow.com/questions/13380607/how-to-use-sed-to-remove-last-n-lines-of-a-file을 참조하십시오.

여기 내가 좋아하는 것 중 하나에서 적응 한 라이너가 있습니다.

N=10
sed -n -e ':a' -e "1,$N!{P;N;D;};N;ba"

나는 그 것을 해독하는 것이 재미 있었고, 당신도 그렇게하기를 바랍니다 N.


답변

왜 당신 head이 옵션이 아니라고 생각하는지 궁금합니다 .

~$ man head
...
-n, --lines=[-]K
        print the first K lines instead of the first 10;
        with the leading `-', print all but the last K lines of each file

예를 들어 다음을 사용하여 목적에 맞는 것 같습니다.

head -n -20 yourfile.txt


답변

tail -n부정적인 주장을 취하지 않을 경우 다른 방법 은

tac file.txt | tail -n +6 | tac

이것은 마지막 5 줄을 제거합니다


답변