【问题标题】:How to grep a string after a specified line number?如何在指定的行号之后grep字符串?
【发布时间】:2012-10-18 01:21:06
【问题描述】:

我有一个大文本文件,我想在这个文本文件中查看包含"time spent" 的行,我使用:

grep -in "time spent" myfile.txt

但我只对 50000 之后的行感兴趣。在输出中,我想查看 50000 之后的行并且包含“花费的时间”。有没有办法做到这一点?

【问题讨论】:

    标签: linux string search grep


    【解决方案1】:

    你可以tail它,然后grep:

    tail -n +50000 myfile.txt | grep -in "time spent"
    

    【讨论】:

    • 这行不通,因为它弄乱了行号
    • 注意“+”号。它接缝没用,但它意味着除了tail -n 50000之外的东西,它意味着:tail从第50000行开始iso the lat 50000 lines
    【解决方案2】:

    任意 2 个行号之间的 grepping 答案:

    Using sed and grep:
    
    sed -n '1,50000p' someFile | grep < your_string >
    

    【讨论】:

      【解决方案3】:

      您也可以使用sedsed 可以用来模仿 grep 像这样:

      sed -n 's/pattern/&amp;/p'

      默认情况下sed 打印每一行,即使没有发生替换。 -n/p 的组合使 sed 仅打印发生替换的行。最后,我们将pattern 替换为&amp;,即自行替换pattern。结果:我们只是模仿了grep

      现在sed 可以采取一系列行动。在你的情况下:

      sed -n '50000,$s/time spent/&amp;/p' myfile.txt

      指定范围的格式如下:start,end 我们只是指示 sed 从第 50000 行工作到 $,这意味着最后一行。

      【讨论】:

      • 接受的答案是正确的。请注意,tail -n +2(从第 2 行开始的所有行)与 tail -n 2(仅最后 2 行)非常不同。
      • 是的,我没听懂。很高兴知道,谢谢指出
      • 我确实喜欢 sed 方法。只需要一个程序,不需要管道。
      【解决方案4】:

      您可以使用head + grep 并将命令与{...} 组合在一起,以便它们共享相同的输入:

      { head -n 50000 >/dev/null; grep -i PATTERN; } < infile
      

      head 不消耗整个输入,它只获取前 50000 行并将它们转储到/dev/null;其余行由grep处理。
      如果您需要前面的行号(例如grep -in),您可以使用awk

      awk 'NR>50000 && tolower($0)~/PATTERN/{print NR ": " $0}' infile
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-19
        • 1970-01-01
        • 2016-05-12
        • 2019-08-19
        • 2016-04-27
        • 2022-11-23
        • 1970-01-01
        • 2020-04-27
        相关资源
        最近更新 更多