Shell 使用bash:如何根据输入的文件行内容分割文件?

Shell 使用bash:如何根据输入的文件行内容分割文件?,shell,file,split,Shell,File,Split,我有一些大的文本日志文件。内容如下: Begin to work Load library Start TEXTLOG Checking ok TEXTLOG Start process Starting node ok TEXTLOG Stop node TEXTLOG 在该文件中,行“TEXTLOG”用作delimeter,因此我希望将该文件拆分为几个较小的文件,使用“TEXTLOG”作为EOF指示符,因此我应该: 文件1: Begin to work Load library Start

我有一些大的文本日志文件。内容如下:

Begin to work
Load library
Start
TEXTLOG
Checking
ok
TEXTLOG
Start process
Starting node
ok
TEXTLOG
Stop node
TEXTLOG
在该文件中,行“TEXTLOG”用作delimeter,因此我希望将该文件拆分为几个较小的文件,使用“TEXTLOG”作为EOF指示符,因此我应该:

文件1:

Begin to work
Load library
Start
文件2:

Checking
ok
文件3:

Start process
Starting node
ok
文件4:

Stop node
如何使用shell实现这一点? 谢谢。

试试这个:

awk 'BEGIN{c=1}/^TEXTLOG/{c++;next} {print > "file"c}' file 
ls 
试试这个:

awk 'BEGIN{c=1}/^TEXTLOG/{c++;next} {print > "file"c}' file 
ls 
使用GNU awk:

awk -v RS="\nTEXTLOG\n" '{print > "file"++c}' file
RS
是记录分隔符,允许立即获取每个文件的内容。

使用GNU awk:

awk -v RS="\nTEXTLOG\n" '{print > "file"++c}' file
RS
是记录分隔符,允许立即获取每个文件的内容。

使用csplit:

csplit --suppress-matched file "/TEXTLOG/" "{*}"
  • --suppress matched
    确保输出中不包含文本日志分隔符
  • “{*}”
    告诉csplit不仅要运行一次匹配模式,还要在整个文件中运行
使用csplit:

csplit --suppress-matched file "/TEXTLOG/" "{*}"
  • --suppress matched
    确保输出中不包含文本日志分隔符
  • “{*}”
    告诉csplit不仅要运行一次匹配模式,还要在整个文件中运行

我在linux/mac上的csplit似乎不支持--抑制匹配。你是怎么尝试的?我正在运行Ubuntu18.04
csplit--version
为我提供了
csplit(GNU coreutils)8.28
。似乎我在linux/mac上的csplit不支持--suppress匹配。你是怎么尝试的?我正在运行Ubuntu18.04
csplit——版本
提供了
csplit(GNUCoreutils)8.28