L20.linux命令每日一练 -- 第三章 文件过滤及内容编辑处理命令 -- split和paste命令

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命令部分。

猜你喜欢

转载自blog.csdn.net/qq_25599925/article/details/125356932