由于尚无法诊断的应用程序错误,我有数百台服务器装有完整的磁盘。有一个文件被重复的行填充了-不是日志文件,而是带有变量定义的用户环境文件(因此,我不能只是删除该文件)。
我编写了一个简单的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
(你可以尝试的busybox版 - AFAIK它不创建一个临时文件)
echo
。使用printf
。并sed
在最后一行添加附加的char,以便避免丢失尾随空格。另外,您的Shell需要能够在单个命令行中处理整个文件。那是您的风险-首先进行测试。bash
尤其糟糕(我认为它要占用堆栈空间吗?),并可能随时让您感到不适。sed
推荐的两个“ si”至少将使用内核的管道缓冲区在它们之间达到良好的效果,但是方法相当相似。您的命令子对象还将截断file
s / w成功的sed操作。
sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}
,如果可行,请阅读其余答案。