使用grep报告仅行号


105

我有一个文件,其中可能包含格式错误(在这种情况下,是模式的出现\\backslash)。我想grep只返回发生这种情况的行号(例如,匹配在这里,转到行#x并进行修复)。

但是,似乎没有办法打印行号(grep -n),而不是匹配项或行本身。

我可以使用另一个正则表达式来提取行号,但是我想确保grep不能单独执行。grep -no我认为最接近,但仍显示匹配项。


1
对我来说最有用的答案是这样的问题:grep -no!这就是我来这里尝试做的事情!(即,不打印有时会很长的行,例如,缩小的javascript源文件。)
LondonRob 2015年

Answers:


155

尝试:

grep -n "text to find" file.ext | cut -f1 -d:

1
在我的机器上,这仅打印不带行号的匹配文件(因此,如果我在文件中有3个匹配项,则仅打印一次),这仍然非常有用...
Mario Awad 2012年

3
@MarioAwad,您应该操纵-f参数。对我来说是-f2。(知道这是旧东西,但我认为它可以帮助一些可怜的人)
EmilSierżęga2013年

感谢您使用可爱的旧的unix adhoc shell脚本。这表明灵活的工具值得其复杂性和学习曲线!
亚历克斯

12
grep -n "text to find" file.ext | cut -f1,2 -d:显示文件名和行号。
2014年

2
@jondim仅在搜索多个文件时才显示文件名;您需要添加-H以强制在只有一个文件时显示文件名。相反,-h无论您要抓取多少文件,都可以始终告诉它不输出文件名。
马克·里德

45

如果您愿意使用AWK:

awk '/textstring/ {print FNR}' textfile

在这种情况下,FNR是行号。当您查看grep | cut或任何时候想要获取grep输出并对其进行操作时,AWK是一个很好的工具。


2
使用一个过程(在过去更重要,但仍然很重要),并且足够容易地被awk初学者理解!
bgStack15 '16

NR在这种情况下,当仅检查一个文件时,效果也很好。
马克·里德

简直太棒了!太快了!
GTodorov

34

所有这些答案都需要grep生成整个匹配行,然后将其通过管道传输到另一个程序。如果您的行很长,那么使用sed输出行号可能会更有效:

sed -n '/pattern/=' filename


1

我建议使用sed和的答案,awk仅用于获取行号,而不是grep用于获取整个匹配行,然后使用cut或其他工具将其从输出中删除。为了完整起见,您还可以使用Perl:

perl -nE '/pattern/ && say $.' filename

或Ruby:

ruby -ne 'puts $. if /pattern/' filename

0

您将需要冒号之后的第二个字段,而不是第一个。

grep -n "text to find" file.txt | cut -f2 -d:


如果您要匹配文本,则此方法有效,但在这种情况下,行号是OP要求的。
AJP

0

要计算与模式匹配的行数:

grep -n "Pattern" in_file.ext | wc -l 

提取匹配的图案

sed -n '/pattern/p' file.est

显示匹配模式的行号

grep -n "pattern" file.ext | cut -f1 -d:

2
第一个应该只是“ grep -c'Pattern'in_file.ext”。第二个应该是“ grep -o'Pattern'in_file.ext”。无需涉及sed或wc。
thelogix

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.