我是Unix的新手,并且要求完成我的任务。
我有file1.dat
,其数据如下所示。
case1.txt
case2.txt
case3.txt
case4.txt
case5.txt
file1.dat只有文件名
我的文件夹中包含file1.dat
中提到的上述文件./all_files
case1.txt
case2.txt
case3.txt
case4.txt
case1.txt,case2.txt,case3.txt:
中的数据step1
step2
step3
step4
现在,我必须从每个文件中采取特定步骤说step2,这也存在于file1.dat中
注意:step2不是第2行:
答案 0 :(得分:0)
试试这个:
while read f; do
[ -f "$f" ] && sed -n '/step2/p' "$f"
done < file1.dat
它将在step2
中列出的每个文件中输出与file.dat
匹配的行。
答案 1 :(得分:0)
while read f; do
test -f "$f" && grep -F 'step2' "$f"
done <file1.dat
将file1.dat
(包含文件名)的行逐一读入f
变量。
while
循环的主体在使用$f
查找给定文件中的文本字符串grep
之前测试以确保文件step2
存在。< / p>
循环的稍微冗长(但等效)版本:
while read f; do
if [ -f "$f" ]; then
grep -F 'step2' "$f"
fi
done <file1.dat
根据您运行此位置的位置,您可能需要稍微修改grep
命令。例如,如果您在子文件夹正上方的文件夹中运行此文件并包含所有文件:
grep -F 'step2' "all_files/$f"
在问题中并不完全清楚,但如果需要可以轻松调整。
当然,您可以完全绕过file1.dat
并说出
grep -F 'step2' all_files/case?.txt
根本没有循环。
修改:符合新要求:
find ./all_files -type f -name "case?.txt" -print0 |
xargs -0 grep -l -F 'step2'
这将递归搜索all_files
文件夹下的所有文件夹,找到与case?.txt
匹配的文件,并报告哪些文件包含所需的字符串。
您可能希望将模式更改为更严格,可能更改为case[1-5].txt
。
答案 2 :(得分:0)
如果您想从step 2
目录中的每个文件中获取./all_files
,那么除非您需要将其用作练习,否则不需要files.dat
。如果您的shell支持大括号扩展:
grep "step2" all_files/case{1,5}.txt
或使用files.dat
您可以更改为all_files
目录,并将内容重定向为grep
的输入:
cd all_files
grep "step2" $(<../files.dat)