【问题标题】:printing previous field in AWK在 AWK 中打印上一个字段
【发布时间】:2011-03-16 02:10:30
【问题描述】:

我认为 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]

【问题讨论】:

  • 其实是以前的记录,不是字段

标签: awk busybox


【解决方案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 优化版)

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

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

Update 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

【讨论】:

  • 您可以通过删除 if 并将匹配项移到单独的大括号之外来简化:awk '/There is not enough space/ {split...} {prev=...}' input
  • @Dennis:谢谢,总是希望让事情变得更整洁。说到整洁,我没有意识到你可以让 RS 成为一个真正的字符串,直到我一时兴起尝试它。很时髦
  • @Dennis:你能想出一种方法来击败 Update 3 以达到代码高尔夫的目的吗?
  • 您可以省略记录分隔符周围的引号:RS=Fa,否则不可以。
【解决方案2】:

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

'{if it matches, print foo; foo=$17}'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2022-01-05
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多