【问题标题】:Get line number while using grep使用 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)

标签: grep line


【解决方案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 到你的外壳。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-28
        • 2011-03-01
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 2014-03-28
        • 2011-01-17
        相关资源
        最近更新 更多