尧图精选

Day6 Linux标准IO与日志文件处理

🕒 发布时间:2026/10/1 14:22:49 📁 来源:尧图网络
Linux 标准 IO输入/输出与日志文件处理继上一篇《目录、配置文件与日志文件管理》pwd、cp 等命令之后本篇讲解 Linux 中非常重要的一个基础概念——标准 IO以及围绕它衍生出的重定向、管道和三大文本处理工具grep / sed / awk。这些内容是后续做日志分析、故障排查和 Shell 脚本编写的地基。一、标准 IO三种数据流在 Linux 中一切皆文件程序的输入输出也被抽象为数据流。每执行一个命令系统都会为其默认打开三个数据流并用**文件描述符File Descriptor, fd**进行编号文件描述符名称英文默认指向说明0标准输入stdin (Standard Input)键盘程序读取数据的来源1标准输出stdout (Standard Output)终端屏幕程序正确结果的输出2标准错误stderr (Standard Error)终端屏幕程序错误信息的输出执行命令时正确结果和错误结果默认都会显示在终端中这是因为 stdout1和 stderr2的默认目的地都是终端设备。但它们本质是两条相互独立的流可以分别重定向到不同的地方——这是日志分离、错误排查的基础。验证示例# 同时产生标准输出和标准错误ls/etc/passwd /notexist输出中ls: cannot access /notexist: No such file or directory走的是 stderrfd 2而/etc/passwd走的是 stdoutfd 1。二、输出重定向、、2重定向的本质改变数据流的默认目的地把原本输出到屏幕的内容转存到文件中。1.覆盖式重定向标准输出将命令的正确结果写入文件文件原有内容会被清空覆盖。文件不存在则自动创建。# 把目录清单保存到文件ls-l/etcetc_list.txt# 清空一个文件利用空输出的覆盖特性app.log⚠️是覆盖写生产环境对重要文件操作前务必确认避免误清数据。2.追加式重定向标准输出与的唯一区别不清空原内容在文件末尾追加。日志记录场景几乎都用。# 持续记录系统负载不覆盖历史数据uptime/var/log/load_monitor.log# 多次执行内容逐行累积daterun.logecho任务执行完成run.log3.2/2重定向标准错误符号前的数字就是文件描述符。2只捕获错误输出正确结果仍显示在屏幕。# 把报错信息单独存到错误日志ls/notexist2error.log# find 遍历全盘时权限不足的报错很多丢弃到黑洞find/-namenginx.conf2/dev/null/dev/null是 Linux 的黑洞设备写入它的任何数据都会被直接丢弃常用于屏蔽无用输出。重点理解21它的含义是让 fd 2 指向 fd 1 当前指向的地方。下面两条命令顺序不同结果完全不同./app.shall.log21# ✅ 正确stdout 先进文件stderr 再跟随进文件./app.sh21all.log# ❌ 错误stderr 先跟随 stdout此时还是屏幕之后 stdout 才进文件三、输入重定向A改变的是输出的去向则相反让命令不再从键盘读取输入改为从文件中读取。# 统计文件行数注意wc -l file 与 wc -l file 输出格式略有差异wc-l/etc/passwd# 把文件内容作为邮件正文发送mail-s日报adminexample.comreport.txt# 批量创建用户时从文件读入用户列表whilereaduser;douseradd$user;doneusers.txt补充Here Document此处文档在脚本中内联提供多行输入catEOF/etc/motd 服务器已加固请勿违规操作 EOF四、管道|与tee1. 管道|命令之间的传送带管道将前一个命令的标准输出作为后一个命令的标准输入实现多个命令的串联协作。注意管道只传递 stdoutfd 1stderr 不会被传递。# 查看监听中的 TCP 端口ss-tlnp|grepLISTEN# 统计当前系统有多少个 bash 登录会话who|wc-l# 多级管道找出占用内存最高的前 5 个进程psaux--sort-%mem|head-6如需让错误输出也进入管道先合并数据流./app.sh21|grepERROR2.tee一份数据两处去向tee命令读取标准输入同时输出到屏幕和文件——就像水管上的三通接头。需要既看实时输出、又留档记录时非常实用。# 安装过程既在屏幕显示又保存到日志yuminstallnginx-y|teeinstall.log# -a 选项追加而非覆盖./deploy.sh|tee-adeploy_history.log# 配合 sudo 写入无权限的文件经典用法echo 本身没有权限靠 tee 提权写入echonet.ipv4.ip_forward 1|sudotee-a/etc/sysctl.conf五、grep 与正则表达式日志检索的利器grepGlobal Regular Expression Print按模式逐行过滤文本是日志分析中使用频率最高的命令。1. 常用选项选项作用示例-i忽略大小写grep -i error app.log-v反向匹配显示不含关键字的行grep -v ^# nginx.conf-n显示匹配行的行号grep -n failed secure.log-c只统计匹配的行数grep -c 404 access.log-r递归搜索目录grep -r password /etc/-w整词匹配grep -w root /etc/passwd-A n显示匹配行及其后n 行 (After)grep -A 3 ERROR app.log-B n显示匹配行及其前n 行 (Before)grep -B 3 ERROR app.log-E启用扩展正则等价于 egrepgrep -E 4042. 基础正则表达式BRE常用元字符符号含义示例^行首锚定grep ^root /etc/passwd匹配以 root 开头的行$行尾锚定grep bash$ /etc/passwd匹配以 bash 结尾的行.匹配任意单个字符grep r..t file可匹配 root、rust*前一个字符出现 0 次或多次grep ab*c file[...]字符集合grep [0-9] file匹配含数字的行[^...]字符集合取反grep -v ^# nginx.conf | grep -v ^$过滤注释和空行实战示例——分析 Nginx 访问日志# 找出所有 5xx 服务端错误grep-E 5[0-9]{2} /var/log/nginx/access.log# 统计今天 404 出现的次数grep-c404/var/log/nginx/access.log# 查看某个 IP 的全部访问记录grep192.168.10.100/var/log/nginx/access.log六、sed流式文本编辑器sedStream Editor逐行读取文本按规则进行增、删、改、查适合批量、非交互式的文本修改。1. 核心语法sed [选项] 动作 文件2. 替换最常用# 格式s/旧内容/新内容/标志# 只替换每行第一个匹配项默认seds/error/ERROR/app.log# g 标志替换每行所有匹配项seds/8080/9090/gnginx.conf# -i直接修改文件内容不带 -i 时只在屏幕预览不改原文件建议先预览再加 -ised-is/SELINUXenforcing/SELINUXdisabled//etc/selinux/config# 修改前自动备份原文件为 .baksed-i.baks/8080/9090/gnginx.conf3. 删除与按行操作# 删除第 5 行sed5dfile# 删除所有空行sed/^$/dfile# 删除所有注释行sed/^#/dnginx.conf# 只打印第 10~20 行配合 -n 抑制默认输出sed-n10,20papp.log4. 实战示例# 快速查看配置文件有效内容去掉注释和空行grep-v^#nginx.conf|grep-v^$|seds/^[ \t]*//# 批量把日志中的手机号脱敏扩展正则用 -r 或 -Esed-rs/(1[0-9]{2})[0-9]{4}([0-9]{4})/\1****\2/guser.log七、awk字段级文本处理与统计awk把每行文本按分隔符切分成字段列可精确取列、计算、汇总是处理日志和报表的瑞士军刀。![请添加图片描述](https://i-blog.csdnimg.cn/direct/5f071630c22d484d8883ab73c142643b.png1. 基本概念awk [选项] 模式 {动作} 文件默认以**空白字符空格/Tab**为分隔符-F可自定义$0表示整行$1、$2… 表示第 1、2… 列$NF表示最后一列NR当前行号NF当前行的字段数2. 取列最常用# 打印第 1 列查看所有用户名awk-F:{print $1}/etc/passwd# 打印第 1 列和第 3 列自定义输出格式awk-F:{print 用户: $1, UID: $3}/etc/passwd# 找出 UID 大于等于 1000 的普通用户条件过滤awk-F:$3 1000 {print $1}/etc/passwd3. 统计分析日志场景# 统计 access.log 中各 HTTP 状态码出现的次数awk{print $9}access.log|sort|uniq-c|sort-rn# 统计访问量最高的前 10 个 IPawk 内建数组直接完成awk{count[$1]} END {for (ip in count) print count[ip], ip}access.log|sort-rn|head-10# 计算某列总和统计磁盘各分区使用量之和df-m|awkNR1 {sum $3} END {print 总使用: sum MB}# 找出响应大小超过 1MB 的请求awk$10 1048576 {print $7, $10}access.log4. BEGIN / END 块# BEGIN 在处理前执行一次END 在处理完执行一次 —— 适合做表头和汇总awk-F:BEGIN {print 用户列表 } {print NR. $1} END {print 共 NR 个用户}/etc/passwd八、组合实战一次完整的日志排查假设线上接口报错需要排查 Nginx 日志典型排查链路如下# 1. 先看错误日志最近的 50 条记录tail-50/var/log/nginx/error.log# 2. 实时跟踪日志排障必备CtrlC 退出tail-f/var/log/nginx/access.log# 3. 定位今天 15 点左右的所有 500 错误并保存到文件备查grep30/Sep/2026:15access.log|grep 500 |tee500_errors.txt# 4. 统计这些错误是由哪些 IP 触发的按次数排序grep 500 access.log|awk{print $1}|sort|uniq-c|sort-rn|head# 5. 错误请求和正常流量分开归档重定向分离grep 500 access.log500.loggrep-v 500 access.lognormal.log这套组合拳就是 Linux 日志处理的核心思路grep 负责找sed 负责改awk 负责算重定向和管道负责串联与落盘。九、本篇小结知识点核心内容三种数据流0 标准输入、1 标准输出、2 标准错误默认分别指向键盘和终端输出重定向覆盖、追加、2重定向错误、/21合并输出输入重定向从文件读入、此处文档管道与 teegrep按行过滤-v/-n/-c/-i/-E高频选项配合正则精确匹配sed流式编辑s/old/new/g替换d删除-i落盘前先预览awk按列处理-F指定分隔符$1取列支持数组统计与汇总掌握这些命令后面对任何日志文件都能快速完成检索 → 过滤 → 统计 → 归档的完整处理流程这也是 SRE/运维日常排障的基本功。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →