快速shell命令,用于在大文件中查找字符串序列的位置

时间:2012-02-11 10:15:40

标签: linux shell

我在linux中有一个只有1行的~200MB文件。我需要一个能够快速返回该行/文件中出现字符串序列的第一个位置的命令。

示例:文件中行的开头是“43525346465746123”,如果输入5746,则返回11。

我已经在使用awk命令了

awk -v find=5746 '{ printf ("%s", index($0,find) ) }' file

但是对于200MB文件,此命令大约需要6秒。有更快的方法吗? 我还希望它返回序列前后的几个字符。在上面的例子中,它们将是:646和123

2 个答案:

答案 0 :(得分:1)

尝试使用sed(我不知道它将如何与您的数据进行比较,所以请告诉我们):

sed -n "s/^.*(...5746...).*$/\1/p" file

我现在没有系统来测试这个,但这里的理论是:

  • -n:默认情况下不打印每一行(如果找不到搜索字符串)
  • s:替换
  • ^.*:从开始,吃掉所有的角色,直到......
  • (...5746...):捕获搜索字符串和一些周围的字符
  • .*$:吃剩下的一行
  • \1:用捕获
  • 替换该行
  • p:打印(仅限匹配时)

编辑:或尝试grep(再次,请告诉我们您的数据的性能):

grep -o "...5746..." file

答案 1 :(得分:1)

不知道它会如何扩展,但你可以尝试:

grep -o -P '.*?5746' | echo "`wc -m`-3" | bc 
处理非贪婪的正则表达式需要

-P,因为上面没有它会匹配整个字符串直到(并包括)˙5746的最后一次出现。 -o仅输出匹配的模式,然后wc -m计算字符数,但它也包含模式,因此应该递减(例如使用bc)。