输入文件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