tail
파일의 마지막 100줄을 동일한 파일에 쓰고 싶지만 명령이 tail -n 100 file > file
작동하지 않습니다. 원본 파일에서 모든 내용을 읽기 전에 표준 출력이 "라이브" 파일에 기록되기 때문이라고 가정합니다.
출력을 파이프로 연결하는 방법이 있습니까?무엇그런 다음 100줄이 모두 나타날 때까지 저장한 다음 파일로 출력하시겠습니까? 아니면 이런 식으로 파일을 줄이는 또 다른 방법입니까?
답변1
sponge
~에서더 많은 유틸리티좋습니다. 그것은:
표준 입력을 받아 파일에 쓰기
다음과 같이 사용합니다.
tail -n 100 file | sponge file
원하는 효과를 얻으려면.
답변2
물론 SE에서 드디어 이 질문을 던진 순간 답이 나타났다. 내 요구 사항에는 덜 적합할 것 같아서 다음과 같이 작성합니다.
tail -n 100 file | less > file
답변3
존재하다:
tail -n 100 file > file
셸은 프로세스를 분기하고, file
쓰기 위해 열고, 잘라낸 다음(빈 파일로 만들고) tail
해당 프로세스에서 실행합니다. 잘림 없이 열려면 리디렉션 연산자를 file
사용할 수 있습니다 <>
.
tail -n 100 file 1<> file
하지만 문제는 전혀 잘림이 발생하지 않는다는 것입니다. 즉, file
마지막 100줄을 덮어쓰지만 이 100
줄 이후에는 파일의 원래 내용이 그대로 유지됩니다. 따라서 tail
완료되면 잘라내기 위해 다른 명령을 호출 해야 합니다 .
{ tail -n 100 file; perl -e 'truncate STDOUT, tell STDOUT'; } 1<> file
답변4
다음을 수행할 수 있습니다.
printf '%s\n' "$(tail -n 100 file)" > file