【问题标题】:Print next N lines containing ":" after matched word - using oneliner在匹配的单词之后打印包含“:”的下 N 行 - 使用 oneliner
【发布时间】:2015-01-18 17:20:19
【问题描述】:

我正在尝试从 symantec 的“lltstat”的输出中提取所需的行

以前,我使用的是这段代码(HOST_VAR 被循环中需要的主机替换,如 serverA):

lltstat -nvv active | awk '/$HOST_VAR/{x=NR+2;next}(NR<=x){print}'

但现在情况发生了变化,行数是可变的(可以是0,也可以是10..)

输出如下所示:

LLT node information:
Node                 State    Link  Status  Address
* 0 serverA           OPEN
                              eth0   UP      AA:BB:DD:CC:00:11
                              eth1   UP      AA:BB:DD:CC:00:11
                              igbe3   UP      AA:BB:DD:CC:00:11
 1 Bserver           OPEN
                              igbe2   UP      AA:BB:DD:CC:00:11
                              ixgbe1   DOWN      AA:BB:DD:CC:00:11
                              eth3   UP      AA:BB:DD:CC:00:11

我可以使用的工具只有 sed 和 awk(grep 只是没有正则表达式等的最简单的工具) 我正在考虑使用服务器名称;下一个;并打印所有带有“:”的行,因为它应该只在那些 MAC 地址中,但我在 awk 中不是那么好:( 感谢您提供任何有用的提示

【问题讨论】:

  • 原始示例不可能像所写的那样工作,因为$HOST_VAR 不会在单引号中展开。
  • 事实上,它在另一个脚本中替换了 HOST_VAR,所以在 ksh 中它被调用为正确的值,例如 /serverA/{x ...

标签: unix awk sed solaris


【解决方案1】:

假设 OPEN 仅出现在服务器行上,这应该可以工作。

lltstat -nvv active | awk -v HOST_VAR=$HOST_VAR '$0 ~ HOST_VAR{a=1; next} a&&/OPEN/{exit} a{print}'

【讨论】:

  • hm,两件事:1.最后一个服务器呢,当它之后没有OPEN时? 2. 它向我抛出错误 :( awk:第 1 行附近的语法错误;awk:在第 1 行附近退出
  • @morvy 如果这是最后一个服务器,那么 awk 就会退出,这很好。这是什么awk?你能缩小它抱怨的范围吗?您可以尝试将模式包装在括号中。 ($0 ~ HOST_VAR)($0 ~ "OPEN") 看看是否有帮助。您也可以尝试使用 match 函数而不是 ~ 但我不知道它可能会抱怨什么。
  • 好的,所以 /usr/xpg4/bin/awk 完成了它的工作,但仅适用于 serverA :( serverB 不返回任何数据,serverC 相同
  • 输出总是和例子一样,节点的数量和接口的数量是可变的。在调用命令之前,我只知道节点名称。所以现在我有 4 个节点(目前在有 4 个节点的集群上测试),所以我有 serverA、Bserver、srvrC、testD(名称不同,因为它们是随机生成的)
  • 任何时候你收到错误消息awk: syntax error near line 1; awk: bailing out near line 1 这意味着你正在运行旧的、损坏的 awk(Solaris 上的 /bin/awk),任何人都不应该将它用于任何事情。请改用 gawk 或 /usr/xpg4/bin/awk 或 nawk。
猜你喜欢
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
相关资源
最近更新 更多