これは私のテストファイル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
問題は、2つを明示的に達成しようとしていますが、2つがお互いを暗示していることです。
- この行は次に終了する必要があります。
user1
- 行はコメント記号(
#
または)で;
始まってはいけません。
#
ただし、2番目の正規表現では、「行はまたは文字以外で始まる必要があり、次のものを含める必要があり;
ますuser1
。したがって、grep
前に文字が続くと予想されます。user1
これは、「すべての文字」を要求する最初の正規表現では問題ではありません#
。以外の文字で始まるのと同様に、or以外の文字の;
後に「が続きます。ser1
user1
#
;
行がで始まると確信している場合は、user1
単に次のものを使用できます。
grep -P '^user1 etc.'
または席がある場合、
grep -P '^ *user1 etc.'
答え2
正規表現を行の先頭に固定します。
^[^#;]ser1
#
これは、「or以外の文字で始まり、;
後に文字列が続く一致行を意味します。ser1
したがってofと一致します[^#;]
。完全な単語を提供するには、次に直接始まる行を見つける必要があります。u
user1
user1
^user1
または、次のパターンがゼロ回発生することを許可します[^#;]
。
^[^#;]*ser1
したがって、完全なコマンドは次のようになります。
grep -P '(^user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt
または
grep -P '(^[^#;]*user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt
しかし、これは非常に複雑に見えます。本当に必要なものは次のとおりです。
grep -P '^[^#;]*user1'
この例では。