使用grep仅报告行号

时间:2011-08-05 15:33:05

标签: grep

我有一个可能包含错误格式的文件(在这种情况下,模式\\backslash的出现)。我想使用grep仅返回发生这种情况的行号(如同,匹配在这里,转到第x行并修复它)。

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

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

8 个答案:

答案 0 :(得分:132)

尝试:

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

答案 1 :(得分:38)

如果您愿意使用AWK:

awk '/textstring/ {print FNR}' textfile

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

答案 2 :(得分:21)

所有这些答案都需要grep来生成整个匹配行,然后将其传递给另一个程序。如果您的行非常长,那么使用sed输出行号可能更有效:

sed -n '/pattern/=' filename

答案 3 :(得分:2)

Bash版

    lineno=$(grep -n "pattern" filename)
    lineno=${lineno%%:*}

答案 4 :(得分:1)

你想要冒号后面的第二个字段,而不是第一个字段。

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

答案 5 :(得分:0)

计算与模式匹配的行数:

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

提取匹配的模式

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

显示匹配模式的行号

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

答案 6 :(得分:0)

我推荐sedawk的答案来获取行号,而不是使用grep来获取整个匹配行,然后使用{{从输出中删除它1}}或其他工具。为了完整起见,您还可以使用Perl:

cut

或Ruby:

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

答案 7 :(得分:0)

仅使用 grep

grep -n "text to find" file.ext | grep -Po '^[^:]+'