使用SHELL SCRIPT在文件中搜索文件名

时间:2014-02-23 08:14:31

标签: shell

我将从文件中获取文件名:FILE_A,并将在另一个文件中搜索这些文件名:File_B使用脚本说:script.sh

我想打印文件中不存在的文件名:FILE_B。 我使用代码但它没有用。

脚本中的代码 - > script.sh如下:

#!/bin/bash
while read line

do
       grep -v "$line" FILE_B

done<FILE_A

请帮帮我。为什么它不起作用,它的解决方案是什么?

5 个答案:

答案 0 :(得分:2)

grep可以从文件中读取其输入;不需要循环。

grep -Fxvf FILE_A FILE_B

-F选项指定输入是文字字符串,而不是正则表达式。否则,包含正则表达式元字符的输入将不匹配;或者不仅仅是它自己。例如,正则表达式a.c匹配“aac”,“abc”等等。

-x选项需要全行匹配。否则,输入“bc”将匹配包含它作为子字符串的任何行,例如“abcd”。

-v选项表示打印不匹配的行而不是匹配。

最后,小写-f选项指定文件名作为其参数,以用作要匹配的模式的输入。

答案 1 :(得分:1)

comm对此有好处,但它需要对输入文件进行排序。如果这不是问题:

# lines in FILE_A that are not in FILE_B
comm -23 <(sort FILE_A) <(sort FILE_B)

答案 2 :(得分:0)

此脚本有效但无法打印您想要的内容。对于FILE_A中的每个文件名,它会在FILE_B中打印所有OTHER文件名。相反,如果grep找不到它,你应该自己打印文件名:

while read line
do
  grep "$line" FILE_B >/dev/null || echo "$line"
done <FILE_A

答案 3 :(得分:0)

  1. whiledo
  2. 之间没有额外的换行符
  3. grep -v expr file会的     打印这些文件的所有行,不包含expr。你想要的只是结果,无论它是否被发现。你需要测试一下 退出状态。
  4. 尝试:

    #!/bin/bash
    while read line
    do
           grep -q "$line" FILE_B || echo "$line"
    
    done<FILE_A
    
    如果找到一行,

    grep返回0。 ||与echo连接意味着:execute echo when exit state != 0 - 即未找到$line时。

答案 4 :(得分:0)

改为使用

#!/bin/bash
while read line
do
    if grep -qw $line "file_B"
    then
    echo $line
    fi
done < file_A