3.9 split:分割文件
3.9.1 命令详解
【命令星级】 ★★★☆☆
【功能说明】
split命令可以按照指定的行数或者指定的文件大小分割文件。
【语法格式】
split [option] [INPUT] [PREFIX]
split [选项] [输入文件] [输出文件名前缀]
说明:
1)在split命令及后面的选项和文件里,每个元素直接都至少要有一个空格。
2)输出文件的格式会加上前缀,如PREFIXaa,PREFIXab。
【选项说明】
表3-12针对该命令的参数选项进行了说明。
表3-12 split命令的参数选项及说明
3.9.2 使用范例
**范例3-35:**按行分割文件,以及指定后缀形式。
[root@centos7 ~]# cp /etc/inittab .
[root@centos7 ~]# wc -l inittab #wc命令可以查看文件的行数,后面会详细讲解。
17 inittab
[root@centos7 ~]# split -l 10 inittab new_ #每10行分割一次,分割的文件名以new_开头。
[root@centos7 ~]# ls new_*
new_aa new_ab
[root@centos7 ~]# wc -l new_*
10 new_aa
7 new_ab
17 total
[root@centos7 ~]# split -l 10 -a 3 inittab new2_ #参数-a指定后缀长度。
[root@centos7 ~]# wc -l new2_*
10 new2_aaa
7 new2_aab
17 total
[root@centos7 ~]# split -l 10 -d inittab num__ #参数-d使用数字后缀。
[root@centos7 ~]# wc -l num_*
10 num__00
7 num__01
17 total
**范例3-36:**按大小分割文件例子。
[root@centos7 ~]# find /usr/bin/ -size +1M -exec ls -lh {} \;
-rwxr-xr-x. 1 root root 3.1M May 12 23:53 /usr/bin/dwp
-rwxr-xr-x. 1 root root 5.2M May 12 23:53 /usr/bin/ld.gold
-rwxr-xr-x. 1 root root 7.3M Aug 9 2019 /usr/bin/crash
-rwxr-xr-x. 1 root root 6.6M Apr 1 2020 /usr/bin/gdb
-rwxr-xr-x. 1 root root 3.4M Apr 1 2020 /usr/bin/stap
-rwxr-xr-x. 1 root root 1.5M Aug 7 01:31 /usr/bin/systemd-analyze
-rwxr-xr-x. 113 root root 1.5M May 29 04:32 /usr/bin/git
-rwxr-xr-x. 1 root root 1.1M Jul 29 04:21 /usr/bin/grub2-fstest
-rwxr-xr-x. 113 root root 1.5M May 29 04:32 /usr/bin/git-receive-pack
-rwxr-xr-x. 113 root root 1.5M May 29 04:32 /usr/bin/git-upload-archive
-rwxr-xr-x. 1 root root 1.4M Nov 6 2016 /usr/bin/swig
-rwxr-xr-x. 1 root root 2.6M Aug 9 2019 /usr/bin/nmap
-rwxr-xr-x. 1 root root 8.5M Apr 1 2020 /usr/bin/doxygen
-rwxr-xr-x. 1 root root 2.3M Aug 9 2019 /usr/bin/vim
[root@centos7 ~]# cp /usr/bin/nmap . #复制测试文件。
[root@centos7 ~]# ll -h nmap
-rwxr-xr-x. 1 root root 2.6M Oct 23 16:40 nmap
[root@centos7 ~]# split -b 500k -d nmap nmap_ #每500KB分割一次文件。
[root@centos7 ~]# ll -h nmap*
-rwxr-xr-x. 1 root root 2.6M Oct 23 16:40 nmap
-rw-r--r--. 1 root root 500K Oct 23 16:41 nmap_00
-rw-r--r--. 1 root root 500K Oct 23 16:41 nmap_01
-rw-r--r--. 1 root root 500K Oct 23 16:41 nmap_02
-rw-r--r--. 1 root root 500K Oct 23 16:41 nmap_03
-rw-r--r--. 1 root root 500K Oct 23 16:41 nmap_04
-rw-r--r--. 1 root root 86K Oct 23 16:41 nmap_05
3.10 paste:合并文件
3.10.1 命令详解
【命令星级】 ★★★☆☆
【功能说明】
paste命令能将文件按照行与行进行合并,中间使用tab隔开。
【语法格式】
paste [option] [file]
paste [选项] [文件]
说明:
1)在paste命令及后面的选项和文件里,每个元素直接都至少要有一个空格。
2)如果file是“-”,则表示从标准输入读取内容。
【选项说明】
表3-13针对该命令的参数选项进行了说明。
表3-13 paste命令的参数选项及说明
3.10.2 使用范例
3.10.2.1 基础范例
**范例3-37:**默认合并文件。
[root@centos7 ~]# seq 6 >test1 #准备好2个测试文件test1和test2。
[root@centos7 ~]# cat test1
1
2
3
4
5
6
[root@centos7 ~]# cat >test2<<EOF
> aaa
> bbbbbbb
> ccccccccc
>
> eeeeeeeeeee
> gggggg
> EOF
[root@centos7 ~]# paste test1 test2 #2个文件按行进行合并。
1 aaa
2 bbbbbbb
3 ccccccccc
4
5 eeeeeeeeeee
6 gggggg
**范例3-38:**通过-d可以指定分隔符。
[root@centos7 ~]# paste -d: test1 test2 #以“:”作为分隔符。
1:aaa
2:bbbbbbb
3:ccccccccc
4:
5:eeeeeeeeeee
6:gggggg
**范例3-39:**通过-s合并内容,使其成行。
[root@centos7 ~]# paste test1 #不接收任何参数,显示的内容如下所示。
1
2
3
4
5
6
[root@centos7 ~]# paste -s test1 #使用-s选项,将1列内容转行成1行。
1 2 3 4 5 6
[root@centos7 ~]# paste -s test2
aaa bbbbbbb ccccccccc eeeeeeeeeee gggggg
[root@centos7 ~]# paste -s test1 test2 #每个文件占用一行。
1 2 3 4 5 6
aaa bbbbbbb ccccccccc eeeeeeeeeee gggggg
范例3-40:与cat命令合并文本的方式进行对比。
[root@centos7 ~]# cat test1 test2 #cat是将2个文件按顺序前后合并。
1
2
3
4
5
6
aaa
bbbbbbb
ccccccccc
eeeeeeeeeee
gggggg
3.10.2.2 生产案例
**范例3-41:**假设通过Shell脚本生产的账号密码如下所示。
[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8 #生成8位随机数。
BhmksfZA[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8
jP2sJu5s[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8
APE6F0e6[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8
ziYCdEBq[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8
5hHUFlQ8[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8
LfP8L5fa[root@centos7 ~]# cat /dev/urandom | tr -dc '[:alnum:]' | head -c8
Pqk8nA89[root@centos7 ~]# cat >test.txt<<EOF #创建测试文件。
> stu10309
> BhmksfZA
> stu10312
> jP2sJu5s
> stu10315
> APE6F0e6
> stu10318
> ziYCdEBq
> sut10321
> 5hHUFlQ8
> stu10324
> LfP8L5fa
> stu10327
> Pqk8nA89
> EOF
[root@centos7 ~]# cat test.txt
stu10309 #账号。
BhmksfZA #密码。
stu10312
jP2sJu5s
stu10315
APE6F0e6
stu10318
ziYCdEBq
sut10321
5hHUFlQ8
stu10324
LfP8L5fa
stu10327
Pqk8nA89
现在要求使用命令将上面的文本转换成下面SVN服务配置文件中的账号及密码格式。
stu10309=BhmksfZA #格式“账号=密码”。
stu10312=jP2sJu5s
stu10315=APE6F0e6
stu10318=ziYCdEBq
sut10321=5hHUFlQ8
stu10324=LfP8L5fa
stu10327=Pqk8nA89
**提示:**实现的思路就是将奇数行和偶数行用“=”(等号)连接成一行。
方法一:采用paste命令加-s参数实现。
[root@centos7 ~]# paste -s test.txt
stu10309 BhmksfZA stu10312 jP2sJu5s stu10315 APE6F0e6 stu10318 ziYCdEBq sut10321 5hHUFlQ8 stu10324 LfP8L5fa stu10327 Pqk8nA89
[root@centos7 ~]# paste -sd '=\n' test.txt #这是paste命令的特殊用法,轮流用等号和\n做分隔符(\n是换行符,是不可见的)。
stu10309=BhmksfZA
stu10312=jP2sJu5s
stu10315=APE6F0e6
stu10318=ziYCdEBq
sut10321=5hHUFlQ8
stu10324=LfP8L5fa
stu10327=Pqk8nA89
方法二:采用paste命令加-d参数实现。
[root@centos7 ~]# paste -d '=' - - <test.txt #这种用法在命令里很少见,功能是不从文件读取输入,而是从标准输入读入。每1个“-”代表读取的一行,所以这里有连个“- -”,并用“=”进行分割。
stu10309=BhmksfZA
stu10312=jP2sJu5s
stu10315=APE6F0e6
stu10318=ziYCdEBq
sut10321=5hHUFlQ8
stu10324=LfP8L5fa
stu10327=Pqk8nA89
方法三:采用xargs+sed命令实现。
[root@centos7 ~]# xargs -n 2 <test.txt #-n参数表示多少个字符串为一组,详见本书xargs命令章节。
stu10309 BhmksfZA
stu10312 jP2sJu5s
stu10315 APE6F0e6
stu10318 ziYCdEBq
sut10321 5hHUFlQ8
stu10324 LfP8L5fa
stu10327 Pqk8nA89
[root@centos7 ~]# xargs -n 2 <test.txt |sed 's# #=#g' #将上述结果中的空格替换为=号。
stu10309=BhmksfZA
stu10312=jP2sJu5s
stu10315=APE6F0e6
stu10318=ziYCdEBq
sut10321=5hHUFlQ8
stu10324=LfP8L5fa
stu10327=Pqk8nA89
方法四:sed的特殊应用。
[root@centos7 ~]# sed 'N;s#\n#=#g' test.txt
stu10309=BhmksfZA
stu10312=jP2sJu5s
stu10315=APE6F0e6
stu10318=ziYCdEBq
sut10321=5hHUFlQ8
stu10324=LfP8L5fa
stu10327=Pqk8nA89
详细说明:
sed内置命令N的作用:不会清空模式空间内容,并且从输入文件中读取下一行数据,追加到模式空间中,两行数据以换行符\n连接。
第一行是“stu10309”存入模式空间,碰到命令“N”,读取第二行“BhmksfZA”,此时模式空间内容为“stu10309\nBhmksfZA”;然后执行“s#\n#=#g”将“\n”替换为“=”,即为“stu10309=BhmksfZA”,输出到平面上,第一个循环结束;后面的循环和前面的思路一样,直到文件结束,更多细节请参考本书sed命令部分。