如何在同一命令中执行 grep -v -e 'expr1' 和 grep -e 'expr2' ?

如何在同一命令中执行 grep -v -e 'expr1' 和 grep -e 'expr2' ?

我有以下命令来提取不以 开头www.且不包含 的字符串/

grep -v -e '^www\.' -e '/' test2.txt 

但我想要除了匹配somestring.somestring模式之外的上述内容,这可以通过以下命令来实现:

grep -e '^[^\.]*\.[^\.]*$'

如何将所有论文放到一行中?

答案1

您无法在一次grep调用中组合反向和正向匹配

你可以这样做sed

sed -e '/^www\./d' -e '/\//d' -e '/^[^.]*\.[^.]*$/!d' ./*.txt

或者awk(与能够sed打印匹配文件的名称相反grep):

awk -F. 'NF == 2 && !/^www\./ && !/\// {print FILENAME": "$0}' ./*.txt

如果您不希望打印文件名,则可以使用两次 grep 调用来完成此操作:

cat ./*.txt | grep '^[^.]*\.[^.]*$' | grep -v -e / -e '^www\.'

这里用于cat提供标准输入上所有文​​件的内容,因此第一个文件grep不会打印文件名。如果有多个文件,某些grep实现必须跳过打印文件名。grep -h在只有一个文件名的情况下,grep无论如何都不会打印文件名,并且您可以通过重定向将其提供给其标准输入:

<onefile.txt grep '^[^.]*\.[^.]*$' | grep -v -e / -e '^www\.'

如果您支持,您可以使用 PCRE 的(?!...)否定前瞻运算符来实现否定:grep-P

grep '^(?!www\.)(?!.*/)[^.]*\.[^.]*$' ./*.txt

但在这里,您可以通过以下方式完成这一切-v

grep -v -e / -e '^www\.' -e '^[^.]*$' -e '\..*\.'

这也排除了不包含点的行和包含多个点的行。

答案2

将第一个grep结果通过管道传输到第二个结果中grep

相关内容