명령줄 "버퍼"

명령줄 "버퍼"

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

관련 정보