由于尚未诊断的应用程序错误,我有数百个磁盘已满的服务器。有一个文件被重复的行填满——不是日志文件,而是一个带有变量定义的用户环境文件(所以我不能直接删除该文件)。
我编写了一个简单的sed命令来检查错误添加的行并删除它们,并在文件的本地副本上对其进行了测试。它按预期工作。
但是,当我在带有完整磁盘的服务器上尝试它时,我得到了大约以下错误(它来自内存,而不是复制和粘贴):
sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname
Run Code Online (Sandbox Code Playgroud)
当然,我知道没有剩余空间了。这就是为什么我试图删除东西!(sed我使用的命令会将 4000 多行的文件减少到大约 90 行。)
我的sed命令只是sed -i '/myregex/d' /path/to/file/filename
尽管磁盘已满,有没有办法可以应用此命令?
(它必须是自动化的,因为我需要将它应用到数百台服务器上作为快速修复。)
(显然需要诊断应用程序错误,但同时服务器无法正常工作......)
更新:通过删除我发现可以删除的其他内容来解决我面临的情况,但我仍然希望得到这个问题的答案,这对未来和其他人都有帮助。
/tmp是不行的;它在同一个文件系统上。
在释放磁盘空间之前,我进行了测试,发现可以vi通过打开文件并运行来删除其中的行:g/myregex/d,然后使用:wq. 似乎应该可以自动执行此操作,而无需求助于单独的文件系统来保存临时文件......(?)
使用正则表达式字符串,如何删除包含匹配项的第一行之前的所有行?例如,我该如何改变这一点:
lost
load
linux
loan
linux
Run Code Online (Sandbox Code Playgroud)
进入这个:
linux
loan
linux
Run Code Online (Sandbox Code Playgroud)
我试过:
echo "lost
load
linux
loan
linux" | sed -e 's/.*^li.*$//g'
Run Code Online (Sandbox Code Playgroud)
但它返回这个,没有改变任何东西:
lost
load
linux
loan
linux
Run Code Online (Sandbox Code Playgroud)
我想让它工作,以便在没有匹配时它不会输出任何内容。
根据man perlrun:
-0[octal/hexadecimal]
specifies the input record separator ($/) as an octal or
hexadecimal number. If there are no digits, the null character is
the separator.
Run Code Online (Sandbox Code Playgroud)
和
The special value 00 will cause Perl to slurp files in paragraph
mode. Any value 0400 or above will cause Perl to slurp files
whole, but by convention the value 0777 is the one normally used
for this purpose.
Run Code Online (Sandbox Code Playgroud)
但是,鉴于此输入文件:
This is paragraph one
This is paragraph two.
Run Code Online (Sandbox Code Playgroud)
我得到了一些意想不到的结果:
$ perl …Run Code Online (Sandbox Code Playgroud)