如何使用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
看起来您想要匹配所有存在的情况字边界 \b
后scan_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