搜索文件中的字符串,该文件也存在于unix中的另一个文件中

时间:2016-07-22 07:25:38

标签: shell

我是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行:

3 个答案:

答案 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)