【问题标题】:How to print the output by using awk or sed如何使用 awk 或 sed 打印输出
【发布时间】:2020-05-26 22:58:39
【问题描述】:

我在一个文件中有以下文本。从这里如果搜索“Fileset”,需要得到输出直到第二个“N”。我曾尝试使用 awk 和 sed,但无法按预期获得输出。

Job: name=jobname JobType=66 level= Priority=10 Enabled=1
     MaxJobs=1 Resched=0 Times=0 Interval=1,800 Spool=0 WritePartAfterJob=1
     Accurate=0
  --> Client: Name=clientname Enabled=1 Address=XXXXXX FDport=9102 MaxJobs=1
      JobRetention=14 days  FileRetention=14 days  AutoPrune=1
  --> Catalog: name=MyCatalog address=*None* DBport=0 db_name=bacula
      db_driver=*None* db_user=bacula MutliDBConn=0
  -->Fileset: name=test_host
     O MZof
     N
     I /u01
     N

从上面,只需要得到下面的输出。

Fileset: name=test_host
         O MZof
         N
         I /u01
         N

尝试以下命令

awk '/Fileset:/ {flag=1;next} /N/{flag=0} flag {print}' file

Fileset 是模式 /N/ 是结束标志

【问题讨论】:

  • 从示例输入看起来您也可以只打印来自Fileset: 行的所有内容?如果没有,最好在最后添加一些行
  • 为什么不只是grep -A4 Fileset?

标签: awk sed


【解决方案1】:

如果您希望第二个N 停止处理,请在找到Fileset: 时以2 开始标志,在flag!=0 时打印行,然后使用N 减少每一行的标志。

awk '/Fileset:/{flag=2};flag;/N/&&flag{flag--}' file

【讨论】:

  • 干净整洁。不过,我会问,它是否不应该是 /^N$/ 而不仅仅是 /N/
  • @mathguy 谢谢。 /^N$/ 不是一个选项,因为有前导空格,但 /^ *N *$/ 是一个更具选择性的正则表达式,可能更好,具体取决于 OP 意图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2013-12-11
  • 2018-05-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多