Linux 文本处理之 sed

sed (Stream Editor, 流编辑器) 是 Linux 中的 文本处理工具, 常用于对文本进行 查找、替换、删除、插入、提取等批处理操作。 基本语法: sed [选项] '命令' 文件 # 或者: 命令 | sed [选项] '命令' 常用选项: 选项 说明 -n 默认 sed 会打印所有行, 使用 -n 后只会输出符合条件或被命令处理的行 -e 用于指定多条命令 -i 直接修改源文件(慎用, 建议先备份) -r 启用扩展正则表达式 (也可以用 -E) -f 从文件中读取 sed 命令 常用命令: 命令 说明 p 打印 d 删除 s/old/new/ 查找并替换 a\text 在当前行后追加一行 i\text 在当前行前插入一行 c\text 替换当前行内容 = 打印当前行号 q 处理到此行后退出 常见用法示例 打印文本 # 打印所有行: sed '' file.txt 打印匹配到 error 的行: sed -n '/error/p' file.txt # 只打印第 2 行: sed -n '2p' file.txt # 打印第 2 到第 4 行: sed -n '2,4p' file.txt 查找并替换 # 只替换每行的第一个匹配: sed 's/error/warning/' file.txt # 替换每行所有匹配: sed 's/error/warning/g' file.txt # 忽略大小写替换: sed 's/error/warning/gi' file.txt # 如果文本中有特殊字符, 如 /, 换分隔符: sed 's|/usr/local|/opt|g' file.txt # 使用变量: word="error" sed "s/$word/warning/g" file.txt # 替换并直接修改文件: sed -i 's/error/warning/g' file.txt # 直接修改文件并备份: sed -i.bak 's/error/warning/g' file.txt # 正则, 替换数字为 X: sed 's/[0-9]/X/g' file.txt 删除文本 # 删除第 2 行: sed '2d' file.txt # 删除第 2 到第 4 行: sed '2,4d' file.txt # 删除匹配 debug 的行: sed '/debug/d' file.txt # 删除所有空行: sed '/^$/d' file.txt # 删除以 # 开头的注释行: sed '/^#/d' file.txt 插入、追加、替换 # 在第 2 行前插入一行: sed '2i\This is a new line' file.txt # 在第 3 行后追加一行: sed '3a\Another new line' file.txt # 把第 2 行替换成新的内容: sed '2c\This line is replaced' file.txt

2025年08月22日

Linux 文本处理之 awk

引例 有个 1.txt 文件, 内容如下: 1755741361|文件1|事件1 1755741374|文件1|事件2 1755741385|文件2|事件3 第一个字段是时间戳, 在查看这个文件时为了看清时间, 需要把时间戳转为字符串: while IFS='|' read ts rest; do echo "$(date -d @$ts '+%Y-%m-%d %H:%M:%S')|$rest"; done < 1.txt 结果: 2025-08-21 09:56:01|文件1|事件1 2025-08-21 09:56:14|文件1|事件2 2025-08-21 09:56:25|文件2|事件3 用 awk 也可以实现一样的效果, 代码更简洁: awk -F'|' '{ OFS="|"; $1 = strftime("%Y-%m-%d %H:%M:%S", $1); print }' 1.txt awk 简介 awk 是 Linux 文本处理三剑客之一(grep, awk, sed)擅长 按行按列 处理数据。 awk 是一个 文本处理工具,也是一门轻量的脚本语言。 主要功能: 按行处理文本,按列处理数据。 使用场景: 日志分析、数据转换/提取等。 基本语法: awk 'pattern { action }' file pattern:模式,用来匹配哪些行需要处理. 省略 pattern 时, 所有行都执行动作 action:动作,告诉 awk 对匹配的行要做什么. 省略 action 时, 默认动作是 print $0(打印整行) ...

2025年08月21日

Linux: 运维篇

前两天写了 “Linux: shell 脚本篇”, 其中不涉及运维相关的内容, 因此新写了 “Linux: 运维篇” 作为补充. 磁盘与文件信息 df 命令 (disk free) df - 查看磁盘分区的空间使用情况 df -h # 参数说明: # -h 以人类可读的方式显示 (自动用 KB/MB/GB) # -T 显示文件系统类型 # -i 查看 inode 使用情况 (避免 inode 用完导致无法写入) du 命令 (disk usage) du - 查看目录或文件所占空间 du [选项] [文件/目录] 注意: du 显示的是磁盘实际占用大小, 可能和 ls -l 显示的文件大小不同, 因为磁盘按块分配空间 (即使文件很小也会占一个块) 常用参数: 参数 含义 示例 -h 以人类可读方式显示 (KB/MB/GB) du -h /var/log -s 只显示总计 (summary), 不递归 du -sh /var/log -a 显示目录和文件的大小 du -ah /var/log –max-depth=N 限制目录递归深度 du -h –max-depth=1 /var -c 显示总计 (最后一行 total) du -ch /var/log 常用组合: ...

2025年08月13日

Linux: shell 脚本篇

平时写 Java, Python, 甚至一些前端代码. 但最近工作上要写 shell 脚本, 发现有些生疏了, 这篇文章记录一些基本的 shell 脚本写法, 偶尔翻翻, 加深记忆. 因为此文目的是复习 常用的 shell 脚本写法, 所以文中不会很细节. set -euo pipefail set -euo pipefail 是三个 set 选项组合在一起,用来让脚本执行时更严格、更安全。 set -e 作用: 当任何命令返回 非零状态码(执行失败) 时,立刻退出整个脚本。 默认情况下,Bash 脚本就算中间某个命令失败,也会继续执行。 set -u 作用: 当脚本中使用未定义的变量时,立即报错并退出。 默认情况下,使用未定义变量会被当成空字符串处理,不会报错。 set -o pipefail 作用: 让管道 (|) 命令在任意一环节失败时,都返回失败状态码。 默认情况下,管道命令的返回值是最后一个命令的返回值。 如果前面命令失败,但最后一个命令成功,脚本也会认为成功,这是有风险的。 开启 pipefail 后,管道中只要有一个命令失败,整个管道就会被视为失败。 控制语句 条件判断(if/else) if [ 条件表达式 ]; then 命令 elif [ 条件表达式 ]; then 命令 else 命令 fi 例子: #!/bin/bash num=5 if [ $num -gt 10 ]; then echo "大于10" elif [ $num -eq 10 ]; then echo "等于10" else echo "小于10" fi 函数返回值: ...

2025年08月11日