我试图用来grep匹配包含两个不同字符串的行.我尝试了以下但是这匹配包含string1 或 string2的行,这不是我想要的.
grep 'string1\|string2' filename
Run Code Online (Sandbox Code Playgroud)
那么我如何grep只匹配包含两个字符串的行?
这可能是许多常见问题解答 - 而不是使用:
cat file | command
Run Code Online (Sandbox Code Playgroud)
(这被称为无用的猫),正确的方式应该是:
command < file
Run Code Online (Sandbox Code Playgroud)
在第二,"正确"的方式 - 操作系统不必产生额外的过程.
尽管知道这一点,我继续使用无用的猫有两个原因.
更美观 - 我喜欢数据仅从左到右均匀移动.而且它更容易更换cat别的东西(gzcat,echo,...),添加第二个文件或插入新的过滤器(pv,mbuffer,grep...).
我"觉得"在某些情况下可能会更快.更快,因为有2个进程,1st(cat)执行读取而第二个执行任何操作.它们可以并行运行,这意味着有时可以更快地执行.
我的逻辑是否正确(第二个原因)?
我想检查我的所有字符串是否都存在于文本文件中.它们可以存在于同一条线上或不同的线上.部分匹配应该没问题.像这样:
...
string1
...
string2
...
string3
...
string1 string2
...
string1 string2 string3
...
string3 string1 string2
...
string2 string3
... and so on
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我们可以用正则表达式代替字符串.
例如,以下代码检查文件中是否存在任何字符串:
if grep -EFq "string1|string2|string3" file; then
# there is at least one match
fi
Run Code Online (Sandbox Code Playgroud)
如何检查是否所有这些都存在?由于我们只对所有匹配项的存在感兴趣,因此我们应该在所有字符串匹配后立即停止读取文件.
是否有可能做到这一点,而不必调用grep多次(不会标尺时输入文件较大,或者如果我们有一个大量的字符串相匹配),或使用工具,如awk或python?
此外,是否有一个字符串的解决方案可以很容易地扩展为正则表达式?