使用 grep 查找两个字符串中的任何一个而不改变行的顺序?

Use grep to find either of two strings without changing the order of the lines?

我确定有人问过这个问题,但我找不到,所以很抱歉冗长。

我想使用 grep 或 egrep 查找其中包含“P”或“CA”的每一行,并将它们通过管道传输到新文件。我可以使用一个或另一个轻松地做到这一点:

egrep ' CA ' all.pdb > CA.pdb

egrep ' P ' all.pdb > P.pdb

我是正则表达式的新手,所以我不确定 or 的语法。

更新: 输出行的顺序很重要,即我不希望输出按匹配的字符串对行进行排序。这是一个文件的前 8 行的示例:

ATOM      1 N    THR U  27     -68.535  88.128 -17.857  1.00  0.00      1H5  N  
ATOM      2 HT1  THR U  27     -69.437  88.216 -17.434  0.00  0.00      1H5  H  
ATOM      3 HT2  THR U  27     -68.270  87.165 -17.902  0.00  0.00      1H5  H  
ATOM      4 HT3  THR U  27     -68.551  88.520 -18.777  0.00  0.00      1H5  H  
ATOM      5 CA   LYS B 122    -116.643  85.931-103.890  1.00  0.00      2H2B C  
ATOM      6 P    THY J   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 P  
ATOM      8 HB   THR U  27     -68.543  88.566 -15.171  0.00  0.00      1H5  H  
ATOM      9 CA   LYS B 122    -116.643  85.931-103.890  1.00  0.00      2H2B C  
ATOM     10 P    THY J   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 P  
ATOM     11 HB   THR U  27     -68.543  88.566 -15.171  0.00  0.00      1H5  H  
ATOM     12 C    SER D   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 C  
ATOM     13 OP1  SER D   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 O  

我希望此示例的结果文件为:

ATOM      5 CA   LYS B 122    -116.643  85.931-103.890  1.00  0.00      2H2B C  
ATOM      6 P    THY J   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 P  
ATOM      9 CA   LYS B 122    -116.643  85.931-103.890  1.00  0.00      2H2B C  
ATOM     10 P    THY J   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 P  

您可以这样使用 grep

grep ' P \| CA ' file > new_file

|表达式表示"or"。我们必须对其进行转义,以告诉 grep 它具有特殊含义。

您可以避免这种转义并使用带有扩展 grep 的更高级的东西:

grep -E ' (P|CA) ' file > new_file

总的来说,我更喜欢 awk 语法,因为它更清晰也更容易扩展:

awk '/ P / || / CA /' file

或者给定您的示例输入,您可以使用 awk 检查发生这种情况时它是否在第 3 列:

$ awk '=="CA" || =="P"' file
ATOM      5 CA   LYS B 122    -116.643  85.931-103.890  1.00  0.00      2H2B C
ATOM      6 P    THY J   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 P
ATOM      9 CA   LYS B 122    -116.643  85.931-103.890  1.00  0.00      2H2B C
ATOM     10 P    THY J   2     -73.656  70.884  -7.805  1.00  0.00      DNA2 P

测试

$ cat file
hello P is here and CA also
but CA appears
nothing here
P CA
$ grep ' P \| CA ' file
hello P is here and CA also
but CA appears
$ grep -E ' (P|CA) ' file
hello P is here and CA also
but CA appears
$ awk '/ P / || / CA /' file
hello P is here and CA also
but CA appears

下一个命令将搜索目录 /path_to_your_dir/ 中存在的所有文件并将日志输出到 /tmp/grep.log:

grep 'P|CA' -Er /path_to_your_dir/ > /tmp/grep.log

如果您需要不区分大小写,请将 -Er 替换为 -Eri
在文件 /tmp/grep.log 中,您将看到文件路径和匹配的字符串。
如果您需要在具有特定扩展名的文件中搜索,请写类似:

grep 'P|CA' -Er --include=*.php /path_to_your_dir/ > /tmp/grep.log

希望对您有所帮助。