M Linux grep、sort、uniq、find命令详解及使用案例
2021-03-11 20:43:53 80 庶卒 版本: 4 引用率 96.03%
## 一、grep100.00%      
Linux grep 命令用于查找文件里符合条件的字符串。100.00%      

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。100.00%      

**语法**100.00%      
```shell100.00%      
grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]100.00%      
```
**参数**:100.00%      

- -a 或 --text : 不要忽略二进制的数据。100.00%      
- -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。100.00%      
- -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。100.00%      
- -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。100.00%      
- -c 或 --count : 计算符合样式的列数。100.00%      
- -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。100.00%      
- -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。100.00%      
- -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。100.00%      
- -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。100.00%      
- -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。100.00%      
- -F 或 --fixed-regexp : 将样式视为固定字符串的列表。100.00%      
- -G 或 --basic-regexp : 将样式视为普通的表示法来使用。100.00%      
- -h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。100.00%      
- -H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。100.00%      
- -i 或 --ignore-case : 忽略字符大小写的差别。100.00%      
- -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。100.00%      
- -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。100.00%      
- -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。100.00%      
- -o 或 --only-matching : 只显示匹配PATTERN 部分。100.00%      
- -q 或 --quiet或--silent : 不显示任何信息。100.00%      
- -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。100.00%      
- -s 或 --no-messages : 不显示错误信息。100.00%      
- -v 或 --invert-match : 显示不包含匹配文本的所有行。100.00%      
- -V 或 --version : 显示版本信息。100.00%      
- -w 或 --word-regexp : 只显示全字符合的列。100.00%      
- -x --line-regexp : 只显示全列符合的列。100.00%      
- -y : 此参数的效果和指定"-i"参数相同。100.00%      

## 二、sort 100.00%      
Linux sort命令用于将文本文件内容加以排序。100.00%      

sort可针对文本文件的内容,以行为单位来排序。100.00%      

**语法**100.00%      
```shell100.00%      
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]100.00%      
```
**参数说明**:100.00%      

- -b 忽略每行前面开始出的空格字符。100.00%      
- -c 检查文件是否已经按照顺序排序。100.00%      
- -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。100.00%      
- -f 排序时,将小写字母视为大写字母。100.00%      
- -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。100.00%      
- -m 将几个排序好的文件进行合并。100.00%      
- -M 将前面3个字母依照月份的缩写进行排序。100.00%      
- -n 依照数值的大小排序。100.00%      
- -u 意味着是唯一的(unique),输出的结果是去完重了的。100.00%      
- -o <输出文件> 将排序后的结果存入指定的文件。100.00%      
- -r 以相反的顺序来排序。100.00%      
- -t <分隔字符> 指定排序时所用的栏位分隔字符。100.00%      
- -k 指定根据第几列进行排序100.00%      
- +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。100.00%      
- --help 显示帮助。100.00%      
- --version 显示版本信息。100.00%      

## 三、uniq100.00%      
Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。100.00%      

uniq 可检查文本文件中重复出现的行列。100.00%      

**语法**100.00%      
```
uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]100.00%      
```
**参数**:100.00%      

- -c或--count 在每列旁边显示该行重复出现的次数。100.00%      
- -d或--repeated 仅显示重复出现的行列。100.00%      
- -f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。100.00%      
- -s<字符位置>或--skip-chars=<字符位置> 忽略比较指定的字符。100.00%      
- -u或--unique 仅显示出一次的行列。100.00%      
- -w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。100.00%      
- --help 显示帮助。100.00%      
- --version 显示版本信息。100.00%      
- [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;100.00%      
- [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。100.00%      


## 四、find100.00%      
Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。100.00%      

**语法**100.00%      
```shell100.00%      
find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;100.00%      
```
**参数说明**:

find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。100.00%      

expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。100.00%      

- -mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件100.00%      
- -amin n : 在过去 n 分钟内被读取过100.00%      
- -anewer file : 比文件 file 更晚被读取过的文件100.00%      
- -atime n : 在过去n天内被读取过的文件100.00%      
- -cmin n : 在过去 n 分钟内被修改过100.00%      
- -cnewer file :比文件 file 更新的文件100.00%      
- -ctime n : 在过去n天内被修改过的文件100.00%      
- -empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name100.00%      
- -ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写100.00%      
- -name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写100.00%      
- -size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。100.00%      
- -type c : 文件类型是 c 的文件。100.00%      
- d: 目录100.00%      
- c: 字型装置文件100.00%      
- b: 区块装置文件100.00%      
- p: 具名贮列100.00%      
- f: 一般文件100.00%      
- l: 符号连结100.00%      
- s: socket100.00%      
- -pid n : process id 是 n 的文件100.00%      

你可以使用 ( ) 将运算式分隔,并使用下列运算。100.00%      
```
exp1 -and exp2100.00%      
! expr
-not expr100.00%      
exp1 -or exp2
exp1, exp2
```

## 五、样例100.00%      
### 1 查询访问ip的接口调用次数并降序排序100.00%      

```
grep getOrgByCondition *default.log-14.log | grep -oE 'remoteAddr=[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sort | uniq -c| sort -nrk 1
```100.00%      
**效果如下**
![image.png](/ncimg/M00/00/03/rBIgzV-2NfaAAeFoAACeCBO6UuA172.png)100.00%      

**解释**100.00%      
`grep getOrgByCondition *default.log-14.log` 100.00%      
在14点的日志文件中查询包含这个字符串`getOrgByCondition`的所有数据100.00%      

`grep -oE 'remoteAddr=[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'` 匹配查找remoteAddr=ip地址的所有数据100.00%      

`-oE` 使用正则表达式进行匹配100.00%      

`sort` 进行排序100.00%      

`uniq -c` 显示每行重复的次数100.00%      

`sort -nrk 1` 指定第一列,以数值大小进行倒叙排序100.00%      


### 2 统计查询请求中分页大小的数据100.00%      
```
zgrep -oE 'pageSize":[0-9]{2,}' 2020-12-24/*default.log-*.log.zip | sort | uniq -c | sort -nrk 1100.00%      
```

**效果如下**100.00%      
![image.png](/ncimg/M00/00/07/rBIgzV_y5yqAWN6GAAF866urlu0300.png)100.00%      

知道为啥要查这个了吧,有个家伙传了个分页35万,直接内存溢出了 (•́へ•́╬)100.00%      


**解释**100.00%      
`zgrep -oE 'pageSize":[0-9]{2,}'` 查询分页大小大于等于10的数据100.00%      

### 3 查找文件夹中的特定的文件100.00%      
模糊查找文件夹中12月24号中11点的日志文件100.00%      
```
find /mnt/archive_bak/prd/*/2020-12-24 -name '*10.111.10.185*-11*'100.00%      
```
**效果如下**100.00%      
![image.png](/ncimg/M00/00/07/rBIgzV_0Bw6AThElAAFurAfgDqY925.png)100.00%