使用grep(Bash)

时间:2015-07-29 20:03:19

标签: regex string bash awk grep

我花了一些时间试图找到这个问题的答案,但没有运气......

我正在编写一个脚本,它将一个字符串作为输入,然后在cvs日志中搜索匹配项。输出应该是匹配字符串之前的文件名。我可以写一个正则表达式来匹配文件名而没有任何麻烦,但是我不确定如何在匹配后回顾最后一次出现的正则表达式...

cvs日志中显然有很多文件要解析,文件名和输入字符串之间的行数是未知的,所以不能做'grep -B4'等等...

以下示例(删除了无关位的cvs日志) - 需要匹配一个字符串(将作为脚本的输入(例如120233))并检索与其关联的文件名,这里将是(Aliases.xml) 。正如我所说,有很多文件,所以虽然正则表达式将匹配许多文件名,但我只对匹配字符串之前的那个感兴趣。

这是我第一次在这里发帖,我是编程新手,所以我希望这是有道理的。

----------


RCS file: /user1/cvs/Aliases.xml

revision 1.18
date: 2015/03/13 16:21:07; 

FIX - 217427 - fixed error....

revision 1.17
date: 2013/03/27 08:03:36; 

IMPROVEMENT - 120233 - some improvement

1 个答案:

答案 0 :(得分:2)

您可以使用awk命令:

cvs log | awk -F '[:, ]+' -v s='120233' '/RCS file:/{f=$3} f && $0 ~ s{print f; f=""}'

<强>解释

-F '[:, ]+'    # make one or more of colon, comma or <space> a field saprator
-v s='120233'  # pass search string to awk in variable s
/RCS file:/    # search for string "RCS file:"
{f=$3}         # store filename in variable f
f && $0 ~ s    # if f is NOT_EMPTY and line matches variable s
print f; f=""  # print filename from variable f and set f to EMPTY