2.11 分割文件和数据

《Linux Shell 脚本攻略(第 2 版)》读书笔记

split

# 将文件分割成多个大小为10KB的文件
$ split -b 10k data.file
$ ls
data.file  xaa  xab  xac  xad  xae  xaf  xag  xah  xai  xaj

# 分割后的的文件以数字为后缀(-d),并且指定后缀长度为4(-a)。OS X系统无 -d 选项
$ split -b 10k -a 4 -d data.file
$ ls
data.file  x0000  x0001  x0002  x0003  x0004  x0005  x0006  x0007  x0008  x0009

指定分割文件大小时,除了 k(KB)后缀,我们还可以使用 M(MB)、G(GB)、c(byte)、w(word)等后缀。

为分割后的文件指定文件名前缀

$ split -b 10k -a 4 -d data.file split_file
$ ls
split_file0000  split_file0003  split_file0006  split_file0009
split_file0001  split_file0004  split_file0007
split_file0002  split_file0005  split_file0008

根据行数来分割文件

$ split -l 10 data.file
# 分割成多个文件,每个文件包括10行

csplit

csplit 能够依据指定的条件和字符串匹配选项对日志文件进行分割。

$ cat server.log
SERVER-1
[connection] 192.168.0.1 success
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 success
SERVER-2
[connection] 192.168.0.1 failed
[connection] 192.168.0.2 failed
[disconnect] 192.168.0.3 success
[connection] 192.168.0.4 failed
SERVER-3
[connection] 192.168.0.1 pending
[connection] 192.168.0.2 pending
[disconnect] 192.168.0.3 pending
[connection] 192.168.0.4 failed

$ csplit -sf server -n 2 -b "%02d.log" server.log /SERVER/ {*}; rm server00.log
$ ls
server01.log  server02.log  server03.log  server.log
  • -s 静默模式,不打印其他信息。
  • -f 指定分割后的文件名前缀。
  • -n 指定分割后的文件名后缀的数字个数,如 01、02、03 等。
  • -b 指定后缀格式。类似于 C 语言中的 pringf 的参数格式。此选项 OS X 系统中没有。
  • /SERVER/ 用来匹配某一行,可以是一个正则表达式。从当前行到匹配行为一次计算。此选项在 OS X 系统中如果第一次匹配到的内容为空的话会舍弃,而 Linux 会为第一个空内容生成一个文件。
  • {*} 表示根据匹配重复执行分割,知道文件末尾为止。可以使用{整数}的形式来制定分割执行的次数。OS X 系统中只能使用{整数}形式。

因为分割后的第一个文件没有任何内容,所以需要删除。而 OS X 系统中则没有必要。

你可能感兴趣的:(2.11 分割文件和数据)