sed 출력을 동일한 입력 파일로 리디렉션하면 시스템이 응답하지 않는 이유는 무엇입니까? ‘s/original/edited/g’ file.log >> file.log 그 후에

내가하려고했던 sed큰 파일 (1백메가바이트)에서 몇 가지 키워드를 대체 할 수 있습니다. -i(inplace) 옵션 을 알지 못했기 때문에 첫 번째 시도는 다음과 같이 리디렉션하는 것입니다.

sed 's/original/edited/g' file.log >> file.log

그 후에 일어난 일은 내 PC가 멈추고 키보드 입력이 거의 없다는 것입니다. 다른 콘솔 Ctrl+ Alt+를 시도했지만 F1사용자 이름을 천천히 입력 한 후에도 중지되었습니다. 키보드가 없으면 기계를 하드웨어로 재설정하는 것이 유일한 방법이었습니다. 로그인 한 후 file.log가 약 8GB라는 것을 알았습니다.

그 명령을 실행했을 때 시스템이 응답하지 않는 이유와 시스템 수준에서 경고를 트리거하고 문제를 일으키는 프로세스를 종료시키는 메커니즘이 존재하는지 이해하고 싶습니다.



답변

이미 언급했듯이 >>파일에 추가되므로 sed명령은 출력 된 줄을 읽은 다음 더 출력합니다. 파일을 그 자리에서 바꾸려면 >여전히 작동하지 않지만 sed-i옵션을 알고 있습니다.

그러나 스트림으로 읽고있는 파일에 추가하고이 패스를 한 번만 수행 sponge하려면 moreutils패키지 에서 사용하는 것이 좋습니다 .

sed 's/original/edited/g' file.log | sponge >> file.log

spongeEOF까지 stdin에서 메모리로 읽은 다음 모든 내용을 stdout에 덤프하므로 sed파일 끝을 누르고 읽은 것을 멈추고 닫은 다음 스폰지가 추가를 시작합니다.


답변

귀하의 sed명령은에 추가 된 파일을 읽으려고했다. 파일 끝에 도달하지는 않지만 많은 CPU 시간을 소비합니다. 이것이 ^ C (인터럽트 전류 프로세스)가 발명 된 이유입니다.


답변

당신이 읽은 파일에 다시 추가하는 것은 결코 증가하는 파일로 끝날 것이기 때문에 결코 좋은 생각이 아닙니다. 실제로 파일에 다시 쓰려면 -i플래그를 사용해야합니다 .

sed -i 's/original/edited/g' file.log

또는 변경을 수행하기 전에 백업을 작성하려는 경우 파일 접미 부를 -i플래그에 추가 할 수 있습니다 .

sed -i.bak 's/original/edited/g' file.log

이것은 호출 된 파일을 생성 한 file.log.bak다음 변경을 수행합니다. 여러분이 읽는 파일에 추가하려고하면 프로그래머 슬랭에서 데이터 레이스를 호출합니다. 여기서 동일한 데이터 소스에 대해 다른 프로세스가 입력 또는 출력됩니다. . 이것이 또한 기계가 정지 한 이유입니다.


답변