【问题标题】:print a matched line and the following line打印匹配的行和以下行
【发布时间】:2015-11-17 23:31:00
【问题描述】:

我有一个文件,其内容类似于

//DCOM/PC/dev/R2.0.0_OZ99163/site-config/profile.cfg
... #2 change 1101417 delete on 2015/06/15 by SMukherj
... #1 change 1099558 branch on 2015/06/08 by BaDas@PC_win_R1.1 (xtext) 'OZ 97960: Startup modifications'
... ... branch from //DCOM/PC/dev/R2.0.0_OZ99163/site-config/profile.cfg#1,#2

步骤:

  1. 搜索模式//
  2. 打印匹配的行和它下面的行(我只想要紧随其后的下一行)。
  3. 现在我想打印文件名,例如profile.cfg, revision - #2 , name SMukherj

这是我尝试过的,但我无法继续:

grep -i '\/\/' -A1 test.txt | grep -v '\.\.\. \.\.\.' | awk -F'@' '{print $1}'

【问题讨论】:

  • 我们很清楚,您能否提供与您的示例输入相匹配的预期输出?

标签: unix awk


【解决方案1】:

这只是使用awk

awk -F '[/ ]'  '/^\/\// { file = $NF; getline; print file, $2, $NF; }'

用斜线或空格分割字段。如果该行以//开头,则将最后一个字段保存为file;阅读下一行;打印文件、第二个字段(版本号)和最后一个字段(用户名)。

在您输入数据的三个副本上,它会生成:

profile.cfg #2 SMukherj
profile.cfg #2 SMukherj
profile.cfg #2 SMukherj

【讨论】:

  • 当。它不会比这更短。哦!您可以使用单字符变量!砰! ;-)
  • @ghoti:我也用了很多空格 :)
  • 对正则表达式使用^// 可能是对原始表达式的改进,但基于这样的假设,即所有匹配这个正则表达式的行(而不是其他行)都是有趣的。只有一个示例记录,很难知道您是否可以做出这些概括。
  • @tripleee:三个重复的唯一意义是它表明//之后的额外行和以下行被适当地忽略了。没有更多数据,就不可能做得更好——正如你所说,没有足够的信息。即使多出一张唱片也会给我更大的信心。我也不确定我是否信任 ... 部分,但问题中的信息就是所有内容。
【解决方案2】:

对于这样的事情,使用sedawk 更容易。 JonathanLeffler 向您展示了如何使用 awk 进行操作,这是使用 sed 的类似解决方案:

sed -n '/^\/\// { s:.*/::; N; s/\n.* / /p; }' test.txt

输出:

profile.cfg SMukherj

说明

这是上面的注释版本。

parse.sed

/^\/\// {            # Run code-block on lines starting with double-slash (//)
  s:.*/::            # Remove everything up-to the last slash (/)
  N                  # Add next line to pattern-space
  s/\n.* / /p        # Substitute everything from the first new-line to
                     # the last space with a space and print pattern-space
}

像这样运行它:

sed -nf parse.sed test.txt

【讨论】:

  • 如果地址正则表达式有点吓人,您可以使用_(或其他字符)作为其分隔符:\_//_\
最近更新 更多