我认为awk将是解决我的问题的方法。我的工具是有限的b / c我在ESXi 4.0u1上使用busybox。我有来自VM备份程序(ghettoVCB)的日志文件。我需要扫描此文件以获取表达式
“无法克隆磁盘:文件系统上没有足够的空间用于所选操作”
在我的文件中,这是在'43'线附近。上一个字段(在AWK词汇表中)表示我想要print
到输出文本文件的VM名称。在我的示例中,VM名称为TEST12-RH4-AtlassianTest
。
awk 'RS=""
/There is not enough space/ {
print $17
} '
print $17
是硬编码的,我不想要这个。我想找到比上面的正则表达式返回的行上的第一个字段少一个的字段。任何建议表示赞赏。
[Awk Input File]
答案 0 :(得分:1)
awk 'NR==1{print $NF}' RS="Failed to clone" input-awk.txt
$ awk 'NR==1{print $NF}' RS="Failed to clone" input-awk.txt
TEST12-RH4-AtlassianTest
从技术上讲,以下是 uber 优化版本,但它在记录分隔符上留下了太多错误命中的机会,尽管它适用于您的示例输入。
awk 'NR<2{print $NF}' RS="Fa" input-awk.txt`
我不会在生产代码中使用它,但它只是向您展示总有一种方法可以使它更简单。如果有人可以为代码高尔夫目的而打败这个,我当然希望看到它!
awk '!a++,$0=$NF' RS="Fa" input-awk.txt
假设您的VM名称始终是您要打印的记录中的最后一个字段,则可以使用:
awk '/not enough space/{split(pre,a);print a[pNF]}{pre=$0;pNF=NF}' input-awk.txt
答案 1 :(得分:0)
所以你不能使用像
这样的东西'{if it matches, print foo; foo=$17}'