后端
Shell 文本处理工具
1. cut工具
1.1 功能
cut命令用于从文件或标准输入中提取指定的列或字段。
1.2 语法
bash
cut [选项] [文件]1.3 常用选项
| 选项 | 描述 |
|---|---|
-d <分隔符> | 指定字段分隔符,默认为制表符 |
-f <字段列表> | 指定要提取的字段,多个字段用逗号分隔 |
-c <字符范围> | 按字符位置提取 |
-b <字节范围> | 按字节位置提取 |
--complement | 提取指定字段以外的所有字段 |
1.4 示例
1.4.1 按字段提取
bash
# 假设有一个文件data.txt,内容如下:
# name,age,city
# Alice,25,New York
# Bob,30,London
# 提取第一个字段
cut -d ',' -f 1 data.txt
# 输出:
# name
# Alice
# Bob
# 提取多个字段
cut -d ',' -f 1,3 data.txt
# 输出:
# name,city
# Alice,New York
# Bob,London
# 提取从第二个字段开始的所有字段
cut -d ',' -f 2- data.txt
# 输出:
# age,city
# 25,New York
# 30,London1.4.2 按字符位置提取
bash
# 提取前5个字符
cut -c 1-5 data.txt
# 提取第3个字符
cut -c 3 data.txt
# 提取从第3个字符开始的所有字符
cut -c 3- data.txt1.5 实际应用
bash
# 从/etc/passwd文件中提取用户名和shell
cut -d ':' -f 1,7 /etc/passwd
# 提取IP地址的网络部分
ifconfig eth0 | grep 'inet ' | cut -d ' ' -f 10 | cut -d '.' -f 1-32. grep工具
2.1 功能
grep命令用于在文件或标准输入中搜索匹配指定模式的行。
2.2 语法
bash
grep [选项] 模式 [文件]2.3 常用选项
| 选项 | 描述 |
|---|---|
-i | 忽略大小写 |
-v | 反向匹配,显示不包含模式的行 |
-n | 显示匹配行的行号 |
-c | 只显示匹配的行数 |
-l | 只显示包含匹配的文件名 |
-r | 递归搜索目录 |
-E | 使用扩展正则表达式 |
-A <n> | 显示匹配行及其后n行 |
-B <n> | 显示匹配行及其前n行 |
-C <n> | 显示匹配行及其前后n行 |
2.4 示例
2.4.1 基本搜索
bash
# 在文件中搜索包含"error"的行
grep "error" log.txt
# 忽略大小写搜索
grep -i "error" log.txt
# 反向搜索,显示不包含"error"的行
grep -v "error" log.txt
# 显示匹配行的行号
grep -n "error" log.txt2.4.2 正则表达式搜索
bash
# 搜索以"user"开头的行
grep "^user" data.txt
# 搜索以".com"结尾的行
grep "\.com$" data.txt
# 使用扩展正则表达式搜索邮箱地址
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" data.txt2.4.3 递归搜索
bash
# 在当前目录及其子目录中搜索包含"function"的文件
grep -r "function" .
# 只显示包含匹配的文件名
grep -rl "function" .2.5 实际应用
bash
# 查找进程
grep "chrome" <(ps aux)
# 检查服务状态
systemctl status | grep "running"
# 统计日志中的错误数量
grep -c "ERROR" app.log3. sed工具
3.1 功能
sed命令是一个流编辑器,用于对文本进行替换、删除、插入等操作。
3.2 语法
bash
sed [选项] '命令' [文件]3.3 常用选项
| 选项 | 描述 |
|---|---|
-i | 直接修改文件,而不是输出到标准输出 |
-n | 禁止自动打印模式空间 |
-e | 允许多个编辑命令 |
-f | 从文件中读取编辑命令 |
3.4 常用命令
| 命令 | 描述 |
|---|---|
s/模式/替换/ | 替换匹配的文本 |
d | 删除匹配的行 |
p | 打印匹配的行 |
i\文本 | 在匹配行前插入文本 |
a\文本 | 在匹配行后追加文本 |
c\文本 | 替换匹配的行 |
3.5 示例
3.5.1 替换操作
bash
# 替换文件中的"old"为"new"
sed 's/old/new/' data.txt
# 全局替换所有匹配项
sed 's/old/new/g' data.txt
# 替换第n个匹配项
sed 's/old/new/2' data.txt
# 使用不同的分隔符(适合路径等包含/的情况)
sed 's|/old/path|/new/path|g' data.txt3.5.2 删除操作
bash
# 删除空行
sed '/^$/d' data.txt
# 删除包含"error"的行
sed '/error/d' data.txt
# 删除第5行
sed '5d' data.txt
# 删除第2到第5行
sed '2,5d' data.txt3.5.3 插入和追加操作
bash
# 在第一行前插入文本
sed '1i\Header line' data.txt
# 在匹配"Section"的行后追加文本
sed '/Section/a\New line after Section' data.txt
# 替换匹配"old line"的行
sed '/old line/c\New line' data.txt3.6 实际应用
bash
# 批量重命名文件
touch file1.txt file2.txt file3.txt
ls file*.txt | sed 's/file/new_file/' | xargs -n 2 mv
# 清理日志文件中的时间戳
sed 's/\[.*\] //' log.txt
# 提取IP地址
sed -n 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p' access.log4. awk工具
4.1 功能
awk是一种强大的文本处理工具,支持模式匹配、变量、函数和流程控制。
4.2 语法
bash
awk [选项] '模式 {动作}' [文件]4.3 常用选项
| 选项 | 描述 |
|---|---|
-F <分隔符> | 指定字段分隔符 |
-v <变量=值> | 定义变量 |
-f <脚本文件> | 从文件中读取awk脚本 |
4.4 内置变量
| 变量 | 描述 |
|---|---|
$0 | 整行内容 |
$1, $2, ... | 第1, 第2, ... 个字段 |
NF | 当前行的字段数 |
NR | 当前行号 |
FNR | 当前文件的行号 |
FS | 字段分隔符 |
OFS | 输出字段分隔符 |
RS | 记录分隔符 |
ORS | 输出记录分隔符 |
4.5 示例
4.5.1 基本操作
bash
# 打印文件的第1和第3个字段
awk '{print $1, $3}' data.txt
# 使用自定义分隔符
awk -F ',' '{print $1, $2}' data.csv
# 打印包含"error"的行的第1个字段
awk '/error/ {print $1}' log.txt4.5.2 条件和循环
bash
# 打印第2个字段大于10的行
awk '$2 > 10 {print}' data.txt
# 计算第2个字段的总和
awk '{sum += $2} END {print sum}' data.txt
# 统计每个唯一值出现的次数
awk '{count[$1]++} END {for (key in count) print key, count[key]}' data.txt4.5.3 格式化输出
bash
# 格式化输出
awk '{printf "Name: %-10s Age: %3d\n", $1, $2}' data.txt
# 设置输出分隔符
awk 'BEGIN {OFS=","} {print $1, $2, $3}' data.txt4.6 实际应用
bash
# 计算文件大小总和
ds -l | awk '{sum += $5} END {print sum}'
# 分析日志文件中的状态码
awk '{count[$9]++} END {for (code in count) print code, count[code]}' access.log
# 提取CSV文件中的特定列
awk -F ',' '{print $1, $4}' data.csv > new_data.csv
# 生成报告
awk 'BEGIN {print "Name\tAge\tScore"} {print $1 "\t" $2 "\t" $3}' data.txt5. 四种工具的比较
| 工具 | 主要功能 | 适用场景 | 优势 |
|---|---|---|---|
cut | 提取列或字段 | 简单的字段提取 | 语法简单,处理速度快 |
grep | 搜索匹配模式 | 查找特定内容 | 强大的正则表达式支持,搜索速度快 |
sed | 流编辑 | 文本替换、删除、插入 | 适合简单的文本修改,支持正则表达式 |
awk | 文本处理 | 复杂的文本分析和处理 | 支持变量、函数和流程控制,功能最强大 |
6. 组合使用示例
6.1 提取并处理数据
bash
# 从日志文件中提取错误信息,统计出现次数
grep "ERROR" app.log | cut -d ' ' -f 5- | sort | uniq -c | sort -nr
# 查找包含特定IP的访问记录,提取URL
grep "192.168.1.1" access.log | awk '{print $7}' | sort | uniq6.2 数据转换
bash
# 将CSV文件转换为空格分隔的文件
awk -F ',' '{print $1, $2, $3}' data.csv > data.txt
# 提取文件中的数字并计算平均值
grep -E "[0-9]+" data.txt | awk '{sum += $1} END {print sum/NR}'6.3 系统管理
bash
# 查找占用内存最多的进程
ps aux | sort -nr -k 4 | head -5 | awk '{print $1, $2, $4, $11}'
# 监控磁盘使用情况
df -h | awk '$5 > 80 {print "Warning: " $1 " is " $5 " full"}'7. 注意事项
7.1 性能考虑
- 对于大文件,
grep和cut通常比awk和sed更快 - 复杂的文本处理使用
awk更合适
7.2 正则表达式
grep和sed使用基本正则表达式,除非使用-E选项awk使用扩展正则表达式
7.3 文件修改
sed -i会直接修改文件,使用前建议备份awk默认输出到标准输出,需要重定向来保存修改
7.4 字段分隔符
- 当处理不同格式的文件时,确保正确设置分隔符
awk的FS变量可以设置为正则表达式
7.5 特殊字符处理
- 在模式中使用特殊字符时需要转义
- 注意引号的使用,避免shell解释变量
