打印匹配的行和以下行

时间:2015-11-16 05:23:07

标签: unix awk

我有一个包含

等内容的文件
//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
  4. 这是我尝试的但是我无法继续下去:

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

2 个答案:

答案 0 :(得分:4)

这只使用awk

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

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

在输入数据的三个副本上,它产生:

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

答案 1 :(得分:1)

对于类似的内容,使用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