早期的文件切割是因为软盘容量有限,而今天文件切割的目的是为了提高可读性、生成日志等。
生成一个大小100k的内容为0的测试文件:
dd if=/dev/zerobs=100k count=1 of=data.file
1. 使用split:
split –b 10kdata.file
-d 以数字为后缀
-a length 指定后缀长度
加文件前缀名:
split –b 10kdata.file –d –a 4 split_file
根据行数切割文件:
split –l 10data.file 每个分割的文件为10行
2. 使用csplit
是split工具的一个变体,split只可以按照数据大小和行数分割文件,而csplit可以根据文件自身的特点分割。
例:
log.log文件:
log-1
[***************]aabbccddee 1
[***************]aabbccddee 2
[***************]aabbccddee 3
[***************]aabbccddee 4
log-2
[***************]aabbccddee 5
[***************]aabbccddee 6
[***************]aabbccddee 7
[***************]aabbccddee 8
log-3
[***************]aabbccddee 9
[***************]aabbccddee 10
[***************]aabbccddee 11
[***************]aabbccddee 12
分割为log1.log、log2.log、log3.log
csplit log.log /log/ -n 2 –s {*} –f log –b “%02d.log” ; rm log00.log
/log/用来匹配某一行,分割从此处开始;
/[REGEX]/文本样式。从当前【第一行】行直到【不包含】“log”的匹配行;
{*}根据匹配重复执行分割,直到文件末尾结束,可以{number}指定重复次数;
-s静默模式,不打印其他信息;
-n 指定分割后文件后缀的数字字数;
-f 指定分割后文件前缀;
-b 指定后缀格式,例如“%02d.log”,类似c语言的sprintf,这里文件前缀+后缀=log+%02d.log;
3.根据扩展名切割文件名
有时候按照脚本需要,可能根据文件名进行各种处理,比如保留扩展名的同时修改文件名、转化格式或者提取部分文件名。shell的内建功能可以根据不同的情况切分文件名。
提取文件名:
file_txt=”example.txt”
name=${ file_txt%.*}
echo File name is :$name
提取扩展名:
extension=${file_txt#*.}
echo Extension is : $ extension
${var%.*}含义:从$var中删除位于%右边的通配符匹配的字符串,通配符从左开始匹配;
var=${}给var赋值,则通配符就会匹配从右到左匹配到.txt,因此从$var中删除匹配结果,即留下“example”。
%和%%匹配原则:
都是从右到左匹配。
%非贪婪规则
例:var=a.b.c.d
echo ${var%.*} #输出a.b.c
%%贪婪规则:
echo ${var%%.*} #输出a
${var#*.}
删除位于#右边的的通配符,即前例中使用的*.所匹配的字符串,通配符从左到右匹配。类似%,且也有##贪婪操作符。
echo ${var#*.} #输出b.c.d
echo ${var##*.} #输出d
例:
提取域名不同部分;
假设url=www.666.com
echo ${url%.*} #www.666
echo ${url%%.*} #www
echo ${url#*.} #666.com
echo ${url##*.} #com