【问题标题】:grep exact match [duplicate]grep 完全匹配 [重复]
【发布时间】:2012-10-22 14:15:23
【问题描述】:

我需要grep 以与ls 命令的结果列表完全匹配。

例如,如果我 ls 一个目录,结果如下:

system
sys
sbin
proc
init.rc
init.mahimahi.rc
init.goldfish.rc
init

我想grep 看看是否存在名为“init”的文件。我需要grep 只返回一个结果。列表中只有一个名为“init”的文件。


我正在安卓设备上执行此操作。所以这里是完整的命令:

adb shell ls / | grep -E "^init$"

我需要检查android设备上是否存在目录,如果目录存在则执行操作。

我在批处理脚本中使用find 之前已经这样做了,但是我需要在Linux 上使用bash 执行此操作,并且我想要一个完全匹配的。如果有另一个目录或文件包含我正在搜索的字符串,这将避免此问题。


我已经尝试了以下链接中的建议,但是当我将“init”作为参数时,它们都没有返回结果。

how-to-grep-the-exact-match

match-exact-word-using-grep

【问题讨论】:

  • 您为什么不简单地测试一下该文件是否存在?
  • 呃...你的意思是grep -E '^init$'不起作用?
  • 如果问题是避免点表示任何字符,您可以使用反斜杠将其转义为 \\. 或使用 fgrep
  • @prolink007 - grep -e /initgrep -E '^init$'test -e /init 的含义不同。
  • @prolink007 - 不,您已经说明了您要实现的目标,而不是您要实现它的原因。确定根目录中是否存在名为“init”的文件的方法是test 命令,而不是grep。您特别告诉我们您正在尝试将test 的选项应用于grep 的命令行。再次:告诉我们您真正想要实现的目标。您只是要求我们帮助您针对您面临的任何问题实施解决方案。

标签: android linux grep adb


【解决方案1】:

假设 ls 文件与文件系统无关(因此您不能使用文件系统代替),grep '^init$' 应该可以解决问题。


xxd 结果:

00000a0: 2e67 6f6c 6466 6973 682e 7263 0d0a 696e  .goldfish.rc..in
00000b0: 6974 0d0a 6465 6661 756c 742e 7072 6f70  it..default.prop

基于这个 hexdump,我建议你先把它转成 unix 风格:

adb shell ls /|tr -d '\015'|grep '^init$'

【讨论】:

  • 这不起作用。我正在通过ADB 在安卓设备上执行此操作。检查我在帖子中的其他信息。
  • 我身边没有安卓设备,如果它不工作,究竟会发生什么?
  • 它什么也不返回。我希望看到“init”返回。
  • 我怀疑返回了额外的字符。您可以尝试将其发送到xdd 看看是否还有其他内容?
  • 不确定xdd 是什么,但我将它重定向到一个文本文件,然后查看带有格式和空白的文件。我没有看到带有“init”的额外隐藏字符。
【解决方案2】:

要获得完全匹配,您必须使用 -E 参数激活正则表达式并使用行首和行尾符号:

grep -E "^init$"

【讨论】:

  • 不,您不需要为^$ 激活扩展正则表达式。也不会造成任何伤害。
  • 这不起作用。我正在通过ADB 在安卓设备上执行此操作。检查我在帖子中的其他信息。
  • 既然我评论了答案,我不得不说我没有投反对票 ;-) 但原因可能是你的误导性措辞——你不需要-E 来启用 grep 的正则表达式, -E 启用 extended 正则表达式。
【解决方案3】:

grep 有问题吗? awk呢?

ls | awk '$1 == "init"'

【讨论】:

  • 嗯,是的,但是希望它能够在不识别问题的情况下解决问题而更换工具并不是处理它的最佳方法;-)
【解决方案4】:

问题是您要使用哪个 shell(设备或您的电脑)进行 shell 扩展/grepping/等?

如果你想让你的设备进行处理,命令应该是

adb shell "ls / | grep ^init$"

如果你想让你的电脑完成这项工作,命令是

adb shell "ls /" | tr -d '\r' | grep ^init$

但话又说回来,正如许多其他人所建议的那样,当您知道确切的文件名时 - 只需检查它是否存在,无需 grepping

adb shell "[ -f '/init' ] && echo 'found'"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2015-01-04
    • 2013-06-11
    相关资源
    最近更新 更多