Linux三剑客之sed
Linux 三剑客之 sed
简介
sed
是一种强大的文本处理工具,主要用于对文件中的文本进行非交互式的编辑操作。它可以在命令行中一次性处理多个文件,支持替换、删除、插入和调整文本内容,非常适合批量文本处理任务
sed
是 Linux 系统中三大文本处理工具之一,与 awk
和 grep
并称为“Linux 三剑客”。
优点
- 高效:能够快速处理大文件,不需要将整个文件加载到内存中。
- 灵活:支持正则表达式,可以进行复杂的文本匹配和替换操作。
- 可脚本化:可以将
sed
命令编写成脚本,方便自动化处理。 - 跨平台:支持多种操作系统,包括 Linux、Unix 和 macOS。
sed 基本语法与常用参数
基本语法
sed [addr]X[options]
addr
:指定操作的行或行范围。X
:表示操作命令。[options]
:其他选项参数。
常用参数
-e
:指定要执行的 sed 表达式。-n
:抑制默认输出,仅打印指定内容。-i
:直接修改源文件。-E
:启用扩展正则表达式。--debug
:启用调试模式。
sed pattern 表达式
行数与行数范围
-
指定行数
sed '20p' 文件名
20p
:打印第20行。
-
指定行数范围
sed '30,35p' 文件名
30,35p
:打印第 30 行到第 35 行。
正则匹配
-
匹配包含
pattern
的行sed '/pattern/p' 文件名
/pattern/p
:打印包含pattern
的行。
区间匹配
-
匹配两个模式之间的所有行:
sed '/pattern1/,/pattern2/p' 文件名
/pattern1/,/pattern2/p
:打印从匹配pattern1
到匹配pattern2
之间的所有行。
sed action 表达式
打印
-
打印指定行
sed -n '2p' 文件名
-n
:抑制默认输出。2p
:打印第二行。
替换
-
查找替换
sed 's/REGEXP/REPLACEMENT/[FLAGS]' 文件名
s/REGEXP/REPLACEMENT/[FLAGS]
:用REPLACEMENT
替换匹配REGEXP
的内容。
删除
-
删除指定行
sed '1,2d' 文件名
1,2d
:删除第一行和第二行。
追加
-
在指定行后追加内容
sed '2a\新内容' 文件名
2a\新内容
:在第二行后追加新内容
。
改变
-
改变指定行的内容
sed '2c\新内容' 文件名
2c\新内容
:将第二行的内容改为新内容
。
插入
-
在指定行前插入内容
sed '2i\新内容' 文件名
2i\新内容
:在第二行前插入新内容
。
执行命令
-
执行命令
sed '2e ls' 文件名
2e ls
:在第二行执行ls
命令。
分组匹配与字段提取
- 使用分组匹配和字段提取
sed 's#\([0-9]\)_\([a-z]\)_#\1 \2#' 文件名
s#\([0-9]\)_\([a-z]\)_#\1 \2#
:将匹配的数字和字母用空格分隔。
行数操作
打印特定行
- 打印第二行:
sed -n '2p' 文件名
-n
:抑制默认输出。2p
:打印第二行。
删除最后一行
- 删除最后一行:
sed '$d' 文件名
$d
:删除最后一行。
s 表达式
sed
的 s
表达式用于替换操作。
基本替换
- 替换字符:
echo a:b:c | sed 's/:/123&/'
输出:
a123:b:c
s/:/123&/
:将冒号替换为123:
。
替换并追加字符:
echo a:b:c | sed 's/:/&123/'
输出:
a:123b:c
s/:/&123/
:将冒号替换为:123
。
全局替换:
echo a:b:c | sed 's#:#|#g'
输出:
a|b|c
s#:#|#g
:将所有冒号替换为竖线。
反向引用
分组与引用
-
使用 () 对数据进行分组,并使用 \1、\2 反向引用分组:
echo 0 1 2 3 4 | sed -E 's#([1-3]) ([1-3]) ([1-3])#\3 \2 \1#' 输出: 0 3 2 1 4
s#([1-3]) ([1-3]) ([1-3])#\3 \2 \1#
:将匹配的第一个到第三个数字反转顺序。
Linux 三剑客实战
日志数据检索
找出 log 中的 404 500 的报错
-
使用
sed
查找日志文件中的404
和500
错误:sed -n '/404/p;/500/p' log文件
-n
:抑制默认输出。/404/p
:打印包含 404 的行。/500/p
:打印包含 500 的行。
上下文检索
找出 500 错误时候的上下文
-
使用
sed
查找500
错误及其上下文:sed -n '/500/{N;p;}' log文件
-n
:抑制默认输出。/500/{N;p;}
:匹配 500 错误行,读取下一行并打印。
日志数据统计
找出访问量最高的 ip 统计分析
-
使用
sed
和awk
统计日志文件中访问量最高的 IP:sed -n 's/.*IP: \([0-9.]*\).*/\1/p' log文件 | sort | uniq -c | sort -nr | head -n 1
sed -n 's/.*IP: \([0-9.]*\).*/\1/p'
:提取 IP 地址。sort
:排序 IP 地址。uniq -c
:统计每个 IP 的出现次数。sort -nr
:按降序排序。head -n 1
:输出出现次数最多的 IP。
数据文件修改
找出访问量最高的页面地址并修改
- 使用
sed
找出访问量最高的页面地址并修改:
sed -n 's/.*URL: \(.*\).*/\1/p' log文件 | sort | uniq -c | sort -nr | head -n 1 | xargs -I {} sed -i 's#{}#新地址#g' log文件
sed -n 's/.*URL: \(.*\).*/\1/p'
:提取 URL 地址。sort
:排序 URL 地址。uniq -c
:统计每个 URL 的出现次数。sort -nr
:按降序排序。head -n 1
:输出出现次数最多的 URL。xargs -I {}
:将出现次数最多的 URL 作为参数传递给 sed。sed -i 's#{}#新地址#g'
:将出现次数最多的 URL 替换为新地址。
总结
- 简介
- 优点
- sed 基本用法与常用参数
- sed pattern 表达式
- sed action 表达式
- 行数操作
- s 表达式
- 反向引用
- Linux 三剑客实战