使用 grep 时获取行号

Posted

技术标签:

【中文标题】使用 grep 时获取行号【英文标题】:Get line number while using grep 【发布时间】:2011-03-13 22:15:23 【问题描述】:

我正在使用 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'

还有一个问题是,我们如何获得不等于模式的结果。像所有文件一样,但不是具有特定字符串的文件?

【问题讨论】:

-v 标志将显示不匹配的行 (grep -v myText MyFile.txt) 【参考方案1】:
grep -n SEARCHTERM file1 file2 ...

【讨论】:

我还有一个小问题,我们如何获得不等于模式的结果。像所有文件一样,但不是具有特定字符串的文件? 那将是命令行开关 -v。如果您运行“grep --help”,它将显示所有选项 如果您指定多个文件,则不需要-r。如果你指定目录,你只需要-r @JeanPaul - 我看到 -nr 和 -n -r 的结果相同。你用的是什么版本的grep? $ grep -n -r 名称 * | wc -l 1984 $ grep -nr 名称 * | wc -l 1984 $ grep -V grep (BSD grep) 2.5.1-FreeBSD 代码只回答,不解释。 :S【参考方案2】:

行号用grep -n打印:

grep -n pattern file.txt

要仅获取行号(没有匹配行),可以使用cut

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

包含模式的行用grep -v打印:

grep -v pattern file.txt

【讨论】:

最后一个匹配的行号:grep -n pattern file.txt | cut -d : -f 1 | tail -1(你可以将它保存到一个变量中并使用它来例如从它的尾文件) 要删除每个字符串开头的数字/冒号,您可以使用类似:grep -n pattern file.txt | sed 's/^[0-9][0-9]*://'【参考方案3】:

如果您只想要行号,请执行以下操作:

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

例子:

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

【讨论】:

awk -F: 'print $1' 也可以,并且在文件上使用时不需要-r in grep(只能递归搜索目录) 如何分离awk 'print $1' FS=":" 结果并将它们保存在变量中以供将来操作?【参考方案4】:
grep -A20 -B20 pattern file.txt

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

【讨论】:

这根本不是我们想要的。 另外,如果需要,-C20 是一个较短的版本 让我们面对现实吧——这对我们中的许多人来说是一个很好的答案,他们在这里谷歌搜索日志文件:)【参考方案5】:

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

这会为您提供带有行号的行。

【讨论】:

【参考方案6】:

为了显示带有行号的结果,你可以试试这个

grep -nr "word to search for" /path/to/file/file 

结果应该是这样的:

linenumber: other data "word to search for" other data

【讨论】:

【参考方案7】:

使用 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

现在,您可以通过简单的复制打开对应行(例如第 123 行)的 vim vim +123 file1 到你的外壳。

【讨论】:

以上是关于使用 grep 时获取行号的主要内容,如果未能解决你的问题,请参考以下文章

如何格式化我的 grep 输出以在行尾显示行号以及命中数?

sh grep与行号

在 R 中使用 doParallel 时,如何获取引发错误的行号?

使用 System.Xml.XmlDocument 时是不是可以从 System.Xml.XmlNode 获取行号/位置?

C# - 调用异常时如何获取类名和行号

Logback输出行号