做付费动漫网站免费域名注册2023
2026/4/18 13:40:11 网站建设 项目流程
做付费动漫网站,免费域名注册2023,阿里指数在线查询,北仑建设局质监站网站前言 grep、sed、awk 被称为 Linux 文本处理三剑客。日志分析、数据提取、批量替换……日常运维离不开这三个工具。很多人只会基础用法#xff0c;遇到复杂需求就抓瞎。 本文整理三剑客的实用技巧#xff0c;从基础语法到实际场景#xff0c;配合大量示例。1. grep#xff…前言grep、sed、awk 被称为 Linux 文本处理三剑客。日志分析、数据提取、批量替换……日常运维离不开这三个工具。很多人只会基础用法遇到复杂需求就抓瞎。本文整理三剑客的实用技巧从基础语法到实际场景配合大量示例。1. grep文本搜索1.1 基础用法# 基本搜索greperrorapp.log# 忽略大小写grep-ierrorapp.log# 显示行号grep-nerrorapp.log# 显示匹配行的前后文grep-A3errorapp.log# 后3行grep-B3errorapp.log# 前3行grep-C3errorapp.log# 前后各3行# 递归搜索目录grep-rTODOsrc/# 只显示文件名grep-lerror*.log# 统计匹配次数grep-cerrorapp.log# 反向匹配不包含grep-vdebugapp.log1.2 正则表达式# 基础正则BREgrep^startfile# 以start开头grepend$file# 以end结尾grepa.bfile# a和b之间有任意字符grepab*file# a后面有0个或多个b# 扩展正则EREgrep-Eerror|warnfile# 或grep-Eabfile# a后面有1个或多个bgrep-Eab?file# a后面有0个或1个bgrep-Ea{2,4}file# 2到4个agrep-E[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}file# IP地址# Perl正则更强大grep-P\d{4}-\d{2}-\d{2}file# 日期格式grep-P(?user:)\wfile# 零宽断言1.3 实用场景# 搜索日志中的错误grep-E(ERROR|FATAL)app.log|tail-20# 搜索特定时间段的日志grep2025-01-08 10:app.log# 搜索IP地址grep-oE\b([0-9]{1,3}\.){3}[0-9]{1,3}\baccess.log# 统计每个IP的访问次数grep-oE\b([0-9]{1,3}\.){3}[0-9]{1,3}\baccess.log|sort|uniq-c|sort-rn|head# 搜索多个关键词都包含greperrorapp.log|grepdatabase# 排除某些文件grep-rpassword--include*.py--exclude*test*src/# 只显示匹配的内容不是整行grep-ouser_id[0-9]*app.log2. sed流编辑器2.1 基础替换# 替换第一个匹配seds/old/new/file# 替换所有匹配seds/old/new/gfile# 忽略大小写seds/old/new/gifile# 直接修改文件危险操作建议先备份sed-is/old/new/gfilesed-i.baks/old/new/gfile# 自动备份# 只处理特定行sed5s/old/new/gfile# 第5行sed1,10s/old/new/gfile# 1-10行sed/pattern/s/old/new/gfile# 匹配pattern的行2.2 删除操作# 删除特定行sed5dfile# 删除第5行sed1,10dfile# 删除1-10行sed/pattern/dfile# 删除匹配的行sed/^$/dfile# 删除空行sed/^#/dfile# 删除注释行# 删除行首/行尾空格seds/^[ \t]*//file# 行首seds/[ \t]*$//file# 行尾seds/^[ \t]*//;s/[ \t]*$//file# 两端2.3 插入和追加# 在第3行后插入sed3a\新内容file# 在第3行前插入sed3i\新内容file# 在匹配行后插入sed/pattern/a\新内容file# 替换整行sed3c\新的一行filesed/pattern/c\新的一行file2.4 高级用法# 使用分组和引用seds/\(.*\):\(.*\)/\2:\1/file# 交换冒号两边的内容# 多个替换sed-es/a/A/g-es/b/B/gfileseds/a/A/g; s/b/B/gfile# 打印特定行sed-n5pfile# 只打印第5行sed-n5,10pfile# 只打印5-10行sed-n/pattern/pfile# 只打印匹配行# 使用变量oldfoonewbarseds/$old/$new/gfile# 注意用双引号# 使用不同的分隔符处理路径时有用seds|/usr/local|/opt|gfileseds#/usr/local#/opt#gfile2.5 实用场景# 修改配置文件sed-is/^#Port 22/Port 2222//etc/ssh/sshd_config# 批量替换文件内容find.-name*.txt-execsed-is/old/new/g{}\;# 删除HTML标签seds/[^]*//gfile.html# 提取两个标记之间的内容sed-n/START/,/END/pfile# 在每行前面加行号sedfile|sedN;s/\n/\t/# 每行末尾追加内容seds/$/ END/file# 处理Windows换行符seds/\r$//filesed-is/\r$//file3. awk数据处理3.1 基础语法# 基本格式awkpattern { action }file# 打印特定列awk{print $1}file# 第1列awk{print $1, $3}file# 第1和第3列awk{print $NF}file# 最后一列awk{print $(NF-1)}file# 倒数第二列# 指定分隔符awk-F:{print $1}/etc/passwdawk-F,{print $1, $2}data.csv# 条件过滤awk$3 100 {print $0}fileawk/error/ {print $0}file3.2 内置变量变量含义$0整行内容1−1-1−n第n个字段NF字段数量NR当前行号FNR当前文件的行号FS字段分隔符OFS输出字段分隔符RS记录分隔符ORS输出记录分隔符# 使用内置变量awk{print NR, $0}file# 带行号awkNR5file# 第5行awkNR5 NR10file# 5-10行awkEND {print NR}file# 总行数3.3 BEGIN和END# BEGIN处理前执行# END处理后执行awkBEGIN {print 开始} {print $0} END {print 结束}file# 计算总和awkBEGIN {sum0} {sum$1} END {print 总和:, sum}file# 计算平均值awk{sum$1; count} END {print 平均:, sum/count}file# 设置输出分隔符awkBEGIN {OFS,} {print $1, $2, $3}file3.4 条件和循环# if条件awk{if ($3100) print $1, 高; else print $1, 低}file# for循环awk{for(i1; iNF; i) print $i}file# while循环awk{i1; while(iNF) {print $i; i}}file# 数组awk{count[$1]} END {for(k in count) print k, count[k]}file3.5 实用场景# 统计日志中各状态码的数量awk{print $9}access.log|sort|uniq-c|sort-rn# 用awk实现awk{status[$9]} END {for(s in status) print s, status[s]}access.log# 计算请求平均响应时间awk{sum$NF; count} END {print 平均响应时间:, sum/count, ms}access.log# 找出响应时间最长的请求awkBEGIN {max0} {if($NFmax) {max$NF; line$0}} END {print line}access.log# 统计每小时请求量awk-F[: ]{hour[$5]} END {for(h in hour) print h:00, hour[h]}access.log|sort# 提取特定格式的数据awk-F/GET/ {print $2}access.log|awk{print $2}|sort|uniq-c|sort-rn|head# 格式化输出awk{printf %-20s %10d\n, $1, $2}file# 处理CSVawk-F,{print $1, $3}data.csv# 过滤并统计awk/ERROR/ {count; print} END {print 共, count, 个错误}app.log3.6 复杂示例# 日志分析统计每个IP的请求量和流量awk{ ip$1 requests[ip] bytes[ip]$10 } END { printf %-20s %10s %15s\n, IP, 请求数, 流量(MB) for(ip in requests) { printf %-20s %10d %15.2f\n, ip, requests[ip], bytes[ip]/1024/1024 } }access.log|sort-k2 -rn|head-20# 实时监控日志tail-f access.log|awk/ERROR/ {print strftime(%Y-%m-%d %H:%M:%S), $0}# 多文件处理awkFNR1 {print 文件:, FILENAME} {print}file1 file2# 关联数组实现joinawk-F,NRFNR {a[$1]$2; next} {print $0, a[$1]}file1 file24. 组合使用4.1 管道组合# grep awk先过滤再处理grepERRORapp.log|awk{print $1, $2, $NF}# grep sed先过滤再替换grep-lold_api*.py|xargssed-is/old_api/new_api/g# awk sort uniq统计分析awk{print $1}access.log|sort|uniq-c|sort-rn|head-10# 完整的日志分析流程cataccess.log|\grep2025-01-08|\awk$9500 {print $1, $7}|\sort|uniq-c|sort-rn|head-204.2 实战案例案例1分析Nginx访问日志#!/bin/bash# nginx_log_analysis.shLOG_FILE${1:-/var/log/nginx/access.log}echo Nginx日志分析 echo日志文件:$LOG_FILEechoecho【请求总量】wc-l$LOG_FILEechoecho【状态码分布】awk{print $9}$LOG_FILE|sort|uniq-c|sort-rnechoecho【Top 10 IP】awk{print $1}$LOG_FILE|sort|uniq-c|sort-rn|head-10echoecho【Top 10 URL】awk{print $7}$LOG_FILE|sort|uniq-c|sort-rn|head-10echoecho【4xx/5xx 错误】awk$9~/^[45]/ {print $9, $7}$LOG_FILE|sort|uniq-c|sort-rn|head-10案例2批量修改配置文件#!/bin/bash# update_config.shCONFIG_DIR/etc/myappOLD_VALUElocalhostNEW_VALUE192.168.1.100# 查找需要修改的文件echo以下文件将被修改grep-rl$OLD_VALUE$CONFIG_DIRread-p确认修改(y/n) confirmif[[$confirmy]];thengrep-rl$OLD_VALUE$CONFIG_DIR|xargssed-i.baks/$OLD_VALUE/$NEW_VALUE/gecho修改完成fi案例3日志实时监控告警#!/bin/bash# log_monitor.shLOG_FILE/var/log/app/app.logERROR_THRESHOLD10CHECK_INTERVAL60whiletrue;do# 统计最近1分钟的错误数error_count$(tail-1000$LOG_FILE|\awk-vtime$(date -d1 minute ago%Y-%m-%d %H:%M)\$0 ~ time /ERROR/ {count} END {print count0})if[[$error_count-gt$ERROR_THRESHOLD]];thenecho[$(date)] 告警: 最近1分钟错误数$error_count超过阈值$ERROR_THRESHOLD# 发送告警fisleep$CHECK_INTERVALdone5. 性能优化5.1 大文件处理# 使用LC_ALLC提升性能LC_ALLCgreppatternhuge_file.log# 并行处理cathuge_file.log|parallel --pipegreppattern# 分块处理split-l1000000huge_file.log chunk_forfinchunk_*;dogreppattern$fdonewait# 使用ripgrep比grep快rgpatternhuge_file.log5.2 避免常见陷阱# 错误多次读取文件count$(grep-cerrorfile)lines$(greperrorfile)# 正确一次读取result$(greperrorfile)count$(echo$result|wc-l)# 错误不必要的catcatfile|greppattern# 正确直接读取greppatternfile# 错误循环中频繁调用外部命令whilereadline;doecho$line|greppatterndonefile# 正确一次性处理greppatternfile总结工具适用场景常用参数grep搜索、过滤-i(忽略大小写) -n(行号) -r(递归) -E(正则) -v(反向)sed替换、删除-i(原地修改) -n(静默) s/old/new/g(替换) d(删除)awk列处理、统计-F(分隔符) NR(行号) NF(列数) $n(第n列)使用原则简单搜索用 grep简单替换用 sed列处理和统计用 awk复杂场景组合使用学习建议从简单用法开始逐步掌握正则表达式多练习实际场景比如日志分析遇到复杂需求先想清楚再写避免过度嵌套更多运维技术文章欢迎关注公众号北平的秋葵

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询