Command line 如何";grep“;输出文件的特定行范围

Command line 如何";grep“;输出文件的特定行范围,command-line,grep,Command Line,Grep,有很多次我会grep-n whatev文件来找到我要找的东西。假设输出是 1234: whatev 1 5555: whatev 2 6643: whatev 3 如果我想只提取1234和5555之间的线,有没有工具可以这样做?对于静态文件,我有一个脚本,它对文件进行wc-l处理,然后用tail和head对其进行数学分割,但对于不断写入的日志文件来说效果不太好。尝试使用上提到的sed . 例如使用 sed '2,4!d' somefile.txt 从somefile.txt的第二行打印到第四

有很多次我会grep-n whatev文件来找到我要找的东西。假设输出是

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

如果我想只提取1234和5555之间的线,有没有工具可以这样做?对于静态文件,我有一个脚本,它对文件进行wc-l处理,然后用tail和head对其进行数学分割,但对于不断写入的日志文件来说效果不太好。

尝试使用上提到的sed . 例如使用

sed '2,4!d' somefile.txt

从somefile.txt的第二行打印到第四行。(别忘了检查,sed是一个很棒的工具。)

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

#!/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
#/bin/bash
开始=`grep-n$1<$3 | head-n1 | cut-d:-f1;退出${PIPESTATUS[0]}`
如果[${PIPESTATUS[0]}-ne 0];然后
echo“找不到开始模式!”1>&2
出口1
fi
stop=`tail-n+$start<$3 | grep-n$2 | head-n1 | cut-d:-f1;退出${PIPESTATUS[1]}`
如果[${PIPESTATUS[0]}-ne 0];然后
echo“找不到结束模式!”1>&2
出口1
fi
停止=$($stop+$start-1))
sed“$start,$stop!d”<$3
使用参数执行文件(请注意,脚本不处理参数中的空格!):

  • 启动grep模式
  • 停止grep模式
  • 文件路径
  • 要与示例一起使用,请使用参数:
    1234 5555 myfile.txt


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

    以下命令将执行您在someFile中要求的“提取1234和5555之间的行”


    sed-n'12345555p'someFile

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

    perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd
    
    perl-e'while(){if(+$l~[1,3,5]){print}'
    如果我理解正确,您希望在两个行号之间找到一个模式。awk一号班轮可能是

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

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

    sed "/First Line of Text/,/Last Line of Text/d" filename
    
    它删除从第一个匹配行到最后一个匹配行的所有行,包括这些行


    使用sed-n和“p”代替“d”来打印这些行。这对我来说更有用,因为我通常不知道这些行在哪里。

    请参阅参考资料,
    $l
    是“一美元”而不是“一美元”。一个更高级(即更短)的命令是
    perl-ne'if($.~[1,3,5]){print}/etc/passwd
    。我必须添加
    /
    分隔符才能工作:
    sed-n'/1234/,/5555/p'一些文件
    非常方便:)+1小东西,但是你不需要我一直在寻找的最佳和完美的报价。一个有用的后续信息是如何在sed结果中预先添加行号。。。将其导入nl,如下所示:
    sed“$start”、“$end”!d'somefile.txt | nl-ba-v$start
    sed "/First Line of Text/,/Last Line of Text/d" filename