Unix 我怎样才能让grep做“a”;单词匹配;,但是没有句点被当作单词分隔符?

Unix 我怎样才能让grep做“a”;单词匹配;,但是没有句点被当作单词分隔符?,unix,awk,grep,Unix,Awk,Grep,我有一个文件如下所示: 5.3.236.113681.2225191122.986.3705653211.104 4 5.3.236.113681.2225191122.986.3705653211.104.3402 45 5.3.236.0.1.20549687.20.93.9.2.234266672113.4455 2 5.3.236.113681.5829104.986.3705653211.119 8 5.3.236.2.01107.50.01.24.48685.3000

我有一个文件如下所示:

5.3.236.113681.2225191122.986.3705653211.104    4
5.3.236.113681.2225191122.986.3705653211.104.3402  45
5.3.236.0.1.20549687.20.93.9.2.234266672113.4455  2
5.3.236.113681.5829104.986.3705653211.119    8
5.3.236.2.01107.50.01.24.48685.30000018053113560818700000112 172
4   5.3.236.113681.2225191122.986.3705653211.104
45  5.3.236.113681.2225191122.986.3705653211.104.3402
基本grep将显示这些结果;它显示了一个我不想要的额外匹配项

$ grep 5.3.236.113681.2225191122.986.3705653211.104 test.txt
5.3.236.113681.2225191122.986.3705653211.104    4
5.3.236.113681.2225191122.986.3705653211.104.3402  45
$ grep -F 5.3.236.113681.2225191122.986.3705653211.104 test.txt
5.3.236.113681.2225191122.986.3705653211.104    4
5.3.236.113681.2225191122.986.3705653211.104.3402  45
$ grep -w 5.3.236.113681.2225191122.986.3705653211.104 test.txt
5.3.236.113681.2225191122.986.3705653211.104    4
5.3.236.113681.2225191122.986.3705653211.104.3402  45
我试着用greping搜索“固定字符串”;它显示了一个我不想要的额外匹配项

$ grep 5.3.236.113681.2225191122.986.3705653211.104 test.txt
5.3.236.113681.2225191122.986.3705653211.104    4
5.3.236.113681.2225191122.986.3705653211.104.3402  45
$ grep -F 5.3.236.113681.2225191122.986.3705653211.104 test.txt
5.3.236.113681.2225191122.986.3705653211.104    4
5.3.236.113681.2225191122.986.3705653211.104.3402  45
$ grep -w 5.3.236.113681.2225191122.986.3705653211.104 test.txt
5.3.236.113681.2225191122.986.3705653211.104    4
5.3.236.113681.2225191122.986.3705653211.104.3402  45
我试着为了比赛而变灰;它显示了一个我不想要的额外匹配项

$ grep 5.3.236.113681.2225191122.986.3705653211.104 test.txt
5.3.236.113681.2225191122.986.3705653211.104    4
5.3.236.113681.2225191122.986.3705653211.104.3402  45
$ grep -F 5.3.236.113681.2225191122.986.3705653211.104 test.txt
5.3.236.113681.2225191122.986.3705653211.104    4
5.3.236.113681.2225191122.986.3705653211.104.3402  45
$ grep -w 5.3.236.113681.2225191122.986.3705653211.104 test.txt
5.3.236.113681.2225191122.986.3705653211.104    4
5.3.236.113681.2225191122.986.3705653211.104.3402  45
这是可行的,但从技术上看,它是为我想要的字符串加上空格而变灰的,这看起来更像是一种变通方法,而不是专门针对我想要的内容

$ grep "5.3.236.113681.2225191122.986.3705653211.104[[:space:]]" test.txt
5.3.236.113681.2225191122.986.3705653211.104    4
工作字符串的问题是,所需字符串的末尾可能没有空格,它的前面可能有空格,如下所示:

5.3.236.113681.2225191122.986.3705653211.104    4
5.3.236.113681.2225191122.986.3705653211.104.3402  45
5.3.236.0.1.20549687.20.93.9.2.234266672113.4455  2
5.3.236.113681.5829104.986.3705653211.119    8
5.3.236.2.01107.50.01.24.48685.30000018053113560818700000112 172
4   5.3.236.113681.2225191122.986.3705653211.104
45  5.3.236.113681.2225191122.986.3705653211.104.3402
以前有效的命令在格式稍有不同的列表上不起作用

我可以简单地编写
grep”[[:space:]5.3.236.113681.2225191122.986.3705653211.104
,但我不想为每一个这样的小差异重新编写grep


我希望能够grep该字符串并显示整行,无论该行在文本中显示的方式或位置如何。

假设这是您的输入文件:

cat文件
5.3.236.113681.2225191122.986.3705653211.104    4
5.3.236.113681.2225191122.986.3705653211.104.3402  45
5.3.236.0.1.20549687.20.93.9.2.234266672113.4455  2
5.3.236.113681.5829104.986.3705653211.119    8
5.3.236.2.01107.50.01.24.48685.30000018053113560818700000112 172
4   5.3.236.113681.2225191122.986.3705653211.104
45  5.3.236.113681.2225191122.986.3705653211.104.3402
如果您有
gnu grep
,则可以将此PCRE正则表达式与环视一起使用:

grep-P'(?
  • (?!\S)
    :是一个负前瞻正则表达式,用于断言当前位置之后的位置没有非空白

  • 以下是POSIX投诉
    awk
    解决方案:

    awk-v s='5.3.236.113681.2225191122.986.3705653211.104''{
    
    因为(i=1;i
    [.]
    是一个只包含
    的字符类,也就是说,我觉得你的问题并不完全是针对句点的——你担心的是结尾的空格,而不是
    是一个单字符通配符。那么为什么标题中提到句点呢?搜索
    ([[:space:]|^)
    开头和
    ([:space:]|$)
    作为一种实践,最后并不是那么不寻常。你遇到的更大的问题是一个你根本没有问过的问题——
    1.2.3
    也匹配
    10243
    ,因为
    是一个通配符。顺便说一句,这不应该被标记为
    bash
    ——grep不是bash的一部分,它是一个外部命令that可以在任何shell中使用,也可以在没有shell的情况下使用。@CharlesDuffy我不知道标题是如何得到的,它不是我最初使用的标题。已编辑。我去删除bash标记,但它已经不存在了。很抱歉,我不知道。很清楚,我反对的标题是原始标题,grep for variable,其字符串包含句点。到那时我评论说,我已经把它修改得更清楚了。同样,我自己也修改了bash标记,只是为了说明为什么会做出这样的更改。符合POSIX的awk解决方案现在最适合我,因为我可以使用带有该字符串的变量,如
    awk-v s='$FUID'{(i=1;iawk是最好的选择,因为我们必须转义
    grep
    regex中的所有regex元字符,如
    ),
    ]
    等。如果希望在
    gnu grep
    中使用shell变量,则转义所有这些字符,使其成为符合regex的字符串。