Merge branch 'master' of github.com:jaywcjlove/linux-command

This commit is contained in:
jaywcjlove 2020-03-17 08:44:51 +08:00
commit d56ceeed72
4 changed files with 172 additions and 122 deletions

View File

@ -1,45 +1,42 @@
comm
===
两个文件之间的比较
按行比较两个已排序的文件。
## 补充说明
**comm命令** 可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集、求差、以及差集操作。
* 交集:打印出两个文件所共有的行。
* 求差:打印出指定文件所包含的且不相同的行。
* 差集:打印出包含在一个文件中,但不包含在其他指定文件中的行。
### 语法
## 概要
```shell
comm [选项]... 文件1 文件2
comm [OPTION]... FILE1 FILE2
```
### 选项
## 主要用途
- 按行比较两个已排序的文件。
- 当`FILE1`或`FILE2`为`-`时,读取标准输入。
- 无选项时输出三列,第一列为`FILE1`独有的行,第二列为`FILE2`独有的行,第三列为`FILE1``FILE2`共有的行。
## 选项
```shell
如果不附带选项,程序会生成三列输出。
第一列包含文件1 特有的行,
第二列包含文件2 特有的行,
而第三列包含两个文件共有的行。
-1 不输出文件1 特有的行
-2 不输出文件2 特有的行
-3 不输出两个文件共有的行
--check-order 检查输入是否被正确排序,即使所有输入行均成对
--nocheck-order 不检查输入是否被正确排序
--output-delimiter=STR 依照STR 分列
-1 不输出第一列。
-2 不输出第二列。
-3 不输出第三列。
--check-order 检查输入行是否正确的排序,即使它们确实是已排序过的。
--nocheck-order 不检查输入行是否正确的排序。
--output-delimiter=STR 使用STR作为输出列之间的分隔符而不是默认的TAB。
--total 额外地增加第四列输出概要。
-z, --zero-terminated 设置行终止符为NUL而不是换行符。
--help 显示帮助信息并退出。
--version 显示版本信息并退出。
```
### 参数
* 文件1指定要比较的第一个**有序**文件;
* 文件2指定要比较的第二个**有序**文件。
## 返回值
### 实例
返回0表示成功返回非0值表示失败。
## 例子
文本 `aaa.txt` 内容
@ -66,12 +63,6 @@ ttt
jjj
```
两个文件之间的比较,如果没有排序需要带上`--nocheck-order`参数, 没有带上参数将会收到提示,此命令重要之功能在于比较。
```shell
comm: 文件2 没有被正确排序
comm: 文件1 没有被正确排序
```
比较结果
@ -88,21 +79,20 @@ eee
hhh
ttt
jjj
第一列 第二列 第三列
```
输出的第一列只包含在aaa.txt中出现的行第二列包含在bbb.txt中出现的行第三列包含在aaa.txt和bbb.txt中相同的行。各列是以制表符(\t作为定界符。
输出的第一列只包含在aaa.txt中出现的行第二列包含在bbb.txt中出现的行第三列包含在aaa.txt和bbb.txt中相同的行。各列之间以制表符(\t作为分隔符。
### 有序比较
### 比较排序过的文档
有序比较,先通过 sort 将文件内容排序
先通过 sort 将文件内容排序
```shell
[root@localhost ~]# sort aaa.txt > aaa1.txt
[root@localhost ~]# sort bbb.txt > bbb1.txt
```
有序比较结果:
比较结果:
```shell
[root@localhost ~]# comm aaa1.txt bbb1.txt
@ -128,25 +118,6 @@ bbb
ccc
```
**求差**
打印出两个文件中不相同的行,需要删除第三列:
```shell
[root@localhost text]# comm aaa.txt bbb.txt -3 | sed 's/^\t//'
aaa
aaa
ddd
eee
111
222
hhh
ttt
jjj
```
`sed 's/^\t//'` 是将制表符`\t`删除,以便把两列合并成一列。
### 差集
通过删除不需要的列可以得到aaa.txt和bbb.txt的差集
@ -173,4 +144,8 @@ jjj
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->
### 注意
1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 comm``info coreutils 'comm invocation'`。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

View File

@ -42,7 +42,7 @@ find(选项)(参数)
-ipath<范本样式>:此参数的效果和指定“-path”参数类似但忽略字符大小写的差别
-iregex<范本样式>:此参数的效果和指定“-regexe”参数类似但忽略字符大小写的差别
-links<连接数目>:查找符合指定的硬连接数目的文件或目录;
-iname<范本样式>:指定字符串作为寻找符号连接的范本样式;
-lname<范本样式>:指定字符串作为寻找符号连接的范本样式;
-ls假设find指令的回传值为Ture就将文件或目录名称列出到标准输出
-maxdepth<目录层级>:设置最大目录层级;
-mindepth<目录层级>:设置最小目录层级;

View File

@ -1,42 +1,86 @@
sort
===
将文件进行排序并输出
对文本文件中所有行进行排序。
## 补充说明
**sort命令** 是在Linux里非常有用它将文件进行排序并将排序结果标准输出。sort命令既可以从特定的文件也可以从stdin中获取输入。
### 语法
## 概要
```shell
sort(选项)(参数)
sort [OPTION]... [FILE]...
sort [OPTION]... --files0-from=F
```
### 选项
## 主要用途
- 将所有输入文件的内容排序后并输出。
- 当没有文件或文件为`-`时,读取标准输入。
## 选项
排序选项:
```shell
-b忽略每行前面开始出的空格字符
-c检查文件是否已经按照顺序排序
-d排序时处理英文字母、数字及空格字符外忽略其他的字符
-f排序时将小写字母视为大写字母
-i排序时除了040至176之间的ASCII字符外忽略其他的字符
-m将几个排序号的文件进行合并
-M将前面3个字母依照月份的缩写进行排序
-n依照数值的大小排序
-o<输出文件>:将排序后的结果存入制定的文件;
-r以相反的顺序来排序
-t<分隔字符>:指定排序时所用的栏位分隔字符;
+<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
-b, --ignore-leading-blanks 忽略开头的空白。
-d, --dictionary-order 仅考虑空白、字母、数字。
-f, --ignore-case 将小写字母作为大写字母考虑。
-g, --general-numeric-sort 根据数字排序。
-i, --ignore-nonprinting 排除不可打印字符。
-M, --month-sort 按照非月份、一月、十二月的顺序排序。
-h, --human-numeric-sort 根据存储容量排序(注意使用大写字母例如2K 1G)。
-n, --numeric-sort 根据数字排序。
-R, --random-sort 随机排序,但分组相同的行。
--random-source=FILE 从FILE中获取随机长度的字节。
-r, --reverse 将结果倒序排列。
--sort=WORD 根据WORD排序其中: general-numeric 等价于 -ghuman-numeric 等价于 -hmonth 等价于 -Mnumeric 等价于 -nrandom 等价于 -Rversion 等价于 -V。
-V, --version-sort 文本中(版本)数字的自然排序。
```
### 参数
其他选项:
```shell
--batch-size=NMERGE 一次合并最多NMERGE个输入超过部分使用临时文件。
-c, --check, --check=diagnose-first 检查输入是否已排序,该操作不会执行排序。
-C, --check=quiet, --check=silent 类似于 -c 选项,但不输出第一个未排序的行。
--compress-program=PROG 使用PROG压缩临时文件使用PROG -d解压缩。
--debug 注释用于排序的行发送可疑用法的警报到stderr。
--files0-from=F 从文件F中读取以NUL结尾的所有文件名称如果F是 - ,那么从标准输入中读取名字。
-k, --key=KEYDEF 通过一个key排序KEYDEF给出位置和类型。
-m, --merge 合并已排序文件,之后不再排序。
-o, --output=FILE 将结果写入FILE而不是标准输出。
-s, --stable 通过禁用最后的比较来稳定排序。
-S, --buffer-size=SIZE 使用SIZE作为内存缓存大小。
-t, --field-separator=SEP 使用SEP作为列的分隔符。
-T, --temporary-directory=DIR 使用DIR作为临时目录而不是 $TMPDIR 或 /tmp多次使用该选项指定多个临时目录。
--parallel=N 将并发运行的排序数更改为N。
-u, --unique 同时使用-c严格检查排序不同时使用-c输出排序后去重的结果。
-z, --zero-terminated 设置行终止符为NUL而不是换行符。
--help 显示帮助信息并退出。
--version 显示版本信息并退出。
文件:指定待排序的文件列表。
### 实例
KEYDEF的格式为F[.C][OPTS][,F[.C][OPTS]] ,表示开始到结束的位置。
F表示列的编号
C表示
OPTS为[bdfgiMhnRrV]中的一到多个字符,用于覆盖当前排序选项。
使用--debug选项可诊断出错误的用法。
sort将文件/文本的每一行作为一个单位相互比较比较原则是从首字符向后依次按ASCII码值进行比较最后将他们按升序输出。
SIZE 可以有以下的乘法后缀:
% 内存的1%
b 1
K 1024默认
剩余的 M, G, T, P, E, Z, Y 可以类推出来。
```
## 参数
FILE可选要处理的文件可以为任意数量。
## 返回值
返回0表示成功返回非0值表示失败。
## 例子
sort将文件/文本的每一行作为一个单位相互比较比较原则是从首字符向后依次按ASCII码值进行比较最后将他们按升序输出。
```shell
root@[mail text]# cat sort.txt
@ -56,7 +100,7 @@ eee:50:5.5
eee:50:5.5
```
忽略相同行使用-u选项或者uniq
忽略相同行使用`-u`选项或者`uniq`
```shell
[root@mail text]# cat sort.txt
@ -74,8 +118,6 @@ ccc:30:3.3
ddd:40:4.4
eee:50:5.5
或者
[root@mail text]# uniq sort.txt
aaa:10:1.1
ccc:30:3.3
@ -84,7 +126,7 @@ bbb:20:2.2
eee:50:5.5
```
sort的-n、-r、-k、-t选项的使用
`sort``-n、-r、-k、-t`选项的使用:
```shell
[root@mail text]# cat sort.txt
@ -96,7 +138,7 @@ bbb:10:2.5
eee:40:5.4
eee:60:5.1
#将BB列按照数字从小到大顺序排列
# 将BB列按照数字从小到大顺序排列
[root@mail text]# sort -nk 2 -t: sort.txt
AAA:BB:CC
bbb:10:2.5
@ -106,7 +148,8 @@ eee:40:5.4
ccc:50:3.3
eee:60:5.1
#将CC列数字从大到小顺序排列
# 将CC列数字从大到小顺序排列
# -n是按照数字大小排序-r是以相反顺序-k是指定需要排序的栏位-t指定栏位分隔符为冒号
[root@mail text]# sort -nrk 3 -t: sort.txt
eee:40:5.4
eee:60:5.1
@ -115,23 +158,25 @@ ccc:50:3.3
bbb:10:2.5
aaa:30:1.6
AAA:BB:CC
# -n是按照数字大小排序-r是以相反顺序-k是指定需要爱排序的栏位-t指定栏位分隔符为冒号
```
**-k选项的具体语法格式**
关于`-k`选项的解读和例子:
-k选项的语法格式
-k选项深度解读
```shell
FStart.CStart Modifie,FEnd.CEnd Modifier
FStart.CStart Modifier,FEnd.CEnd Modifier
-------Start--------,-------End--------
FStart.CStart 选项 , FEnd.CEnd 选项
```
这个语法格式可以被其中的逗号`,`分为两大部分, **Start** 部分和 **End** 部分。Start部分也由三部分组成其中的Modifier部分就是我们之前说过的类似n和r的选项部分。我们重点说说`Start`部分的`FStart`和`C.Start`。`C.Start`也是可以省略的,省略的话就表示从本域的开头部分开始。`FStart.CStart`,其中`FStart`就是表示使用的域,而`CStart`则表示在`FStart`域中从第几个字符开始算“排序首字符”。同理在End部分中你可以设定`FEnd.CEnd`,如果你省略`.CEnd`则表示结尾到“域尾”即本域的最后一个字符。或者如果你将CEnd设定为0(零),也是表示结尾到“域尾”。
这个语法格式可以被其中的逗号`,`分为两大部分,**Start** 部分和 **End** 部分。
Start部分由三部分组成其中的Modifier部分就是我们之前说过的选项部分
我们重点说说`Start`部分的`FStart`和`C.Start``C.Start`是可以省略的,省略的话就表示从本域的开头部分开始。`FStart.CStart`,其中`FStart`就是表示使用的域,而`CStart`则表示在`FStart`域中从第几个字符开始算排序首字符。
同理在End部分中你可以设定`FEnd.CEnd`,如果你省略`.CEnd`或将它设定为0则表示结尾到本域的最后一个字符。
从公司英文名称的第二个字母开始进行排序:
例子:从公司英文名称的第二个字母开始排序:
```shell
$ sort -t ' ' -k 1.2 facebook.txt
@ -141,9 +186,10 @@ google 110 5000
guge 50 3000
```
使用了`-k 1.2`表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。你会发现baidu因为第二个字母是a而名列榜首。sohu和 google第二个字符都是o但sohu的h在google的o前面所以两者分别排在第二和第三。guge只能屈居第四了。
解读:使用了`-k 1.2`表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。你会发现baidu因为第二个字母是a而名列榜首。sohu和google第二个字符都是o但sohu的h在google的o前面所以两者分别排在第二和第三。guge只能屈居第四了。
只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:
例子:只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:
```shell
$ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt
@ -153,7 +199,16 @@ sohu 100 4500
guge 50 3000
```
由于只对第二个字母进行排序,所以我们使用了`-k 1.2,1.2`的表示方式,表示我们“只”对第二个字母进行排序。(如果你问“我使用`-k 1.2`怎么不行当然不行因为你省略了End部分这就意味着你将对从第二个字母起到本域最后一个字符为止的字符串进行排序。对于员工工资进行排 序,我们也使用了`-k 3,3`这是最准确的表述表示我们“只”对本域进行排序因为如果你省略了后面的3就变成了我们“对第3个域开始到最后一个域位置的内容进行排序” 了。
解读:由于只对第二个字母进行排序,所以我们使用了`-k 1.2,1.2`的表示方式,表示我们只对第二个字母进行排序(如果你问我使用`-k 1.2`怎么不行当然不行因为你省略了End部分这就意味着你将对从第二个字母起到本域最后一个字符为止的字符串进行排序
对员工工资进行排序,我们也使用了`-k 3,3`这是最准确的表述表示我们只对本域进行排序因为如果你省略了后面的3就变成了我们对第3个域开始到最后一个域位置的内容进行排序了。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->
### 注意
1. [关于-g和-n选项的区别stackoverflow](https://stackoverflow.com/questions/1255782/whats-the-difference-between-general-numeric-sort-and-numeric-sort-options)
2. 关于这个复杂命令的学习建议您阅读info文档及参考博客、问答网站等。
3. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 shuf``info coreutils 'shuf invocation'`。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

View File

@ -1,37 +1,51 @@
uniq
===
报告或忽略文件中的重复行
显示或忽略重复的行。
## 补充说明
**uniq命令** 用于报告或忽略文件中的重复行一般与sort命令结合使用。
### 语法
## 概要
```shell
uniq(选项)(参数)
uniq [OPTION]... [INPUT [OUTPUT]]
```
### 选项
## 主要用途
- 将输入文件(或标准输入)中邻近的重复行写入到输出文件(或标准输出)中。
- 当没有选项时,邻近的重复行将合并为一个。
## 选项
```shell
-c或——count在每列旁边显示该行重复出现的次数
-d或--repeated仅显示重复出现的行列
-f<栏位>或--skip-fields=<栏位>:忽略比较指定的栏位;
-s<字符位置>或--skip-chars=<字符位置>:忽略比较指定的字符;
-u或——unique仅显示出一次的行列
-w<字符位置>或--check-chars=<字符位置>:指定要比较的字符。
-c, --count 在每行开头增加重复次数。
-d, --repeated 所有邻近的重复行只被打印一次。
-D 所有邻近的重复行将全部打印。
--all-repeated[=METHOD] 类似于 -D但允许每组之间以空行分割。METHOD取值范围{none(默认)prependseparate}。
-f, --skip-fields=N 跳过对前N个列的比较。
--group[=METHOD] 显示所有行允许每组之间以空行分割。METHOD取值范围{separate(默认)prependappendboth}。
-i, --ignore-case 忽略大小写的差异。
-s, --skip-chars=N 跳过对前N个字符的比较。
-u, --unique 只打印非邻近的重复行。
-z, --zero-terminated 设置行终止符为NUL而不是换行符。
-w, --check-chars=N 只对每行前N个字符进行比较。
--help 显示帮助信息并退出。
--version 显示版本信息并退出。
```
### 参数
## 参数
* 输入文件:指定要去除的重复行文件。如果不指定此项,则从标准读取数据;
* 输出文件:指定要去除重复行后的内容要写入的输出文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。
INPUT可选输入文件不提供时为标准输入。
### 实例
OUTPUT可选输出文件不提供时为标准输出。
删除重复行:
## 返回值
返回0表示成功返回非0值表示失败。
## 例子
注意命令2和命令3结果一样命令1仅作了相邻行的去重。
```shell
uniq file.txt
@ -39,7 +53,7 @@ sort file.txt | uniq
sort -u file.txt
```
只显示单一行:
只显示单一行,区别在于是否执行排序
```shell
uniq -u file.txt
@ -59,4 +73,10 @@ sort file.txt | uniq -d
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->
### 注意
1. `uniq`只检测邻近的行是否重复,`sort -u`将输入文件先排序然后再处理重复行。
2. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 uniq``info coreutils 'uniq invocation'`。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->