아직 진단되지 않은 응용 프로그램 버그로 인해 전체 디스크가있는 수백 대의 서버가 있습니다. 로그 파일이 아니라 변수 정의가있는 사용자 환경 파일이 중복 된 줄로 채워진 파일이 하나 있습니다 (따라서 파일을 삭제할 수는 없습니다).
sed
잘못 추가 된 줄을 확인하고 삭제 하는 간단한 명령을 작성 하여 파일의 로컬 사본에서 테스트했습니다. 의도 한대로 작동했습니다.
그러나 전체 디스크가있는 서버에서 시도했을 때 대략 다음과 같은 오류가 발생했습니다 (복사 및 붙여 넣기가 아닌 메모리에서 발생).
sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname
물론 남은 공간이 없다는 것을 알고 있습니다. 내가 물건을 삭제하려고하는 이유입니다! ( sed
내가 사용 하는 명령은 4000 + 줄 파일을 약 90 줄로 줄입니다.)
내 sed
명령은sed -i '/myregex/d' /path/to/file/filename
전체 디스크에도 불구하고이 명령을 적용 할 수있는 방법이 있습니까?
(수백 대의 서버에 빠른 수정으로 적용해야하므로 자동화해야합니다.)
(응용 프로그램 버그를 진단해야하지만 그 동안 서버가 제대로 작동하지 않습니다 ....)
업데이트 : 내가 직면 한 상황은 내가 삭제할 수 있다는 것을 발견하여 해결되었지만 미래와 다른 사람들에게 도움이 될 이 질문에 대한 답변을 여전히 원합니다 .
/tmp
아니고; 동일한 파일 시스템에 있습니다.
디스크 공간을 확보하기 전에 vi
파일을 열고 실행 :g/myregex/d
하여 변경 내용을 저장하여 줄을 삭제할 수 있음을 테스트하고 확인 했습니다 :wq
. 임시 파일을 보유하기 위해 별도의 파일 시스템에 의존하지 않고 이것을 자동화하는 것이 가능해야합니다 .... (?)
sed -i
작동 할 임시 사본을 작성합니다. ed
실제 솔루션을 제공 할만큼 익숙하지는 않지만이 방법이 더 나을 것이라고 생각합니다.
ed
실행할 것 : printf %s\\n g/myregex/d w q | ed -s infile
하지만 명심처럼 일부 구현은 임시 파일을 사용 sed
(당신이 시도 할 수 비지 박스의 에드 - 그것은 임시 파일을 생성하지 않습니다 AFAIK)
echo
. 사용하십시오 printf
. 그리고 수 있도록 sed
당신이 후행 공백 손실을 방지 할 수 있도록 마지막 줄에서 드롭 일부 문자를 추가합니다. 또한 쉘은 단일 명령 행으로 전체 파일을 처리 할 수 있어야합니다. 그게 당신의 위험입니다-먼저 테스트하십시오. bash
특히 스택 공간이 필요하다고 생각합니까? 언제든지 당신을 아프게 할 수 있습니다. 두 가지 sed
권장 사항은 적어도 커널의 파이프 버퍼를 사용하여 그들 사이에 좋은 효과를 주지만 방법은 상당히 유사합니다. file
sed w / in의 성공 여부에 따라 명령 하위 항목도 잘립니다 .
sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}
하고 작동하면 나머지 답변을 읽으십시오. '