我正在使用 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'
还有一个问题是,我们如何获得不等于模式的结果。像所有文件一样,但不是具有特定字符串的文件?
grep -n SEARCHTERM file1 file2 ...
行号用 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]*://'
如果您只想要行号,请执行以下操作:
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}'
也有效用于文件时不需要 grep
中的 -r
(只能递归搜索目录)
awk '{print $1}' FS=":"
结果并将它们保存在变量中以供将来操作?
grep -A20 -B20 pattern file.txt
搜索模式并在模式前后显示 20 行
-C20
是一个较短的版本
grep -nr "搜索字符串" 目录
这为您提供了带有行号的行。
为了显示带有行号的结果,您可以试试这个
grep -nr "word to search for" /path/to/file/file
结果应该是这样的:
linenumber: other data "word to search for" other data
使用 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 文件 1 文件 2 ...
结果是
vim +123 file1 : xxxxxxSEARCHTERMxxxxxxxxxx
vim +234 file2 : xxxxxxSEARCHTERMxxxxxxxxxx
现在,您可以通过简单地将 vim +123 file1
复制到您的 shell 来打开对应行(例如第 123 行)上的 vim。
-r
。如果您指定目录,则只需要-r
。