![在 bash 中第 n 次出现后打印几行](https://linux22.com/image/78639/%E5%9C%A8%20bash%20%E4%B8%AD%E7%AC%AC%20n%20%E6%AC%A1%E5%87%BA%E7%8E%B0%E5%90%8E%E6%89%93%E5%8D%B0%E5%87%A0%E8%A1%8C.png)
我正在寻找一种方法来搜索模式的第 n 次出现并在模式后打印 k 行。我想awk
会比grep
这种情况更好,但我不知道如何正确地做到这一点......
假设我有以下文本文件:
Draft
blablablabla
tralalalalala
Draft
blablablabla
tralalalalala
Draft
important line 1
important line 2
Draft
blablablabla
tralalalalala
在本例中n=3
,k=2
我想打印模式“Draft”第 3 次出现后的 2 行。在我的具体情况下,n 和 k 可能会有所不同。
这是一个简单的方法吗?
答案1
答案2
awk:打印第三行和第四行“草稿”之间的行。
awk -v n=3 '/Draft/ { p = (++num == n) ; next }; p' file
有一个优化要做:看到第四稿时退出。
答案3
您可以使用grep
和tail
来实现此目的:
$ n=3
$ k=2
$ grep -m "$n" -A "$k" 'Draft' input.txt | tail -n "$k"
important line 1
important line 2
$
grep 的选项-m "$n"
指定在第 次匹配后停止n
,并告诉 grep在每次匹配后-A "$k"
输出行。k
然后我们通过管道将tail -b "$k"
其仅输出这些k
行。
答案4
sed -ne'/^\(.*\n\)*Draft *$/G' \
-e's/\n/&/3;t$' -e'N;D;:$' \
-e's///g;//!n;N;G;s/\n//2' \
-etq -e/.$/b$ -e:q -e'p;q' <in >out
important line 1
important line 2