Linux三剑客工具详解 sed grep awk

Linux三剑客:sed、grep、awk详解

Linux中的"三剑客"指的是三个强大的文本处理工具:grep、sed和awk。它们在文本搜索、替换和处理方面各有所长,经常被组合使用来解决复杂的文本处理问题。

1. grep - 文本搜索工具

grep (Global Regular Expression Print) 用于在文件中搜索匹配特定模式的行。

基本语法

grep [选项] 模式 [文件...]

常用选项

  • -i:忽略大小写
  • -v:反向选择,显示不匹配的行
  • -n:显示匹配行的行号
  • -c:只显示匹配的行数
  • -r-R:递归搜索目录
  • -l:只显示包含匹配项的文件名
  • -w:全词匹配
  • -A n:显示匹配行及其后n行
  • -B n:显示匹配行及其前n行
  • -C n:显示匹配行及其前后各n行

示例

# 在文件中搜索包含"error"的行
grep "error" logfile.txt

# 忽略大小写搜索
grep -i "error" logfile.txt

# 递归搜索目录中所有文件
grep -r "function" /path/to/dir

# 显示不包含"success"的行
grep -v "success" logfile.txt

# 统计匹配的行数
grep -c "warning" logfile.txt

2. sed - 流编辑器

sed (Stream Editor) 用于对输入流(文件或管道)进行基本的文本转换。

基本语法

sed [选项] '命令' 输入文件

常用选项

  • -e:指定要执行的命令
  • -f:指定包含sed脚本的文件
  • -i:直接修改文件内容(慎用)
  • -n:取消默认输出,常与p命令一起使用

常用命令

  • s:替换
  • p:打印
  • d:删除
  • a:追加
  • i:插入
  • c:更改行
  • y:转换字符
  • q:退出

示例

# 替换文件中的文本(不修改原文件)
sed 's/old/new/g' file.txt

# 直接修改文件(-i选项)
sed -i 's/old/new/g' file.txt

# 只打印匹配的行
sed -n '/pattern/p' file.txt

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

# 替换第5行的内容
sed '5c\new line content' file.txt

# 多命令执行
sed -e 's/foo/bar/g' -e 's/baz/qux/g' file.txt

# 在每行行首添加内容
sed 's/^/# /' file.txt

# 删除第10-20行
sed '10,20d' file.txt

3. awk - 模式扫描和处理语言

awk是一种编程语言,用于在文件中查找和处理模式,特别适合处理结构化文本数据(如日志、CSV等)。

基本语法

awk '模式 {动作}' 输入文件

内置变量

  • NR:当前记录数(行号)
  • NF:当前记录的字段数
  • FS:字段分隔符(默认是空格)
  • OFS:输出字段分隔符
  • RS:记录分隔符
  • ORS:输出记录分隔符
  • FILENAME:当前文件名
  • $0:整行内容
  • $1, $2, ..., $n:第n个字段

常用功能

  1. 字段处理:自动按分隔符分割行
  2. 算术运算:支持各种数学运算
  3. 条件判断:if/else等控制结构
  4. 循环:for/while循环
  5. 数组:支持关联数组
  6. 格式化输出:类似C语言的printf

示例

# 打印文件的第一列和第三列
awk '{print $1, $3}' file.txt

# 打印行号及整行内容
awk '{print NR, $0}' file.txt

# 使用冒号作为分隔符
awk -F: '{print $1, $6}' /etc/passwd

# 打印行数大于10的行
awk 'NR > 10' file.txt

# 计算第一列数值的总和
awk '{sum += $1} END {print sum}' file.txt

# 打印字段数大于3的行
awk 'NF > 3' file.txt

# 条件判断示例
awk '{if ($3 > 1000) print $1, "high"; else print $1, "low"}' data.txt

# 使用BEGIN和END块
awk 'BEGIN {print "Start Processing"} {print $0} END {print "End Processing"}' file.txt

# 统计每行单词数
awk '{print NF, $0}' file.txt

# 处理CSV文件
awk -F, '{print $2, $5}' data.csv

三剑客组合使用示例

  1. 查找包含"error"的行并统计出现次数
grep -i "error" logfile.txt | wc -l
  1. 替换文件中的文本并保存到新文件
sed 's/old/new/g' input.txt > output.txt
  1. 提取日志中的时间戳和错误信息
awk '/ERROR/ {print $1, $2, $NF}' logfile.txt
  1. 查找并替换多个文件中的文本
grep -rl "oldtext" . | xargs sed -i 's/oldtext/newtext/g'
  1. 统计访问日志中每个IP的访问次数
awk '{print $1}' access.log | sort | uniq -c | sort -nr
  1. 提取特定列并排序
awk -F: '{print $3, $1}' /etc/passwd | sort -n
  1. 复杂文本处理:提取、替换、统计
grep "GET" access.log | sed 's/.*\(192.168.1.[0-9]*\).*/\1/' | awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}'

总结

  • grep:最适合简单的文本搜索和过滤
  • sed:最适合基于行的文本转换和编辑
  • awk:最适合结构化文本的处理和报告生成

掌握这三者可以高效地处理Linux系统中的各种文本处理任务,无需编写复杂的脚本程序。它们各自强大,组合使用时更是威力无穷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值