【问题标题】:Can I grep only the first n lines of a file?我可以只 grep 文件的前 n 行吗?
【发布时间】:2012-02-04 10:40:05
【问题描述】:

我的日志文件很长,是否可以让 grep 只搜索前 10 行?

【问题讨论】:

    标签: bash search grep


    【解决方案1】:

    管道的魔力;

    head -10 log.txt | grep <whatever>
    

    【讨论】:

    • 您还可以将任意流通过管道传输到headsomeCmd | head -10
    • Head 默认打印前 10 行到标准输出,所以这对 10 行有效head log.txt | grep &lt;whatever&gt;
    • 在使用 grep 的 -l 选项时有没有办法做到这一点?我想列出前 5 个字符为 RIFFD 的所有文件。
    【解决方案2】:

    对于在 Google 上找到此内容的人,我需要搜索多个文件的前 n 行,但只打印匹配的文件名。我用过

     gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames
    

    一旦看到 10 行,FNR..nextfile 就会停止处理文件。 //..{} 打印文件名并在给定文件中的第一个匹配项出现时继续前进。要引用文件名以方便其他程序,请使用

     gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames
    

    【讨论】:

    • 我是在 Google 上找到这个的人之一。谢谢!
    • 对我来说,这段代码打印出文件的完整路径。这正是我所需要的。 FNR=1 也只会搜索第一行。谢谢!
    • 在目录上递归执行此操作:find ./path -type -f -exec awk 'FNR&gt;10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
    • 谢谢@OrangeDog。一点更正:应该是-type f
    • 正是我要寻找的!
    【解决方案3】:

    或者对没有|的单个进程使用awk

    awk '/your_regexp/ && NR < 11' INPUTFILE
    

    在每一行上,如果your_regexp匹配,并且记录(行)数小于11,则执行默认操作(即打印输入行)。

    或使用sed:

    sed -n '/your_regexp/p;10q' INPUTFILE 
    

    检查您的正则表达式并打印该行(-n 表示不打印输入,否则为默认值),并在第 10 行之后立即退出。

    【讨论】:

    • 为什么不在10号退出呢? (见 sed 解决方案)
    • awk '{ if ( NR &lt;= 10 ) { if(index($0,"ab") &gt; 0) { print $0; } } else { exit; } }' textfile -- 更快。
    • @potong 你是对的,已更正。 @srikanthradix 虽然它可以更快,但您的解决方案不是搜索正则表达式,而是仅搜索固定字符串。 awk '{ if ( NR &lt;= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfile 会。
    • 加上样式不是awkish2xifs1xelse 在不需要任何操作语句的命令中会产生 aho。 weinberger 和 kernighan 哭了……
    • 我认为,使用 FNR 代替 NR 会更好,因为如果您对多个文件使用 awk,则每个文件的 FNR 从 0 开始。
    【解决方案4】:

    除了grep 之外,您还有一些使用程序的选项。我认为最简单的是使用head

    head -n10 filename | grep ...
    

    head 将输出前 10 行(使用 -n 选项),然后您可以将该输出通过管道传输到 grep

    【讨论】:

    • 我什至没有意识到,这里使用head 的所有解决方案都使用了-n 10 (包括我) 没有意识到head 默认 显示仅 10 行。 :)
    【解决方案5】:
    grep "pattern" <(head -n 10 filename)
    

    【讨论】:

      【解决方案6】:

      您可以使用以下行:

      head -n 10 /path/to/file | grep [...]
      

      【讨论】:

        【解决方案7】:

        head -10 file 的输出可以通过管道传输到grep 以完成此操作:

        head -10 file | grep …
        

        使用 Perl:

        perl -ne 'last if $. > 10; print if /pattern/' file
        

        【讨论】:

          【解决方案8】:

          对 Joachim Isaksson 的回答的扩展:我经常需要一个长文件中间的一些东西,例如第 5001 到 5020 行,在这种情况下,您可以将 headtail 结合使用:

          head -5020 file.txt | tail -20 | grep x
          

          这会获取前 5020 行,然后只显示最后 20 行,然后将所有内容通过管道传输到 grep。

          (已编辑:我的示例编号中的 fencepost 错误,将管道添加到 grep)

          【讨论】:

            【解决方案9】:
            head -10 log.txt | grep -A 2 -B 2 pattern_to_search
            

            -A 2:在模式前打印两行。

            -B 2:在模式后打印两行。

            head -10 log.txt # read the first 10 lines of the file.
            

            【讨论】:

            • 如果我记得,-C 2 会和-A 2 -B 2 做同样的事情
            【解决方案10】:

            grep -A 10

            这是抓取模式和模式之后的下 10 行。这仅适用于已知模式,如果您没有已知模式,请使用“head”建议。

            【讨论】:

            • 虽然可能是对的。添加更多问题描述,使答案更全面。
            • 这回答了一个完全不同的问题,在这种情况下没有用。
            【解决方案11】:
            grep -m6 "string" cov.txt
            

            这只会在前 6 行搜索string

            【讨论】:

            • 不,这将在整个 cov.txt 文件中为您提供前 6 次出现的“字符串”
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-04
            • 2016-12-25
            相关资源
            最近更新 更多