我必须找到一个仅包含给定数字和字符串的文件。伊藤发现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.txt
withgrep
而不是fileA.txt
。
答案2
目前尚不清楚您在问题中要问什么(即您想要实现什么目标?)或您正在使用哪种外壳。遗憾的是我没有代表。评论。
假设您使用的是bash
shell;如果您尝试找到一个返回当前文件夹中包含字符串 856 的所有文件的通配模式,那么这*856*
是正确的方法。
为了澄清起见,如果您想搜索sausages
名称中包含该字符串的所有文件,snacks_for_later
那么您可以使用
$ grep sausages *snacks_for_later*
找到任何香肠。
要检查您是否在正确的文件中搜索,您可以使用 ls 测试您的通配模式:
$ ls *856*
如果您没有从文件所在的文件夹运行命令,则必须使用/path/to/allfiles/*856*
grep 和 ls 的模式。全局模式(例如“*”)不会遍历目录。