我对bash / sed没什么问题。我需要能够在sed表达式中使用命令替换。我有两个大文本文件:
首先是logfile.txt, 有时*以 错误ID:0xdeadbeef的格式按ID显示错误消息(常见示例为0xdeadbeef)。
第二个error.txt具有成对存储的错误消息LONG_ERROR_DESCRIPTION,0xdeadbeef
我试图用sed和bash命令替换来完成任务:
cat logfile.txt | sed "s/ERRORID:\(0x[0-9a-f]*\)/ERROR:$(cat errors.txt | grep \1 | grep -o '^[A-Z_]*' )/g"
(^^^当然应该在一行中)
如果可以,那么我可以获得更好的错误信息的更好版本的日志文件。
Lot's of meaningless stuff ERRORID:0xdeadbeef and something else => => Lot's of meaningless stuff ERROR:LONG_ERROR_DESCRIPTION and something else
但事实并非如此。问题是sed无法将regex节(\ 1)“注入”到命令替换中。我还有其他选择吗?我知道可以先构建sed表达式或以其他方式构建它,但是我想避免多次解析这些文件(它们可能很大)。
一如既往的感谢您的帮助。
*日志文件中没有实际格式。没有不一致地使用节,列,制表符/逗号分隔
PS。只是为了解释。以下表达式有效,但是当然其中不传递任何参数:
echo "my cute cat" | sed "s/cat/$(echo dog)/g"
您可以从错误消息目录中创建sed脚本,然后将该sed脚本应用于日志文件。
基本上,遵循以下原则:
sed 's/\(.*\), 0x\([0-9A-F]*\)$/s%ERRORID:0x\2%ERROR:\1%g/' errors.txt | sed -f - logfile.txt
第一个sed脚本的输出应如下所示:
s%ERRORID:0x00000001%ERROR:Out of memory% s%ERRORID:0x00000002%ERROR:Stack overflow% s%ERRORID:0x00000031%ERROR:values of beta may cause dom%
也就是说,一个新的sed脚本指定了目录中每个错误代码的替换。
sed的方言不同,因此可能需要稍作调整。我相信Linux上的sed应该在将正则表达式中的括号分组之前使用反斜杠,并乐于接受标准输入作为该-f选项的参数。但是,这不能移植到其他Unices(但如果需要可移植性,可以用Perl代替sed)。
-f
编辑: 如果错误消息是相当静态的,和/或您想从标准输入中读取日志,则将生成的脚本保存在文件中;
sed ‘s/(.), 0x([0-9A-F])$/s%ERRORID:0x\2%ERROR:\1%g/’ errors.txt >errors.sed
sed -f errors.sed logfile.txt
你也可以添加#!/usr/bin/sed -f在顶部errors.sed和chmod +x它,使之成为一个独立的命令脚本。
#!/usr/bin/sed -f
errors.sed
chmod +x