代码之家  ›  专栏  ›  技术社区  ›  mik

如何“grep”出文件的特定行范围

  •  44
  • mik  · 技术社区  · 14 年前

    有时我会用grep-n-whatev文件来查找我要查找的内容。假设输出是

    1234: whatev 1
    5555: whatev 2
    6643: whatev 3
    

    如果我想提取1234和5555之间的行,有没有一个工具可以做到这一点?对于静态文件,我有一个脚本可以对文件执行wc-l操作,然后用t a i l&head对其进行数学分解,但对于不断被写入的日志文件,这个脚本的效果并不理想。

    6 回复  |  直到 6 年前
        1
  •  66
  •   Scorchio    14 年前

    尝试使用上面提到的SED http://linuxcommando.blogspot.com/2008/03/using-sed-to-extract-lines-in-text-file.html . 例如使用

    sed '2,4!d' somefile.txt
    

    从somefile.txt的第二行打印到第四行。(别忘了检查一下 http://www.grymoire.com/Unix/Sed.html ,SED是一个很好的工具。)

        2
  •  21
  •   javaPlease42    7 年前

    下面的命令将执行您在中要求的“提取1234和5555之间的行” 一些文件 .

    sed -n '1234,5555p' someFile

        3
  •  5
  •   Mark Lakata    8 年前

    如果我理解正确,您需要在两个行号之间找到一个模式。一号锥子衬里可以是

    awk '/whatev/ && NR >= 1234 && NR <= 5555' file
    

    你不需要跑 grep 然后 sed .

    Perl一个班轮:

    perl -ne 'if (/whatev/ && $. >= 1234 && $. <= 5555') {print}' file
    
        4
  •  1
  •   psbrightly    6 年前

    如果你能保证你想要的东西的位置,行号就可以了。多年来,我最喜欢的口味是:

    sed "/First Line of Text/,/Last Line of Text/d" filename
    

    这将删除从第一个匹配行到最后一个匹配行的所有行,包括这些行。

    使用SED -N 用“ “而不是” D “打印这些行。对我来说更有用,因为我通常不知道这些行在哪里。

        5
  •  0
  •   dagelf    8 年前

    如果您想要行而不是行范围,可以使用perl:例如,如果您想从文件中获取行1、3和5,请说/etc/passwd:

    perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd
    
        6
  •  0
  •   Janus Troelsen    8 年前

    将其放入文件中并使其可执行:

    #!/bin/bash
    start=`grep -n $1 < $3 | head -n1 | cut -d: -f1; exit ${PIPESTATUS[0]}`
    if [ ${PIPESTATUS[0]} -ne 0 ]; then
        echo "couldn't find start pattern!" 1>&2
        exit 1
    fi
    stop=`tail -n +$start < $3 | grep -n $2 | head -n1 | cut -d: -f1; exit ${PIPESTATUS[1]}`
    if [ ${PIPESTATUS[0]} -ne 0 ]; then
        echo "couldn't find end pattern!" 1>&2
        exit 1
    fi
    
    stop=$(( $stop + $start - 1))
    
    sed "$start,$stop!d" < $3
    

    使用参数执行文件(请注意,脚本不处理参数中的空格!):

    1. 启动grep模式
    2. 停止grep模式
    3. 文件路径

    要与示例一起使用,请使用参数: 1234 5555 myfile.txt

    包括具有开始和停止模式的线条。