我想 grep 包含模式 A (iwant) 的文件,但我想排除包含模式 B (idontwant) 的文件。
例子:
read -p "...what are you looking for: " iwant
read -p "...what should not be included: " idontwant
iwant="blue car"
idontwant="red car"
假设我有以下文件:
-rw-rw-r--. 1 terpentin terpentin 45 Jun 8 16:04 blue.car
-rw-rw-r--. 1 terpentin terpentin 44 Jun 8 16:05 mixed.car
-rw-rw-r--. 1 terpentin terpentin 40 Jun 8 16:04 red.car
find . -type f -print -exec cat {} \;
./mixed.car
blue car
red car
blue car
./red.car
red car
red car
red car
./blue.car
blue car
blue car
blue car
结果怎么可能只得到文件“./blue.car”?
原始内容包括数百个长文本文件,因此尽可能节省资源非常重要。
利用
或者
find
被表征为测试(例如,-type f
)和动作(例如,-print
和-delete
)。可能很难从手册页中找出-exec
既是 action又是 test的内容。所以,就像 依次将搜索范围缩小到满足所有条件(满足所有指定测试)的文件,因此 查找所有命令都成功的文件。find
测试都可以通过在它前面加上 来否定(反转)!
。因此find . ! -type d
可以找到普通文件、符号链接、命名管道、套接字和设备文件——除了目录之外的所有内容。! -exec grep …
不等于-exec grep -v …
.-exec grep -v …
将找到至少有一行不匹配的文件。! -exec grep …
将找到没有行匹配的文件。-q
选项 to是官方的grep
同义词--quiet
,但它也意味着快速。它不写入任何输出(可能除了错误消息,如适用),但它也会在找到匹配项后立即退出——它不会将每个文件都读到最后以找到每个匹配项。(当然,如果文件不包含任何匹配项,则grep
必须完整读取它才能确定。)!
)。grep "$iwant"
会消除大部分文件。如果许多文件包含这两个字符串,则 会更快,因为这! grep "$idontwant"
会消除大部分文件。我们可以通过
GNU grep
明智地选择正则表达式和 grep 选项来执行文件名提取:我们在 slurp 模式 (-z) 下运行 grep,其中整个文件被视为一大行。
-l 将列出与正则表达式匹配的文件的文件名。
-r 将在当前目录下的所有文件上递归运行。
-s 将使 grep 静音以不发出任何警告。
正则表达式将在文件中寻找蓝色的存在和红色的缺失,以便它说是。
-P 在 grep 中调用 Perl 正则表达式引擎,以便我们可以利用 pcre 正则表达式的优势。