![AWK/SED/GREP - 第 N 次匹配后打印 M 行](https://linux22.com/image/1630493/AWK%2FSED%2FGREP%20-%20%E7%AC%AC%20N%20%E6%AC%A1%E5%8C%B9%E9%85%8D%E5%90%8E%E6%89%93%E5%8D%B0%20M%20%E8%A1%8C.png)
我希望在 N 次匹配后显示 M 行。实际上,我需要这样做才能将包含 N 次匹配且<regex>
后面总是跟有 M 行的文件拆分为 N 个不同的文件。我在 BSD Unix 下。
xyz
<regex>
aa
bb
cc
xyz
<regex>
dd
ee
ff
我想要获得的应该是:
aa
bb
cc
和
dd
ee
ff
目前,我可以正确地打印 M 行,<regex>
包括
for i in `seq 1 n`; do awk -v n=$i '/<regex>/ && !--n { print ; for(m=1; m<=3; m++) { getline ; print } }' inputfile > outputfile; done
我会很感激任何建议,以及任何使用 sed/grep 管道的简单解决方案。如果能提供一些额外的文字来解释建议的命令是如何工作的,我会非常感激!谢谢!
答案1
使用您的示例文件,这是否可以实现您想要的效果:
$ cat demo.sh
#!/bin/bash
INFILE="./infile"
COUNT=2
OUTFILE_PREFIX="XXX"
sed -n '/regex/,+'${COUNT}' { p; }' ${INFILE} | split -l$((++COUNT)) - ${OUTFILE_PREFIX}
$ ./demo.sh
$ ls XXX*
XXXaa XXXab
$ cat XXX*
<regex>
aa
bb
<regex>
dd
ee
$