我有一个可能包含错误格式的文件(在这种情况下,模式 \\backslash 的出现) . 我想使用 grep 只返回发生这种情况的行号(如同,匹配在这里,转到第x行并修复它) .
\\backslash
grep
但是,似乎没有办法打印行号( grep -n )而不是匹配或行本身 .
grep -n
我可以使用另一个正则表达式来提取行号,但我想确保grep不能单独执行 . 我认为 grep -no 最接近,但仍显示匹配 .
grep -no
试试这个:
grep -n "text to find" file.ext |cut -f1 -d:
如果您愿意使用AWK:
awk '/textstring/ {print FNR}' textfile
在这种情况下,FNR是行号 . 当您查看grep | cut时,或任何想要获取grep输出并操作它的时候,AWK都是一个很棒的工具 .
所有这些答案都需要grep来生成整个匹配行,然后将其传递给另一个程序 . 如果你的线很长,那么使用sed来输出线号可能更有效:
sed -n '/pattern/=' filename
Bash版本
lineno=$(grep -n "pattern" filename) lineno=${lineno%%:*}
你会想要冒号之后的第二个字段,而不是第一个字段 .
grep -n "text to find" file.txt | cut -f2 -d:
要计算与模式匹配的行数:
grep -n "Pattern" in_file.ext | wc -l
提取匹配的模式
sed -n '/pattern/p' file.est
显示匹配模式的行号
grep -n "pattern" file.ext | cut -f1 -d:
我建议使用 sed 和 awk 来获取行号,而不是使用 grep 来获取整个匹配行,然后使用 cut 或其他工具从输出中删除它 . 为完整起见,您还可以使用Perl:
sed
awk
cut
perl -nE '/pattern/ && say $.' filename
或者Ruby:
ruby -ne 'puts $. if /pattern/' filename
仅使用 grep :
grep -n "text to find" file.ext | grep -Po '^[^:]+'
8 回答
试试这个:
如果您愿意使用AWK:
在这种情况下,FNR是行号 . 当您查看grep | cut时,或任何想要获取grep输出并操作它的时候,AWK都是一个很棒的工具 .
所有这些答案都需要grep来生成整个匹配行,然后将其传递给另一个程序 . 如果你的线很长,那么使用sed来输出线号可能更有效:
Bash版本
你会想要冒号之后的第二个字段,而不是第一个字段 .
grep -n "text to find" file.txt | cut -f2 -d:
要计算与模式匹配的行数:
提取匹配的模式
显示匹配模式的行号
我建议使用
sed
和awk
来获取行号,而不是使用grep
来获取整个匹配行,然后使用cut
或其他工具从输出中删除它 . 为完整起见,您还可以使用Perl:或者Ruby:
仅使用 grep :
grep -n "text to find" file.ext | grep -Po '^[^:]+'