我一直试图找出如何让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
我错过了什么?提前谢谢!
更新
要求救援!感谢大家分享您的知识! :)
答案 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]*$" *
这意味着:
$ end of line。
grep -E" 6 {,1}" *
表示在模式中的某个位置只有0到1的6。
答案 2 :(得分:2)
“我缺少的是什么”部分是:正则表达式将在找到匹配后忽略尾随上下文,除非您告诉他们不要。因此666
与6{,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