使用 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 时获取行号的主要内容,如果未能解决你的问题,请参考以下文章
在 R 中使用 doParallel 时,如何获取引发错误的行号?
使用 System.Xml.XmlDocument 时是不是可以从 System.Xml.XmlNode 获取行号/位置?