grep -E {,1}显示超过1次出现的结果

时间:2018-02-02 06:17:02

标签: regex linux bash grep

我一直试图找出如何让grep成为一个只出现N个字符的行。

[root@example DIR]# grep -E "6{,1}" test.txt
6543
6625
6668
6868
6666
1161

我想要的是grep打印出以下内容:

[root@example DIR]# grep -E "6{,1}" test.txt
6543
1161

我错过了什么?提前谢谢!

更新

要求救援!感谢大家分享您的知识! :)

4 个答案:

答案 0 :(得分:3)

使用awk我' d:

$ awk '/6/&&!/6.*6/' file
6543
1161

它转换为grep,如:

$ grep 6 file | grep -v 6.*6
6543
1161

修改

@Sundeep聪明的想法是使用6作为字段分隔符并计算字段(请参阅注释):

$ awk -F6 'NF==2' file
6543
1161

^他的评论如下。

答案 1 :(得分:2)

您需要左右边界,否则可以忽略以下匹配。

grep -E "^[^6]*6[^6]*$" *

这意味着:

  • ^行首
  • [^ 6] *非六,你喜欢
  • 6一六
  • 其次是非六,任意数量
  • $ end of line。

    grep -E" 6 {,1}" *

表示在模式中的某个位置只有0到1的6。

答案 2 :(得分:2)

“我缺少的是什么”部分是:正则表达式将在找到匹配后忽略尾随上下文,除非您告诉他们不要。因此6666{,1}匹配,因为第一个6匹配,并且您没有说您不希望在该事件发生后允许其他6个实例。

你可以使用像^([^6]*6){,1}[^6]*$这样更复杂的正则表达式,但我实际上会用Awk解决这个问题:

awk -F 6 'NF==2' file

会在file中找到恰好出现6的所有行。

我们巧妙地使用6作为字段分隔符,并检查Awk读取一行并将其拆分为字段时的字段数。变量NF可以方便地告诉我们结果字段的数量。

Awk程序的格式为condition { action },其中两个部分都是可选的。没有条件,每个输入行都会{ action }。如果没有{ action },则默认操作是打印符合条件的行。这里的条件是NF==2

答案 3 :(得分:0)

如果您有GNU grep,那么您可以通过激活perl正则表达式模式-P并使用正向lookbehind并使用-v <除以匹配的行之外的每一行来完成此操作/ p>

grep -Pv "(?<=6)[^6]*6" input                                                                                                                
6543
1161

如果您没有GNU grep,则必须使用管道并分两步完成。

grep 6 input | grep -vE '6.*6'                                                                                                               
6543
1161