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

时间:2010-05-26 15:10:00

标签: command-line grep

我经常会grep -n whatev文件找到我正在寻找的东西。说输出是

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

如果我想在1234和5555之间提取线条,是否有工具可以做到这一点?对于静态文件,我有一个脚本,它执行文件的wc -l,然后进行数学计算,将其与tail&但是对于不断写入的日志文件来说,这并不能很好地解决这个问题。

6 个答案:

答案 0 :(得分:71)

尝试使用上面提到的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是一个很棒的工具。)

答案 1 :(得分:23)

以下命令将执行您要求的操作"提取1234和5555之间的行"在 someFile

sed -n '1234,5555p' someFile

答案 2 :(得分:5)

如果我理解正确,您希望在两个行号之间找到一个模式。 awk单行可能是

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

您无需运行grep,然后sed

Perl one-liner:

perl -ne 'if (/whatev/ && $. >= 1234 && $. <= 5555') {print}' file

答案 3 :(得分:2)

如果您可以保证所需的位置,则行号可以。多年来,我最喜欢的一个是这样的:

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

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

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

答案 4 :(得分:0)

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

#!/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. 文件路径
  4. 要与您的示例一起使用,请使用参数:1234 5555 myfile.txt

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

答案 5 :(得分:0)

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

perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd