grep/awk/sed笔记
基础概念
grep
、awk
和sed
是Linux中用于文本处理的三大工具,各自有不同的设计目标:
grep
:专注于文本搜索,支持正则表达式匹配。awk
:完整的文本处理语言,支持字段分割、计算和格式化输出。sed
:流编辑器,擅长对文本进行替换、删除、插入等操作。
grep常用操作
搜索包含关键词的行
grep "pattern" filename
忽略大小写
grep -i "pattern" filename
显示匹配行的行号
grep -n "pattern" filename
递归搜索目录
grep -r "pattern" /path/to/dir
反向匹配(不包含关键词的行)
grep -v "pattern" filename
awk常用操作
打印文件的第1列和第3列
awk '{print $1, $3}' filename
按条件过滤行(如第2列大于10的行)
awk '$2 > 10 {print $0}' filename
自定义分隔符(如以逗号分隔)
awk -F',' '{print $2}' filename
计算列的总和
awk '{sum += $1} END {print sum}' filename
内置变量示例(NR:行号,NF:字段数)
awk '{print NR, NF}' filename
sed常用操作
替换文本(首次匹配)
sed 's/old/new/' filename
替换所有匹配
sed 's/old/new/g' filename
删除匹配行
sed '/pattern/d' filename
在指定行后插入文本
sed '2a\inserted text' filename
直接修改文件(原地编辑)
sed -i 's/old/new/g' filename
组合使用示例
统计日志中404错误的数量
grep "404" access.log | awk '{print $7}' | sort | uniq -c
提取CSV文件的第2列并替换逗号
awk -F',' '{print $2}' data.csv | sed 's/,/ /g'
过滤包含关键词的行并显示行号
grep -n "error" syslog | awk -F: '{print "Line", $1, ":", $2}'
正则表达式支持
三工具均支持基础正则表达式(BRE),部分支持扩展正则表达式(ERE):
grep -E
:启用ERE(如+
,?
,|
)。awk
:默认支持ERE。sed -r
:部分版本支持ERE(如GNU sed)。
示例:匹配IP地址
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' logfile
性能对比
grep
:搜索速度最快,适合简单匹配。awk
:处理结构化数据(如CSV)更高效。sed
:批量编辑文件时性能优于手动操作。
常见问题
如何匹配多行模式?
grep
需搭配-z
选项(处理NUL分隔的数据)。sed
可用N
命令读取下一行。awk
通过设置RS
(记录分隔符)实现。
如何输出彩色结果?
grep --color=auto "pattern" filename
如何处理特殊字符(如制表符)?
awk
:-F'\t'
指定分隔符。sed
:用$'\t'
表示制表符(bash环境)。