1

我认为 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 输入文件]

4

2 回答 2

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

更新 2(优步优化版)

从技术上讲,以下将是uber优化版本,但它在记录分隔符上留下太多错误命中的机会,尽管它适用于您的示例输入。

awk 'NR<2{print $NF}' RS="Fa" input-awk.txt`

更新3(终极大杀优化版)

我不会在生产代码中使用它,但它只是向您展示总有一种方法可以使它更简单。如果有人可以出于代码高尔夫的目的击败它,我当然希望看到它!

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
于 2011-03-16T02:21:39.473 回答
0

所以你不能使用类似的东西

'{if it matches, print foo; foo=$17}'
于 2011-03-16T02:14:23.493 回答