# Shell 数据处理

## Linux中的常用符号

| 符号       | 功能                                                   |
| ---------- | ------------------------------------------------------ |
| *          | 代表任意**字符串**                                     |
| ?          | 代表任意**字符**                                       |
| /          | 代表根目录或作为路径间隔符使用                         |
| \ \<ENTER> | 续行符，可以使用续行符将一个命令行分写在多行上         |
| $          | 变量标识符，用来读取变量                               |
| '          | 在'……'中间的字符会被当做字符串处理                     |
| "          | 在"……"中间的字符会被当做字符串处理，**允许读取变量**   |
| `          | 在\`……\`中的命令会被执行                               |
| <          | 输入重定向字符                                         |
| >          | 输出重定向字符                                         |
| \|         | 管道字符                                               |
| &          | 后台执行字符，一般放在命令最后面。                     |
| ;          | 命令分隔字符，按照顺序执行多个命令                     |
| ()         | 在子Shell中执行命令(执行完毕自动结束，不影响当前Shell) |
| {}         | 在当前Shell中执行命令                                  |
| !          | 执行历史记录中的命令                                   |
| ~          | 当前用户的主目录（家目录）                             |

## 输入输出重定向

| 语法            | 作用                                                         |
| --------------- | ------------------------------------------------------------ |
| cmd < file      | 从file重定向标准输出                                         |
| cmd > file      | 把标准输出重定向到file中，如果file存在则**覆盖file**         |
| cmd >> file     | 把标准输出重定向到file中，如果file存在则**追加到后面**       |
| cmd 2> file     | 把标准错误重定向到file中，如果file存在则覆盖file             |
| cmd 2>> file    | 把标准错误重定向到file中，如果file存在则追加到后面           |
| cmd > file 2>&1 | 合并标准输出和标准错误，并重定向到file中，可以简写为`cmd >& file` |

### 管道

### 数据处理常用工具

#### grep

grep负责从数据源中检索对应的字符串，进行过滤，输匹配的行。

### grep

grep负责从数据源中检索对应的字符串，**行**过滤。输出的时被匹配的那行。

`grep [options] "string" firename`

| 选项 | 功能                              | 备注                               |
| ---- | --------------------------------- | ---------------------------------- |
| i    | 不区分大小写，linux默认区分大小写 |                                    |
| v    | 反向查找，查找不包含              |                                    |
| w    | 按单词搜索                        | 必须是正确的单词                   |
| n    | 显示行号                          |                                    |
| A    | 显示匹配行以及后面多少行 -A 5     |                                    |
| B    | 显示匹配行以及后面多少行          |                                    |
| o    | 打印匹配关键字                    | 只显示匹配到的关键字<br />以列显示 |
| c    | 统计匹配到的次数                  | 只显示数字                         |
| r    | 逐层遍历目录查找                  |                                    |
| C    | 显示匹配前后多少行                |                                    |
| l    | 只列出匹配的文件名                |                                    |
| L    | 列出不匹配的文件名                |                                    |
| e    | 使用正则表达式                    |                                    |
| E    | 使用扩展正则表达式                |                                    |
| ^key | 以关键字开头                      |                                    |
| key$ | 以关键字结尾                      |                                    |
| ^$   | 匹配空行                          |                                    |

#### cut

cut用于数据截取

`cut 选项 "文件"`

| 选项 | 功能                            | 备注                                                         |
| ---- | ------------------------------- | ------------------------------------------------------------ |
| c    | 以字符串为单位进行分割          | 截取字符串长度由后面数字确定                                 |
| d    | 自定义分隔符，默认使用制表符\t  | 自定义字符使用""                                             |
| f    | 与 -d一起使用，指定显示那个区域 | 多列之间可以加","分隔<br />连续多列之间家"-"连接<br />多列之间会携带分隔符 |

#### tr

tr用来对标准输入中通过替换或删除操作进行字符转换，主要用于删除文件中控制字符或进行字符转。

使用tr时要转换两个字符串，第一个用于查询，第二个用于处理各种转换。

`commands | tr [options] "string1" "string2 < "filename"`

| 选项 | 功能                                                         | 备注 |
| ---- | ------------------------------------------------------------ | ---- |
| d    | 删除字符串中所有输入字符                                     |      |
| s    | 删除所有重复出现字符序列，只保留第一个。<br />将重复出现的字符串压缩为一个字符串。 |      |

#### sort

sort是将文件的**每一行作为一个单位**，从**首字符向后**，一次按照ASCII码进行比较，最后将他们**升序**输出。

`sort [options] [filename]`

| 选项 | 功能                       | 备注         |
| ---- | -------------------------- | ------------ |
| u    | 去除重复行                 | 只保留第一行 |
| r    | 降序排列                   |              |
| o    | 将排序结果输出到文件中     |              |
| n    | 以数字排序，默认是字符排序 |              |
| t    | 分隔符                     |              |
| k    | 第N列                      |              |
| b    | 忽略前导空格               |              |
| R    | 随机排序，每次结果都不同   |              |

#### uniq

### uniq

uniq能够去除连续的重复行。**去重前先要排序**

`uniq [options] [filename]`

| 选项 | 功能           | 备注 |
| ---- | -------------- | ---- |
| i    | 忽略大小写     |      |
| c    | 统计重复行次数 |      |
| d    | 只显示重复行   |      |

#### tee

tee能够实现双向输出，将屏幕输出文件写入到文件或输出到屏幕。和"<<" ">>" "<" ">" 这几个工具一样。

`somecommand | tee`

| 选项 | 功能           | 备注 |
| ---- | -------------- | ---- |
| a    | 双向追加重定向 |      |

#### paste

paste工具用于合并文件行输出到屏幕，不会改动源文件。

`paste [options] [file1] [file2] ...`

| 选项 | 功能                                    | 备注 |
| ---- | --------------------------------------- | ---- |
| d    | 自定义间隔符                            |      |
| s    | 将每个文件按照一行输出，航宇航以tab间隔 |      |

#### xargs

管道命令，将上一个命令的输出作为下一个命令的输入，做的是**数据源**，一般使用"|"符号。

xargs命令，将上一个命令的输出作为下一个命令的**参数**。一般是和管道命令一起使用。

`"[somecommand]|[filename]" | xargs [options] command`

| 选项    | 功能                                                         | 备注 |
| ------- | ------------------------------------------------------------ | ---- |
| -a file | 从文件读入作为输入                                           |      |
| -E flag | flag必须是一个以空格分割的标志<br />当xargs分析道flag时就停止 |      |
| -p      | 没执行一次就询问下用户                                       |      |
| -n num  | 表示执行的时候一次用的参数的个数，默认是全部使用             |      |
| -t      | 先打印命令，然后执行，不询问用户是否执行。                   |      |
| -i/-I   |                                                              |      |
| -r      | 当xargs的输入为空的是停止xargs                               |      |
| -d      | 分隔符，默认的分隔符是回车                                   |      |

## 数据处理思路

1. 先截取行
2. 统一数据格式
3. 截取字符串
4. 处理字符串
