使用grep命令时如何获取行号

450

我正在使用递归的grep来查找文件中的字符串,所有匹配到的文件和包含该字符串的行都会在终端上打印出来。但是有没有可能也获取这些行的行号?

例如:目前我得到的是/var/www/file.php: $options = "this.target",但我想要得到的是/var/www/file.php: 1142 $options = "this.target";,其中1142是包含该字符串的行号。

我使用grep递归的语法是sudo grep -r 'pattern' '/var/www/file.php'

另外一个问题是,如何获取不等于某个模式的结果。比如说所有文件,但不包含特定的字符串?


2
-v 标志将显示不匹配的行(grep -v myText MyFile.txt)。 - bcarroll
7个回答

679
grep -n SEARCHTERM file1 file2 ...

1
我有另一个快速问题,我们如何获取不等于某个模式的结果。比如所有文件但不包含某个特定字符串的文件? - sai
5
如果您运行命令 'grep --help',它将显示所有选项。其中一个选项是命令行开关'-v'。 - Miro A.
58
如果您指定多个文件,就不需要使用-r。只有在指定目录时才需要使用-r - Sparhawk
@JeanPaul - 我看到-nr和-n -r的结果是相同的。你使用的grep版本是什么?$ grep -n -r name * | wc -l 1984 $ grep -nr name * | wc -l 1984 $ grep -V grep (BSD grep) 2.5.1-FreeBSD - Miro A.
只回答代码,不解释。 :S - Itération 122442

184

使用grep -n命令可以打印出行号:

grep -n pattern file.txt

如果只想获取匹配行的行号,可以使用cut命令:

grep -n pattern file.txt | cut -d : -f 1

使用grep -v命令可以打印出不包含指定模式的行:

grep -v pattern file.txt

4
最后一个匹配行号:grep -n pattern file.txt | cut -d : -f 1 | tail -1 (你可以将其保存到变量中,然后使用它来从该行开始显示文件) - Nux
而要删除每个字符串开头的数字/冒号,您可以使用类似以下命令:grep -n pattern file.txt | sed 's/^[0-9][0-9]*://' - leetbacoon

31

如果你只想要行号,可以这样做:

grep -n Pattern file.ext | gawk '{print $1}' FS=":"

例子:

$ grep -n 9780545460262 EXT20130410.txt | gawk '{print $1}' FS=":" 
48793
52285
54023

5
awk -F: '{print $1}' 也可以使用,而且在对文件使用 grep 时不需要 -r(只有目录可以进行递归搜索)。 - Stuart Cardall
2
如何将 awk '{print $1}' FS=":" 的结果分离并保存到变量中以供未来操作? - Yohan W. Dunon

13
grep -A20 -B20 pattern file.txt

搜索模式并显示模式前后20行


14
这完全不是所要求的内容。 - Jonathon Reinhart
6
另外,如果需要的话,"-C20" 是一个更短的版本。 - Marty Neal
1
让我们面对现实吧 - 对于我们中的许多人来说,这是一个绝佳的答案,当我们在筛选日志文件时在这里搜索谷歌。 - Igand
@JonathonReinhart 这可能不完全是 OP 要求的,但 觉得它非常有用,并且我鼓励回答这种类型问题的人继续添加这样的小提示。 - Howard Lee Harkness

2

grep -nr "搜索字符串" 目录

这将给出包含行号的行。


2
为了显示带有行号的结果,您可以尝试以下操作:
grep -nr "word to search for" /path/to/file/file 

结果应该类似于这样:
linenumber: other data "word to search for" other data

0

当使用vim时,您可以放置

function grepn() {
    grep -n $@ /dev/null | awk -F $':' '{t = $1; $1 = $2; $2 = t; print; }' OFS=$':' | sed 's/^/vim +/' | sed '/:/s// /' | sed '/:/s// : /'
}

在你的 .bashrc 文件中添加以下内容:
grepn SEARCHTERM file1 file2 ...
这将返回以下结果:
vim +123 file1 : xxxxxxSEARCHTERMxxxxxxxxxx
vim +234 file2 : xxxxxxSEARCHTERMxxxxxxxxxx

现在,您可以通过将代码 vim +123 file1 复制到您的 Shell 中来打开相应行号(例如第 123 行)的 Vim。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接