grep 与模式中的否定

grep 与模式中的否定

如何使用grep(或其他工具)来匹配模式中的否定部分?

例子

php cronjob.php test
php cronjob.php scan_document
php cronjob.php scan_document -v
php cronjob.php scan_documenttest -v
php cronjob.php scan_document_callback_retry

从上面的场景中我需要匹配第 2 行和第 3 行

php cronjob.php scan_document
php cronjob.php scan_document -v

我用这个命令

ps --noheader -o pid,ppid,cmd -C php | grep "cronjob.php scan_document"

但它比我想要的更匹配

php cronjob.php scan_document
php cronjob.php scan_document -v
php cronjob.php scan_document_callback_retry

答案1

看起来您想要匹配所有存在的情况字边界 \bscan_document

$ grep 'cronjob\.php scan_document\b' << EOF
php cronjob.php test
php cronjob.php scan_document
php cronjob.php scan_document -v
php cronjob.php scan_documenttest -v
php cronjob.php scan_document_callback_retry
EOF
php cronjob.php scan_document
php cronjob.php scan_document -v

请注意,我对 - 中的句点进行了转义cronjob.php,否则它可能会匹配任何单个字符。

答案2

grep正在做它的工作,你的模式没有告诉任何关于字符串如何结束的信息。然后你必须添加它:

$ grep "cronjob\.php scan_document$\|cronjob\.php scan_document[[:blank:]].*$" file
php cronjob.php scan_document
php cronjob.php scan_document -v

我们输入grep两种模式,一种是行尾$,另一种是空格以及后面的内容[[:blank:]].*$

答案3

php 脚本的第一个参数必须等于scan_document:5

$ awk '$3 == "scan_document"' file
php cronjob.php scan_document
php cronjob.php scan_document -v

相关内容