如何同时从多个文件中 grep 精确的字符串

如何同时从多个文件中 grep 精确的字符串

我在如下所示的文件夹中有多个文件(文本文件),其中第一个文件包含一些路径作为字符串,另一个文件包含路径+文件名。

文件1:

[root@centos7 test]# pwd
/root/test
[root@centos7 test]# cat file1.txt
/abc/bce/12345/input/part3
/abc/bce/12345/input/part3/err
/abc/bce/34563/input
/abc/bce/34563/input/part1
/abc/bce/34563/input/part3/wrk
/abc/bce/11198/input/VII
/abc/bce/11198/input/VII/err
/abc/bce/11198/input/VII/part3
/abc/bce/11198/input/VII/part3/err
[root@centos7 test]#

文件2:

[root@centos7 test]# pwd
/root/test/test
[root@centos7 test]# cat file2.txt
/abc/bce/12345/input/part3/AIR9905.txt--20210421--
/abc/bce/12345/input/part3/AIR9923.txt--20210315--
/abc/bce/12345/input/part3/err/AIR9950.txt--20200512--
[root@centos7 test]#

文件3:

[root@centos7 test]# pwd
/root/test/test
[root@centos7 test]# cat file3.txt
/abc/bce/12345/input/part3/err/AIR1034.txt--20210110--
/abc/bce/34563/input/part1/AIR3426.txt--20200420--
/abc/bce/11198/input/VII/part3/err/V.AIR7650.txt--20170625--
[root@centos7 test]#

当前输出:

test/file2.txt:/abc/bce/12345/input/part3/AIR9905.txt--20210421--
test/file2.txt:/abc/bce/12345/input/part3/AIR9923.txt--20210315--
test/file2.txt:/abc/bce/12345/input/part3/err/AIR9950.txt--20200512--
test/file3.txt:/abc/bce/12345/input/part3/err/AIR1034.txt--20210110--

预期输出:

test/file2.txt:/abc/bce/12345/input/part3/AIR9905.txt--20210421--
test/file2.txt:/abc/bce/12345/input/part3/AIR9923.txt--20210315--

我用来grep -rHw "/abc/bce/12345/input/part3" test/匹配 file1 中的行并从 file2、file3 等中提取它们的信息。然而问题在于,当我尝试检索该行时,它会从 file2、file3 等中获取所有类似的行。当 file1 与多个文件以连续方式进行比较时,我不知道如何做到这一点。

答案1

如果我正确解释你的问题,在你的例子中你想找到行,file2.txt并且file3.txt(a)包含字符串“/abc/bce/12345/input/part3”+一个添加的字符串(文件名),但是(b)包含其他“/abc/bce/12345/input/part3/" 字符串。据我所知,你想要的东西是不可能的,至少在单个grep命令中是不可能的。

原因是你同时想要grep根据搜索词查找更长的字符串(即“/abc/bce/12345/input/part3”匹配“test/file2.txt:/abc/bce/12345/input/part3/AIR9905.txt--” 20210421--"), 和想要grep根据搜索词找到更长的字符串(即“/abc/bce/12345/input/part3”匹配“test/file2.txt:/abc/bce/12345/input/part3/”/AIR9950.txt--20200512---”)。

对于您给出的具体示例,您可以这样做grep -rHw "/abc/bce/12345/input/part3" test/ | grep -v "/err",但显然这并不是适用于所有情况的通用解决方案。

相关内容