【问题标题】:Use grep to report back only line numbers使用 grep 仅报告行号
【发布时间】:2011-08-05 15:33:04
【问题描述】:

我有一个可能包含错误格式的文件(在这种情况下,出现了\\backslash 模式)。我想使用grep 只返回发生这种情况的行号(例如,匹配在这里,转到第 x 行并修复它)。

但是,似乎没有办法打印行号 (grep -n) 而不是匹配项或行本身。

我可以使用另一个正则表达式来提取行号,但我想确保 grep 不能自己完成。 grep -no 最接近,我认为,但仍显示匹配。

【问题讨论】:

  • 对我来说最有用的答案是:grep -no!这就是我来这里尝试做的! (即不打印有时很长的行,例如缩小的 javascript 源文件。)

标签: grep


【解决方案1】:

尝试:

grep -n "text to find" file.ext | cut -f1 -d:

【讨论】:

  • 在我的机器上,这只是打印没有行号的匹配文件(所以如果我在一个文件中有 3 个匹配项,它只打印一次),这仍然非常有用......
  • @MarioAwad,您应该操作 -f 参数。对我来说是-f2。 (知道这是旧东西,但我认为它可以帮助一些可怜的人)
  • 感谢可爱的老式 unix adhoc shell 脚本。这表明灵活的工具值得它们的复杂性和学习曲线!
  • grep -n "text to find" file.ext | cut -f1,2 -d: 显示文件名和行号。
  • @jondim 仅在搜索多个文件时才显示文件名;您需要添加-H 以强制它在只有一个文件时显示文件名。相反,您始终可以使用-h 告诉它无论您正在搜索多少个文件都不要输出文件名。
【解决方案2】:

如果您愿意使用 AWK:

awk '/textstring/ {print FNR}' textfile

在这种情况下,FNR 是行号。当您查看 grep|cut 或者您希望获取 grep 输出并对其进行操作时,AWK 是一个很好的工具。

【讨论】:

  • 使用一个进程(这在过去更重要,但仍然如此),并且对于 awk 初学者来说很容易理解!
  • 当只检查一个文件时,NR 也能正常工作,例如本例。
  • 简直太棒了!好快啊!
【解决方案3】:

所有这些答案都需要 grep 生成整个匹配行,然后将其通过管道传输到另一个程序。如果您的行很长,使用 sed 输出行号可能更有效:

sed -n '/pattern/=' filename

【讨论】:

    【解决方案4】:

    我建议使用sedawk 的答案来获取行号,而不是使用grep 获取整个匹配行,然后使用cut 或其他工具从输出中删除它。为了完整起见,您还可以使用 Perl:

    perl -nE '/pattern/ && say $.' filename
    

    或红宝石:

    ruby -ne 'puts $. if /pattern/' filename
    

    【讨论】:

      【解决方案5】:

      您需要冒号后面的第二个字段,而不是第一个。

      grep -n "text to find" file.txt | cut -f2 -d:

      【讨论】:

      • 如果您想匹配文本,这可以工作,但在这种情况下,行号是 OP 所要求的。
      【解决方案6】:

      Bash 版本

          lineno=$(grep -n "pattern" filename)
          lineno=${lineno%%:*}
      

      【讨论】:

      • 如果不止一行匹配该模式会发生什么?
      • @izabera 添加 |尾巴 -1
      【解决方案7】:

      统计匹配模式的行数:

      grep -n "Pattern" in_file.ext | wc -l 
      

      提取匹配模式

      sed -n '/pattern/p' file.est
      

      显示匹配模式的行号

      grep -n "pattern" file.ext | cut -f1 -d:
      

      【讨论】:

      • 第一个应该只是“grep -c 'Pattern' in_file.ext”。第二个应该是“grep -o 'Pattern' in_file.ext”。无需涉及 sed 或 wc。
      【解决方案8】:

      仅使用 grep

      grep -n "text to find" file.ext | grep -Po '^[^:]+'

      【讨论】:

        猜你喜欢
        • 2016-11-11
        • 1970-01-01
        • 1970-01-01
        • 2015-07-22
        • 2011-09-17
        • 2011-03-13
        • 1970-01-01
        • 2019-04-08
        • 2019-04-23
        相关资源
        最近更新 更多