Skip to content

Linux三剑客之sed

Linux 三剑客之 sed

简介

sed 是一种强大的文本处理工具,主要用于对文件中的文本进行非交互式的编辑操作。它可以在命令行中一次性处理多个文件,支持替换、删除、插入和调整文本内容,非常适合批量文本处理任务

sed 是 Linux 系统中三大文本处理工具之一,与 awkgrep 并称为“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 表达式

seds 表达式用于替换操作。

基本替换

  • 替换字符:
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 查找日志文件中的 404500 错误:

    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 统计分析
  • 使用 sedawk 统计日志文件中访问量最高的 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 三剑客实战