如何打印匹配后直到文件末尾的所有行?

如何打印匹配后直到文件末尾的所有行?

输入文件1是:

dog 123 4335
cat 13123 23424 
deer 2131 213132
bear 2313 21313

我为匹配提供了来自 in 的模式other file(如dog 123 4335来自 file2 的模式)。

我匹配该行的模式dog 123 4335,在打印没有匹配行的所有行后,我的输出是:

cat 13123 23424
deer 2131 213132
bear 2313 21313

如果只使用不带地址的行只使用模式,例如1s 如何匹配和打印行?

答案1

在实践中,我可能会使用Aet3miirah 的回答大多数时候,并且阿列克谢的回答非常适合在线路中导航(而且,它可以与 一起使用less)。 OTOH,我真的很喜欢另一种方法(这是一种相反的方法)吉尔斯的回答):

sed -n '/dog 123 4335/,$p'

当使用该-n标志调用时,sed默认情况下不再打印它处理的行。然后我们使用 2 地址形式,表示从匹配的行开始应用命令,/dog 123 4335/直到文件末尾(由 表示$)。有问题的命令是p,它打印当前行。因此,这意味着“打印从匹配的行/dog 123 4335/到末尾的所有行”。

答案2

如果您有一个相当短的文件grep可能会起作用:

grep -A5000 -m1 -e 'dog 123 4335' animals.txt

5000 只是我对“相当短”的猜测,因为grep找到第一个匹配并将其与接下来的 5000 行一起输出(文件不需要那么多)。如果您不想要比赛本身,则需要将其剪掉,例如

grep -A5000 -m1 -e 'dog 123 4335' animals.txt | tail -n+2


如果您不希望第一个匹配项而是最后一个匹配项作为分隔符,您可以使用以下命令:

tac animals.txt | sed -e '/dog 123 4335/q' | tac

该行animals.txt以与行相反的顺序读取并输出直到并包括 的行dog 123 4335,然后再次反转以恢复正确的顺序。

同样,如果您不需要结果中的匹配项,请附加 tail。 (您还可以使 sed 表达式复杂化,以便在退出之前丢弃其缓冲区。)

答案3

假设您想将整行与您的模式匹配,使用 GNU sed,这有效:

sed -n '/^dog 123 4335$/ { :a; n; p; ba; }' infile

标准等效:

sed -ne '/^dog 123 4335$/{:a' -e 'n;p;ba' -e '}' infile

输入以下内容 ( infile):

cat 13123 23424 
deer 2131 213132
bear 2313 21313
dog 123 4335
cat 13123 23424 
deer 2131 213132
bear 2313 21313

输出是:

cat 13123 23424 
deer 2131 213132
bear 2313 21313

解释:

  • /^dog 123 4335$/搜索所需的模式。
  • :a; n; p; ba;n是一个循环,它从输入 ( )中获取新行,打印它 ( p),然后分支回标签 a :a; ...; ba;

更新

这是一个更接近您需求的答案,即 file2 中的模式,来自 file1 的 grep :

tail -n +$(( 1 + $(grep -m1 -n -f file2 file1 | cut -d: -f1) )) file1

嵌入的 grep 和 cut 找到包含 file2 中模式的第一行,该行号加一被传递到 tail,加一是为了跳过具有模式的行。

如果你想从最后一场比赛而不是第一场比赛开始,那就是:

tail -n +$(( 1 + $(grep -n -f file2 file1 | tail -n1 | cut -d: -f1) )) file1

请注意,并非所有版本的 tail 都支持加号。

答案4

$ more +/"dog 123 4335" file1

相关内容