使用grep的奇怪结果

时间:2016-02-20 18:27:38

标签: sh

我做了一个小脚本试图搜索文件,查找所有特定字符串的出现,如下所示:a0002 b0590 c0964

脚本是这样的:

#!/bin/sh
#include <stdio.h>
#
while read id; 
 do      
    awk {'print $1'} test.trans | grep -e "$id"
 done < test.id

为简化起见,我制作了一个我正在搜索的文件(test.trans)的精简版本:

"a0001"
"a0002"
"b0586"
"b0587"
"b0588"
"b0589"
"b0590"
"b0591"
"b0852"
"b0952"
"a0002"
"b0587"
"c0952"
"c0964"
"c1783"
"c1786"
"c1787"

我已将所有相关搜索字符串存储在名为test.id的单独文件中,如下所示:

a0002
b0587
b0588
b0589
b0590
b0591
b0852
b0952
c0952
c0964
c1781

这个想法是将test.id文件中的每个搜索字符串作为变量传递,然后由grep用来过滤掉test.trans文件中的所有匹配项 但是,当我运行脚本时,grep只匹配一些字符串。当我更改test.id文件中搜索模式的顺序时,结果也会更改。我究竟做错了什么? 我认为自己是shell编程的新手,非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我不知道你问题的原因。 但是这里有一些不适合评论的评论。

  1. 如果您想将文件输出到标准输出(标准输出),您可以使用cat test.trans代替awk {'print $1'} test.trans
  2. 但是你想要grep来处理一个你不能用其他工具读取它的文件并将它pip到grep。 grep可以使用`grep -e“$ id”test.trans
  3. 直接读取此文件
  4. 如果您使用awk,则不需要grep。你可以通过调用awk /"$id"'/ {print $1}' test.trans来实现这个问题,grep可以过滤多个模式。而不是你的for循环

    grep -f test.id test.trans
    

答案 1 :(得分:0)

经过一些实验,我发现所有这一切都归结为从test.id文件中的每一行中删除回车符(\ r \ n)。这个文件是从DOS机器收到的,我的iMac使用的UNIX格式只包含换行符(\ n)