《linux 字符处理》- grep/sort/uniq/tr/paste/sed/awk
一:基本
- 字符处理主要是文本的搜索和处理。
- 搜索也主要使用到了 管道 作为媒介。
二: grep 搜索文本
- 基本语法 (可以在文本中使用正则进行搜索)
- grep [-incv] '文本' 文件
- i 不区分大小写
- c 匹配行数
- n 输出匹配行数
- v 反向匹配
- 正则使用
- grep '^[123]' index.txt (搜索在开头为123的行)
三: sort 排序
- 基本语法
- sort [-ntkr] 文件名
- n 数字排序
- t 指定分隔符
- k 指定第几列
- r 反向排序
- 指定排序
- -t -k 可以指定排序方式
- 比如这里,我新建了一个 sort.txt
-
-
-
[mttyk]$ cat sort.txt b:1-3 a:2-2 f:4-1 h:8-9 d:3-6 h:8-9 g:6-7
-
-
- 在没有指定条件时候,sort 默认第一个字符正序
-
-
[mttyk]$ sort sort.txt a:2-2 b:1-3 d:3-6 f:4-1 g:6-7 h:8-9 h:8-9
-
- 如果想使用第二例的数字来进行排序的话
-
-
-
[mttyk]$ sort -t ":" -k 2 sort.txt
b:1-3
a:2-2
d:3-6
f:4-1
g:6-7
h:8-9
h:8-9-t 等于切割了两组
1组 切割符 第二组
b : 1-3
a : 2-2
......
-
-
四: uniq 删除重复内容
- 基本语法
- uniq [-ic] 文件
- i 忽略大小写
-c 显示重复行数
- 注意
- uniq 语法应该是和 sort 一起使用的,因为不连续的重复数据,uniq 是无法删除的
- 所以需要 sort 排序后删除/统计
-
文件 h:8-9 d:3-6 h:8-9 直接 uniq 删除重复 [mttyk]$ uniq sort.txt h:8-9 d:3-6 h:8-9 无法删除 排序后 uniq 删除重复 [mttyk]$ sort sort.txt | uniq d:3-6 h:8-9
五: tr (文本转换/删除)
- tr 只能在管道中处理字符,源文件并不能修改
- 基本语法 (支持正则)
- 删除指定字符 tr -d "[1-9]"
- 转换指定字符 tr "[a-z]" "[A-Z]"
- 替换字符时,文本中有多少个字符,就只能替换多少个字符
六:sed (文本处理) ( -i 可改变源文件)
- 基于 行 的 文本处理工具
- 基本语法
- sed [options] 'commend' file
- 删除操作 (/d)
- 删除指定行 sed '1d' index.txt (删除 index.txt 文件下的第1行)
- 删除指定区间 sed '1,2d' index.txt (删除 index.txt 文件下的第1-2行)
- 删除最后一行 sed '$d' index.txt (删除 index.txt 文件下的最后一行)
- 删除空行 sed '/^$/d' index.txt (删除 index.txt 文件下的空行)
- 查找替换 (s/)
- 部分替换 sed 's/L/l/1' index.txt (替换 index.txt 文件下的L为l) (只替换一行中的第一个)
- 全部替换 sed 's/L/l/g' index.txt (替换 index.txt 文件下的L为l) (一行不管有多少个,全部替换)
- 字符替换 (y/)
- 批量替换 sed 'y/abcd/ABCD/' index.txt (替换 index.txt 文件下的a为A, b为B, c为C,d为D)
- 文本插入 (i 匹配行后插入) (a 匹配行前插入)
- 指定行插入 sed '2 i insert' index.txt (在 index.txt 文件 第2行 插入文本)
七:awk (文本处理)
- 基于 列 的文本处理工具
- 基本语法
- -F 指定分隔符
- 基本操作
- 查看文本域数量
- awk '{print NF}' index.txt (查看 index.txt 文件的切割域) (内部变量 NF 实现)
- 求和
- awk 'BEGIN{total=0}{total+=$1}END{print total}' index.txt
- awk 'BEGIN{total=0;num=0}{num+=$1;total+=1}END{print total/num}' index.txt