Linux 快速grep/仅限行号grep?

Linux 快速grep/仅限行号grep?,linux,search,grep,Linux,Search,Grep,我正在寻找一些关于grep或类似grep的工具的帮助。这包括但不限于grep、egrep、awk、sed或用于搜索匹配项的任何其他工具。但我会把剩下的问题称之为grep 我正在寻找一种快速的方法来grep一个文件进行匹配,我也在寻找一种最快的方法来grep一个文件进行匹配,并且只返回行号,而不返回匹配行的其余部分。我不介意语法是复杂的,只要它快,我将在程序中使用它复杂性不是问题 如果我需要为一个模式使用正则表达式,那么我也需要这个方法来工作,这样我也可以搜索一个范围。因此,如果我需要搜索所有小于

我正在寻找一些关于grep或类似grep的工具的帮助。这包括但不限于grep、egrep、awk、sed或用于搜索匹配项的任何其他工具。但我会把剩下的问题称之为grep

我正在寻找一种快速的方法来grep一个文件进行匹配,我也在寻找一种最快的方法来grep一个文件进行匹配,并且只返回行号,而不返回匹配行的其余部分。我不介意语法是复杂的,只要它快,我将在程序中使用它复杂性不是问题

如果我需要为一个模式使用正则表达式,那么我也需要这个方法来工作,这样我也可以搜索一个范围。因此,如果我需要搜索所有小于10的数字,如果命令默认支持它,或者如果它需要一些正则表达式,我只是在寻找我能找到的最快的方法

多谢各位

编辑


我正在处理的文件将非常大,我的测试文件为1.9gb,在第一次匹配后停止:

grep -n -m 1 str file | awk -F: '{print $1}'
您可以将
m
的参数值更改为其他值,以便在多次匹配后停止。
awk
部分仅用于获取行号

要在5场比赛后停止:

grep -n -m 5 str file | awk -F: '{print $1}'
编辑:

您可以使用
tail
进行此操作。例如,要跳过前5个匹配项并打印下7个:
grep-n-m12 str文件| tail-7 | awk-F:“{print$1}”

我不确定这是否快速,但这似乎有效:

nl -b a "<filename>" | grep "<phrase>" | awk '{ print $1 }'
nl-ba”“| grep”“| awk'{print$1}”

您可以使用
GNU awk
进行模式匹配,只需打印行号即可:

awk '/regex/ { print NR }' file.txt
假设值以空格分隔,如果行包含小于10的数字,则可以找到行号:

awk '{ for (i=1; i<=NF; i++) if ($i <= 10) print NR }' file.txt
编辑:


在上面的最后三个
awk
命令中,只需更改
如果($i=11&&$i我认为KingsIndian使用grep的
-m
选项是正确的,但是如果速度是您的主要目标,
cut
可能比
awk
更快。尝试:

grep -n -m 1 regex file | cut -d: -f1

-d:
参数告诉cut使用冒号作为字段分隔符,而
-f1
参数告诉cut只输出第一个字段。

我刚刚用一个非工作sed调用进行了一些测试,运气不好,但这里的数字带有1G字节的文本文件,其中我的$模式是最后一行的一部分:

(扰流器:grep在此操作中的速度快5倍以上,awk最慢)

user@box:~$ls-lh/dev/shm/test -rw-r--r--1用户979M 7月8日09:50/dev/shm/test user@box:~$sed——版本|头-n1 GNU sed版本4.2.1 user@box:~$time sed-n/$PATTERN/{=;q}”/dev/shm/test 206558 实际0m6.835s 用户0m6.160s 系统0m0.648s user@box:~$grep-V |头-n1 grep(GNU grep)2.14 user@box:~$time grep-n-m1“$PATTERN”/dev/shm/test | cut-d:-f1 206558 实0m1.337s 用户0.592s 系统0m0.736s user@box:~$awk——版本|头-n1 GNU Awk 4.0.1 user@box:~$time awk/$PATTERN/{print NR}”/dev/shm/test 206558 实际0.7.176秒 用户0m6.356s 系统0m0.776s
这是可行的,但我知道不用nl,你可以使用grep-n来获得带有行号的输出,-m是很酷的,你知道有没有办法跳过前几个结果,然后打印下一个5并退出。这是我在这个项目中需要的东西,但也只是暂时输出所有的东西。那就是真的很酷。我从来没有这样想过。你知道在我们要求它做的事情中,是否有比awk更快的事情,或者仅仅返回grep is-不比强迫awk循环结果集更快的事情。@WojonsTech grep在匹配方面比大多数工具都非常有效,而且它仅限于第一个
m
匹配s、 只有来自grep的有限匹配集被传递给awk。因此它应该更快。这不完全是我想要的,但似乎是使用awk@WojonsTech:请准确地更新您的问题。据我所知,您希望搜索一些正则表达式并打印行号和/或t他使用了匹配的行。也许我不清楚后者。在本例中,请尝试:
awk'/regex/{print NR,$0}'file.txt
.HTH.我也在寻找最简单的系统使用方法。我见过人们使用grep和cut的东西,它运行得非常快。我不知道awk是如何叠加的,但我确实看到了它的工作原理,但它是限制结果的最佳方法吗?@WojonsTech:你是什么意思“正在寻找限制结果的最佳方法”?当你使用mysql时,你可以在limit cluase中进行skip和limit操作。在前10个结果之后,我想要10个结果。因此显示结果11-20这与其他结果一样,但在平均几百毫秒的时间内运行得更快。我猜如果我需要跳过一些,我会执行grep-n-m10 regex文件| tail-5 | cut-d:-F1使用剪切时,如何指定制表符作为分隔符?默认情况下,剪切使用制表符作为分隔符,因此只需删除-d:
awk '{ for (i=1; i<=NF; i++) if ($i <= 10) array[NR]++ } END { for (j in array) sorted[k++]=j+0; n = asort(sorted); for (j=1; j<=n; j++) print sorted[j] }' file.txt
grep -n -m 1 regex file | cut -d: -f1
user@box:~$ ls -lh /dev/shm/test -rw-r--r-- 1 user user 979M Jul 8 09:50 /dev/shm/test user@box:~$ sed --version | head -n1 GNU sed-Version 4.2.1 user@box:~$ time sed -n "/$PATTERN/{=;q}" /dev/shm/test 206558 real 0m6.835s user 0m6.160s sys 0m0.648s user@box:~$ grep -V | head -n1 grep (GNU grep) 2.14 user@box:~$ time grep -n -m 1 "$PATTERN" /dev/shm/test | cut -d: -f1 206558 real 0m1.337s user 0m0.592s sys 0m0.736s user@box:~$ awk --version | head -n1 GNU Awk 4.0.1 user@box:~$ time awk "/$PATTERN/ { print NR }" /dev/shm/test 206558 real 0m7.176s user 0m6.356s sys 0m0.776s