유닉스 커맨드 라인 필터로 파일의 마지막 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'
어느 쪽이 든든하지만, 파일을 통해 한 번만 스캔합니다.
여기 내가 좋아하는 것 중 하나에서 적응 한 라이너가 있습니다.
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 줄을 제거합니다