# Shell 数据处理 ## Linux中的常用符号 | 符号 | 功能 | | ---------- | ------------------------------------------------------ | | * | 代表任意**字符串** | | ? | 代表任意**字符** | | / | 代表根目录或作为路径间隔符使用 | | \ \ | 续行符,可以使用续行符将一个命令行分写在多行上 | | $ | 变量标识符,用来读取变量 | | ' | 在'……'中间的字符会被当做字符串处理 | | " | 在"……"中间的字符会被当做字符串处理,**允许读取变量** | | ` | 在\`……\`中的命令会被执行 | | < | 输入重定向字符 | | > | 输出重定向字符 | | \| | 管道字符 | | & | 后台执行字符,一般放在命令最后面。 | | ; | 命令分隔字符,按照顺序执行多个命令 | | () | 在子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 | 打印匹配关键字 | 只显示匹配到的关键字
以列显示 | | c | 统计匹配到的次数 | 只显示数字 | | r | 逐层遍历目录查找 | | | C | 显示匹配前后多少行 | | | l | 只列出匹配的文件名 | | | L | 列出不匹配的文件名 | | | e | 使用正则表达式 | | | E | 使用扩展正则表达式 | | | ^key | 以关键字开头 | | | key$ | 以关键字结尾 | | | ^$ | 匹配空行 | | #### cut cut用于数据截取 `cut 选项 "文件"` | 选项 | 功能 | 备注 | | ---- | ------------------------------- | ------------------------------------------------------------ | | c | 以字符串为单位进行分割 | 截取字符串长度由后面数字确定 | | d | 自定义分隔符,默认使用制表符\t | 自定义字符使用"" | | f | 与 -d一起使用,指定显示那个区域 | 多列之间可以加","分隔
连续多列之间家"-"连接
多列之间会携带分隔符 | #### tr tr用来对标准输入中通过替换或删除操作进行字符转换,主要用于删除文件中控制字符或进行字符转。 使用tr时要转换两个字符串,第一个用于查询,第二个用于处理各种转换。 `commands | tr [options] "string1" "string2 < "filename"` | 选项 | 功能 | 备注 | | ---- | ------------------------------------------------------------ | ---- | | d | 删除字符串中所有输入字符 | | | s | 删除所有重复出现字符序列,只保留第一个。
将重复出现的字符串压缩为一个字符串。 | | #### 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必须是一个以空格分割的标志
当xargs分析道flag时就停止 | | | -p | 没执行一次就询问下用户 | | | -n num | 表示执行的时候一次用的参数的个数,默认是全部使用 | | | -t | 先打印命令,然后执行,不询问用户是否执行。 | | | -i/-I | | | | -r | 当xargs的输入为空的是停止xargs | | | -d | 分隔符,默认的分隔符是回车 | | ## 数据处理思路 1. 先截取行 2. 统一数据格式 3. 截取字符串 4. 处理字符串