后端


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,London

1.4.2 按字符位置提取

bash
# 提取前5个字符
cut -c 1-5 data.txt

# 提取第3个字符
cut -c 3 data.txt

# 提取从第3个字符开始的所有字符
cut -c 3- data.txt

1.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-3

2. 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.txt

2.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.txt

2.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.log

3. 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.txt

3.5.2 删除操作

bash
# 删除空行
sed '/^$/d' data.txt

# 删除包含"error"的行
sed '/error/d' data.txt

# 删除第5行
sed '5d' data.txt

# 删除第2到第5行
sed '2,5d' data.txt

3.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.txt

3.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.log

4. 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.txt

4.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.txt

4.5.3 格式化输出

bash
# 格式化输出
awk '{printf "Name: %-10s Age: %3d\n", $1, $2}' data.txt

# 设置输出分隔符
awk 'BEGIN {OFS=","} {print $1, $2, $3}' data.txt

4.6 实际应用

bash
# 计算文件大小总和
ls -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.txt

5. 四种工具的比较

工具主要功能适用场景优势
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 | uniq

6.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解释变量