文章目录
一、split命令
分割文档的命令 split
split命令用于将一个文件分割成数个。该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件,同时默认分割后的文件的名称会以 x 作为前缀,以 aa、ab、ac 这样的双字母格式作为后缀,形成 xaa、xab 这样的名称格式。当然也可以给分割后文件指定名字,不过系统还会给指定的名字后添加字母后缀
用法: split [option] [file [prefix]]
选项:
- -行数 : 指定每多少行切成一个小文件
- -l 行数: 等价于- 行数
- -b 字节 : 指定每多少字节切成一个小文件,也可以指定 K、M、G、T 等单位
- -C字节 : 与参数"-b"相似,但是在切 割时将尽量维持每行的完整性
- -d:切分后文件名为数字形式
- -a 后缀长度:默认的后缀长度是 2,也就是按 aa、ab、ac 这样的格式依次编号
【例 1】指定行数切割
将文件"readme"每6行切割成一个文件
[root@admin ~]# split -6 readme
[root@admin ~]# ls
anaconda-ks.cfg readme xab xad xaf xah
dir xaa xac xae xag xai
#等价于
[root@admin ~]# split -l 6 readme
split会将原来的文件"readme"切割成多个以"x"开头的小文件。而在这些小文件中,每个文件都只有6行内容
也可以给分割后的小文件指定名字,不过系统会给你指定的名字后加上字母
[root@admin ~]# split -l 2 readme newreadme
[root@admin ~]# ls
anaconda-ks.cfg newreadmeab newreadmeaf readme
dir newreadmeac newreadmeag
file newreadmead newreadmeah
newreadmeaa newreadmeae newreadmeai
【例 2】指定文件大小来切割
将文件"file"每20M切割成一个文件
[root@admin ~]# ll -h file
-rw-r--r--. 1 root root 100M 7月 21 16:26 file
[root@admin ~]# split -b 20M file
[root@admin ~]# ls
anaconda-ks.cfg dir file readme xaa xab xac xad xae
【例 3】
将file文件每20M切割成一个文件同时指定分割后的文件名后缀是数字且长度是4
[root@admin ~]# split -b 50M -a 4 -d file
[root@admin ~]# ls
anaconda-ks.cfg dir file readme x0000 x0001
二、mv命令
文件/目录改名或变更存储位置的命令 mv
mv 命令(move 的缩写),既可以在不同的目录之间移动文件或目录,也可以对文件和目录进行重命名
用法: mv [选项] 源文件 目标文件
选项:
- -t:先指定目标,再指定源文件
- -f:强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖;
- -i:交互移动,如果目标文件已经存在,则询问用户是否覆盖(默认选项);
- -n:如果目标文件已经存在,则不会覆盖移动,而且不询问用户;
- -v:显示文件或目录的移动过程;
- -u:若目标文件已经存在,但两者相比,源文件更新,则会对目标文件进行升级
【例 1】移动文件或目录
[dxk@admin ~]$ mv file /tmp #等价于mv -t /tmp file
#移动之后,源文件会被删除,类似剪切
[dxk@admin ~]$ mkdir dir
[dxk@admin ~]$ mv dir/ /tmp
#也可以移动目录,和 rm、cp 不同的是,mv 移动目录不需要加入 -r 选项
如果移动的目标位置已经存在同名的文件,则同样会提示是否覆盖,因为 mv 命令默认执行的也是 “mv -i” 的别名
[dxk@admin ~]$ touch test
[dxk@admin ~]$ mv test /tmp
mv:县否覆盖"tmp/test"?y
#由于 /tmp 目录下已经存在 test 文件,所以会提示是否覆盖,需要手工输入 y 覆盖移动
【例 2】强制移动
之前说过,如果目标目录下已经存在同名文件,则会提示是否覆盖,需要手工确认。这时如果移动的同名文件较多,则需要一个一个文件进行确认,很不方便
如果我们确认需要覆盖已经存在的同名文件,则可以使用 “-f” 选项进行强制移动,这就不再需要用户手工确认了
[dxk@admin ~]$ touch test
[dxk@admin ~]$ mv -f test /tmp
#就算 /tmp/ 目录下已经存在同名的文件,由于"-f"选项的作用,所以会强制覆盖
【例 3】不覆盖移动
既然可以强制覆盖移动,那也有可能需要不覆盖的移动。如果需要移动几百个同名文件,但是不想覆盖,这时就需要 “-n” 选项(跳过同名的文件)
[root@admin tmp]# touch file1 file2 #在/tmp下有file1、file2文件
[root@admin tmp]# cd
[root@admin ~]# touch file1 file2 file3 #在家目录下下有file1、file2、file3文件
[root@admin ~]# mv -n -v file1 file2 file3 /tmp #将在家目录下下有file1、file2、file3文件移动到/tmp下
"file3" -> "/tmp/file3" #-v 选项用于显示移动过程,可以看到只有file3移动过去了
[root@admin ~]# ls
anaconda-ks.cfg file1 file2 #file1、file2还在家目录下,所以-n选项在有同名的文件则会不移动
[root@admin ~]#
【例 4】改名
如果源文件和目标文件在同一目录中,那就是改名
[root@admin ~]# ls
anaconda-ks.cfg file1 file2
[root@admin ~]# mv file1 file
[root@admin ~]# ls
anaconda-ks.cfg file file2
目录也可以按照同样的方法改名
【例 5】显示移动过程
如果我们想要知道在移动过程中到底有哪些文件进行了移动,则可以使用 “-v” 选项来查看详细的移动信息
[root@admin ~]# mv -v file1 file2 file3 /tmp/dir
"file1" -> "/tmp/dir/file1"
"file2" -> "/tmp/dir/file2"
"file3" -> "/tmp/dir/file3"
三、cut命令
cut命令用于剪切文件中的数据
cut 是以每一行为一个处理对象
用法: cut OPTION… [FILE]…
选项:
- -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了-n 标志
- -c :以字符为单位进行分割。
- -d :自定义分隔符,默认为制表符
- -f :与-d一起使用,指定显示哪个区域
cut 的定位依据:
所谓“定位依据”,通俗地讲就是,该如何告诉 cut 想定位到哪一段内容进行剪切
cut 命令共接受三类定位方法:
第一,按字节(bytes)定位,用-b选项。
第二,按字符(characters)定位,用-c选项。
第三,按域(fields)定位,用-f选项。
【例 1】
在“字节”定位中,如果我想提取每一行的第 1、第 2、第3和第4个字节
-b选项支持形如“1-4”这样的写法,而且多个定位数字之间还可以用逗号隔开
[root@admin ~]# date
2020年 07月 21日 星期二 17:15:30 CST
[root@admin ~]# date | cut -b 1-4
2020
[root@admin ~]# date | cut -b 1,2,3,4
2020
[root@admin ~]# date | cut -b 1-4,9,10,15,16
20200721
有一点要注意,cut 命令如果使用了-b选项,那么在执行此命令时,cut 会先把 -b 后面所有的定位数字按照从小到大的顺序排序,然后再依次提取。所以你可以随意颠倒定位数字的顺序
[root@admin ~]# cat demo
hello mysql
hello linux
hello world
[root@admin ~]# cut -b 7-11 demo
mysql
linux
world
[root@admin ~]# cut -b 11,8,7,10,9 demo
mysql
linux
world
#即使我们把定位数字的顺序颠倒着写,所提取出的内容仍然没有变
【例 2】
-b -Num表示从头到第Num个字节,比如:#-3就表示从头到第3个字节
-b Num-表示从第Num个字节到结尾,比如:#3-就表示从第3个字节到结尾
cut 对于区间采用的都是“闭区间”
[root@admin ~]# cut -b -5 demo
hello
hello
hello
[root@admin ~]# cut -b 7- demo
mysql
linux
world
[root@admin ~]# cut -b -4,4- demo #虽然是闭区间但如果有重复的定位只会剪切一个
hello mysql
hello linux
hello world
【例 3】字符定位
[root@admin ~]# cut -c -5 demo
hello
hello
hello
[root@admin ~]# cut -b -5 demo
hello
hello
hello
不过,看着和 -b 没有什么区别?其实不然,看似相同,只是因为该文件中都是单字节字符,所以用 -b 和 -c 没有区别,
[root@admin ~]# file demo
demo: ASCII text
我们可以看到demo文件是ASCII编码的普通文本文件,这种格式中1个字母就是1个字符也等价于一个字节
如果我们在文档中写入中文,区别就看出来了
[root@admin ~]# vim demo
[root@admin ~]# cat demo
hello unix
你好 linux
[root@admin ~]# file demo
demo: UTF-8 Unicode text
此时,在文档中添加了中文,该文件的编码格式也发生了变化,UTF-8统一字符编码格式的文本文件,1 个 utf8 数字占 1 个字节、1 个 utf8 英文字母占 1 个字节、1个utf8汉字每个占用 3 个字节或4 个字节
[root@admin ~]# cut -b 2 demo
e
½ #用字节定位,乱码了
[root@admin ~]# cut -c 2 demo
e
好 #字符定位,输出正常
用 -c 则会以字符为单位来提取内容;而 -b 只会以字节(8 位二进制位)来计算,输出的就是乱码了
【例 3】
当遇到多字节字符时,可以使用-n选项,-n选项用于告诉 cut 命令不要将多字节字符拆开,而是合并在一起显示
[root@admin ~]# cut -b 2 demo
e
½ #乱码
[root@admin ~]# cut -nb 2 demo
e
好
【例 4】按域定位
-b 和 -c 只能在固定格式的文档中提取信息,而对于非固定格式就不方便,那么可以按域定位
/etc/passwd 文件,并不像date、w、who 命令的输出信息那样具有固定的格式,而是比较零散的样子。但是,文件中有很多冒号,这些冒号恰当地隔开了每一个有含义的项。这里“有含义的项”,我们就可以认为是“域”
[root@admin ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
……省略部分输出信息……
-d :自定义以什么为分隔符,默认为制表符
-f :与-d一起使用,指定显示哪个区域
[root@admin ~]# cut -d : -f 1,2,3 /etc/passwd
root:x:0 #将文件中的每一行以冒号为分隔符,分为很多列(域),剪切第1,2,3列内容
bin:x:1
daemon:x:2
adm:x:3
lp:x:4
sync:x:5
shutdown:x:6
……省略部分输出信息……
四、sort命令
sort命令用于将文本文件内容加以排序
sort可针对文本文件的内容,以行为单位来排序
用法: sort [选项]… [文件]…
常用选项:
- -b:忽略每行前面开始出的空格字符。
- -d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
- -f:排序时,将小写字母视为大写字母,亦即忽略大小写。
- -i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
- -M:将前面3个字母依照月份的缩写进行排序。
- -n:依照数值的大小排序。
- -u:意味着是唯一的(unique),输出的结果是去完重了的
- -o<输出文件>:将排序后的结果存入指定的文件。
- -r:以相反的顺序来排序。
- -t<分隔字符>:指定排序时所用的栏位分隔字符。
- -k Num:以第Num列排序
【例 1】
sort 命令将以默认的方式将文本文件的第一列以ASCII 码的次序排列,并将结果输出到标准输出
[root@admin ~]# cat demo
56fewferg
addsvffgh
18723asld
bdf24435h
333333333
333333333
[root@admin ~]# sort demo
18723asld
333333333
333333333
56fewferg
addsvffgh
bdf24435h
【例 2】
-u:在输出行中排序并去除重复行
[root@admin ~]