这是我的测试文件test.txt
hello
user1 ALL=(ALL) NOPASSWD: /usr/bin/* /app/tomcat/tomcat*/webapps/*, /usr/bin/rm -rf /app/tomcat/tomcat*/webapps/*,/bin/rm -rf /app/tomcat/tomcat*/webapps/**.sh , /bin/kill -3 *
我能够使用下面的正则表达式成功找到所需的行
grep -P '(^[^#;]ser1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt
但是,当我给出完整的单词user1
而不是ser1
正则表达式时,不匹配
正则表达式失败的原因如下;它不匹配:
grep -P '(^[^#;]user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt
我想user1
在正则表达式中提供以匹配该行。
你能建议一下吗?
答案1
问题是你试图明确地实现两件事,但它们却相互暗示:
- 该行应该以
user1
- 该行不应以注释符号(
#
或;
)开头
#
但是,您的第二个正则表达式指出“该行应以不是or的任何字符开头;
,然后包含user1
。因此,grep
预计 之前有一个字符user1
。这在第一个正则表达式中没有问题,您要求“任何字符不是#
或;
后跟ser1
",就像以不是或 的user1
字符开头一样。#
;
如果您确定该行以 开头user1
,您可以简单地使用
grep -P '^user1 etc.'
或者,如果可能有空格,
grep -P '^ *user1 etc.'
答案2
您将正则表达式锚定到行的开头:
^[^#;]ser1
#
这意味着“匹配以or以外的任何字符开头的行;
,然后是字符串ser1
。因此, the与of[^#;]
匹配。如果要给出整个单词,则需要查找直接以以下字符开头的行:u
user1
user1
^user1
或者,允许该模式出现 0 次[^#;]
:
^[^#;]*ser1
所以,你的完整命令可能是这样的:
grep -P '(^user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt
或者
grep -P '(^[^#;]*user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt
然而,这看起来非常非常复杂。您真正需要的是:
grep -P '^[^#;]*user1'
在这个例子中。