Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如果整行匹配,如何使grep仅匹配?_Shell_Unix_Grep - Fatal编程技术网

Shell 如果整行匹配,如何使grep仅匹配?

Shell 如果整行匹配,如何使grep仅匹配?,shell,unix,grep,Shell,Unix,Grep,我有: $ cat a.tmp ABB.log ABB.log.122 ABB.log.123 我想找到ABB.log的精确匹配项 但当我这么做的时候 $ grep -w ABB.log a.tmp ABB.log ABB.log.122 ABB.log.123 它显示了所有这些 我可以使用grep获得我想要的吗?只需指定regexp锚 grep '^ABB\.log$' a.tmp 从grep手册页: -F,--固定字符串 将模式解释为固定字符串的(列表) -x,--line regex

我有:

$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123
我想找到ABB.log的精确匹配项

但当我这么做的时候

$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123
它显示了所有这些


我可以使用grep获得我想要的吗?

只需指定regexp锚

grep '^ABB\.log$' a.tmp
从grep手册页:

-F,--固定字符串 将模式解释为固定字符串的(列表)
-x,--line regexp
仅选择与整行完全匹配的匹配项

与awk类似

 awk '/^ABB\.log$/' file

以下是我所做的,尽管使用锚是最好的方式:

grep -w "ABB.log " a.tmp

我需要此功能,但也希望确保我没有返回在ABB.log之前带有前缀的行:

  • ABB.log
  • ABB.log.122
  • ABB.log.123
  • 123ABB.log


如果只有一个前导或尾随空格,大多数建议都会失败,如果手动编辑文件,这将很重要。这将使其在这种情况下更不易受影响:

grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp
shell中的一个简单while read循环将隐式执行此操作:

while read file
do 
  case $file in
    (ABB.log) printf "%s\n" "$file"
  esac
done < a.tmp
读取文件时
做
案例$file in
(ABB.log)printf“%s\n”“文件”
以撒
完成
我更喜欢:

str="ABB.log"; grep -E "^${str}$" a.tmp

干杯

这是HPUX,如果文件内容在单词之间有空格,请使用以下命令:

egrep”[[:space:][]ABC\.log[:space:][]a.tmp

我打算添加一些关于OP尝试和其他答案的额外解释

您也可以这样使用:

grep -x "ABB\.log" a.tmp
引用字符串并转义点(
)使其不再需要
-F
标志

您需要转义
(点)(因为它匹配任何字符(不仅是
),如果没有转义),或者将
-F
标志与grep一起使用
-F
标志使其成为固定字符串(不是正则表达式)

如果不引用字符串,可能需要双反斜杠来转义点(
):


测试:


注:

  • -x
    强制匹配整行
  • 使用不带
    -F
    标志的非转义
    的答案是错误的
  • 通过使用
    ^
    $
    包装模式字符串,可以避免
    -x
    切换。在这种情况下,请确保不要使用
    -F
    ,而是转义
    ,因为
    -F
    将阻止对
    ^
    $
    的正则表达式解释

  • 编辑: (增加关于@hakre的额外解释):

    如果要匹配以
    -
    开头的字符串,则应将
    -
    与grep一起使用。下面的任何内容都将作为输入(而不是选项)

    例如:

    echo -f |grep -- "-f"     # where grep "-f" will show error
    echo -f |grep -F -- "-f"  # whre grep -F "-f" will show error
    grep "pat" -- "-file"     # grep "pat" "-file" won't work. -file is the filename
    

    当我尝试做类似的事情时,这对我很有效:

    grep -F ABB.log a.tmp
    

    对我有用

    grep "\bsearch_word\b" text_file > output.txt  
    
    \b
    指示/设置边界



    似乎工作得很快

    很遗憾,我们无法使用-F。@Johnyy No
    -F
    ?你在Solaris上吗?如果是这样,请使用
    /usr/xpg4/bin/grep
    我在bash脚本中使用
    grep
    ,此选项比使用公认答案中建议的正则表达式要好。因为我正在搜索的变量中有一些特殊字符(如
    ),使用命令时不必转义它们。最好回答IMO,因为它允许特殊字符而不转义。这更好,因为它也适用于变量。需要两个锚(^和$),很好!如果我使用正则表达式来匹配文件?“grep-f patterns a.tmp”?@green69晚了几年,但您可以在将模式传递给grep之前使用sed添加锚定:
    sed-r“s/^(.*)/^-/^\1$/”patterns.txt | egrep-f-a.tmp
    这也将匹配以ABB.log结尾的文件,并且应该转义点。像这样。。它将返回第一行匹配。这需要在
    ABB.log
    之后留一个空格,这不是一般情况,即大多数情况下它都会失败。您是否实际体验到在您的情况下缺少-F?如果是这样的话,你能说说是哪种情况吗?@hakre你把我的答案看完了吗?我(非常清楚地)解释了如果
    正确转义,为什么不需要
    -F
    。当然。当然,我只是问:当你写这篇文章时,
    -F
    可用吗?如果没有,您使用的是哪种系统?到目前为止,我在你的答案中找不到这些信息,即使是现在,当我再次阅读时也是如此。所以我真的很确定,我把你的答案完整地读了至少两遍@当然,hakre
    -F
    是可用的。(我确实说过:“或者使用
    -F
    标志和
    grep
    ”)谢谢你的见解。只剩下一个小问题:如果答案是
    -F
    ,为什么还要费心逃跑呢?您对此有何看法?这将匹配
    ABBxlog
    OP希望匹配整行,而不是行中的空格分隔词。这将仅在满足前导
    \W
    的条件下匹配,即任何非空白字符,所以
    xABBxlog
    。这也匹配任何包含
    search\u word
    并由单词边界分隔的行。例如,它将匹配行“foo search\u word bar”。
    grep -x ABB\\.log a.tmp
    
    $ echo "ABBElog"|grep -x  ABB.log
    ABBElog #matched !!!
    $ echo "ABBElog"|grep -x  "ABB\.log"
    #returns empty string, no match
    
    echo -f |grep -- "-f"     # where grep "-f" will show error
    echo -f |grep -F -- "-f"  # whre grep -F "-f" will show error
    grep "pat" -- "-file"     # grep "pat" "-file" won't work. -file is the filename
    
    grep -F ABB.log a.tmp
    
    grep "\bsearch_word\b" text_file > output.txt