如何 grep 查找仅与通配符括起来的字符串匹配的文件

如何 grep 查找仅与通配符括起来的字符串匹配的文件

我必须找到一个仅包含给定数字和字符串的文件。伊藤发现856用通配符括起来*856*

例如我有这个文件A.txt有数千个数字:

45423542354235423542
5423543542353254235
345435245243
435435345
452345345
4523543455454

我有这个脚本:

#!/bin/sh

findFile() {
    while read -r LINE
    do
         printf "$LINE\n"
         grep -il "$LINE" *856*
         printf "\n"
    done < /path/to/fileA.txt > /path/to/result.txt
}

findFile

编辑:文件名不包含fileA.txt.

期望的输出:

45423542354235423542
found_file_856_COMPANY_FFW3443E.dat

5423543542353254235
found_file_856_COMPANY_43R43F.dat

345435245243
found_file_856_COMPANY_77Y85HHH.dat

435435345
found_file_856_COMPANY_64Y76H6.dat

452345345
found_file_856_COMPANY_9630GGTFVF.dat

4523543455454
found_file_856_COMPANY_2R98JD925.dat

答案1

假设文件名中没有换行符......

创建“-files”列表856并用于grep过滤掉您想要的文件:

find . -name '*856*' > filelist
grep -Ff fileA.txt filelist >result.txt

grep命令将使用字符串作为模式,并从中提取与这些字符串匹配的fileA.txt名称。filelist-F标志将确保中的字符串fileA.txt被解释为固定字符串(而不是正则表达式)。

中的模式fileA.txt可能需要更加具体,例如通过添加前缀_并添加.dat后缀:

sed -e 's/^/_/' -e 's/$/.dat' fileA.txt >fileB.txt

然后您可以使用fileB.txtwithgrep而不是fileA.txt

答案2

目前尚不清楚您在问题中要问什么(即您想要实现什么目标?)或您正在使用哪种外壳。遗憾的是我没有代表。评论。

假设您使用的是bashshell;如果您尝试找到一个返回当前文件夹中包含字符串 856 的所有文件的通配模式,那么这*856*是正确的方法。

为了澄清起见,如果您想搜索sausages名称中包含该字符串的所有文件,snacks_for_later那么您可以使用

    $ grep sausages *snacks_for_later*

找到任何香肠。


要检查您是否在正确的文件中搜索,您可以使用 ls 测试您的通配模式:

    $ ls *856*

如果您没有从文件所在的文件夹运行命令,则必须使用/path/to/allfiles/*856*grep 和 ls 的模式。全局模式(例如“*”)不会遍历目录。

相关内容