Answers:
请尝试以下使用-P
(Perl-regexp)参数的grep命令。
grep -P '(?<!\S)/aa/bbbb/cccccc(?!\S)' file
(?<!\S)
这种否定的后向断言,在字符串之前的字符/aa/bbbb/cccccc
将是任何字符,但不能是非空格字符。
(?!\S)
负向超前断言,匹配后的字符将是任何字符,但不能是非空格字符。
另一个grep,
grep -E '(^|\s)/aa/bbbb/cccccc(\s|$)' file
通过python,
script.py
#!/usr/bin/python3
import re
import sys
file = sys.argv[1]
with open(file, 'r') as f:
for line in f:
for i in line.split():
if i == "/aa/bbbb/cccccc":
print(line, end='')
将上述代码保存在文件中,并将其命名为script.py
。然后执行以下脚本
python3 script.py /path/to/the/file/you/want/to/work/with
grep '/aa/bbbb/cccccc ' file
/aa/bbbb/cccccc
字符串的行。
grep -E '/aa/bbbb/cccccc(\s+|$)' file
grep -E '(^|\s)/aa/bbbb/cccccc(\s|$)' file
最简单的方法是在模式后添加一个空格:
$ grep '/aa/bbbb/cccccc ' file
2014-05-05 09:11:53 /aa/bbbb/cccccc 29899
或者,为了匹配各种空白:
$ grep '/aa/bbbb/cccccc[[:space:]]' file
2014-05-05 09:11:53 /aa/bbbb/cccccc 29899
要么
$ grep -P '/aa/bbbb/cccccc\s+' file
2014-05-05 09:11:53 /aa/bbbb/cccccc 29899
或者,以积极的前瞻性:
$ grep -P '/aa/bbbb/cccccc(?=\s)' file
2014-05-05 09:11:53 /aa/bbbb/cccccc 29899
或者,以负前瞻:
$ grep -P '/aa/bbbb/cccccc(?!\S)' file
2014-05-05 09:11:53 /aa/bbbb/cccccc 29899
或者您可以撤消比赛:
$ grep -v 'c?' file
2014-05-05 09:11:53 /aa/bbbb/cccccc 29899
或者,也要匹配仅包含您的模式(不包含尾随空格)的行:
grep -P '/aa/bbbb/cccccc(\s+|$)' file
grep -E '/aa/bbbb/cccccc(\s+|$)' file
或者,您可以只使用一个小脚本:
在awk中:
$ awk '$3=="/aa/bbbb/cccccc"' file
2014-05-05 09:11:53 /aa/bbbb/cccccc 29899
或者,如果您不知道您的模式在哪个字段中
$ awk '{for(i=1;i<=NF;i++){if($i=="/aa/bbbb/cccccc"){print}}}' file
2014-05-05 09:11:53 /aa/bbbb/cccccc 29899
在Perl中
$ perl -ane 'print if grep {$_ eq "/aa/bbbb/cccccc"} @F' file
2014-05-05 09:11:53 /aa/bbbb/cccccc 29899
grep -v 'c?' file
为什么不使用grep -v '?' file
文件,因为文件只有两行。
grep -v '?'
就足够了。
为了补充@AvinashRaj的答案,您还可以使用类似这样的命令。
grep -P '/a+/b+/c+(?!\S)' file