1. 项目概述说实话做了这么多年运维和开发我越来越觉得Shell编程里的正则表达式和文本处理三剑客grep、sed、awk才是真正拉开脚本水平差距的分水岭。很多初学者背了一堆命令参数真到处理日志、清洗数据、批量改配置的时候却无从下手问题大多出在没把正则和文本处理的逻辑打通。这个项目要解决的痛点非常明确在Shell脚本编写过程中如何高效地从文件、命令输出、日志流里提取、过滤、替换、统计文本内容。它适合所有跟Linux服务器打过交道的人——运维工程师、后端开发、数据分析师甚至刚入门的小白。你掌握了这套东西写脚本的效率会提升一个量级。我习惯把正则表达式比作“文本世界的模糊匹配语法”而文本处理器则是“批量操作文本的流水线工具”。两者结合几乎能处理日常工作中99%的文本需求。这篇文章我会从实际应用场景出发把这些工具的选型逻辑、核心参数、常见坑和实战案例全部拆开揉碎讲清楚。2. 工具选型逻辑为什么用这些文本处理器2.1 三剑客的定位差异很多初学者拿到一份文本处理需求第一反应是百度“Linux 提取某列 命令”然后抄一段awk了事。这其实没搞明白工具之间的定位差异。grep、sed、awk虽然都做文本处理但各自擅长的事情完全不同。grep的核心能力是“筛选”它的使命是从一堆文本里挑出符合条件的行。注意是“行”grep的单位是行它的输出结果默认也是整行。sed的核心能力是“编辑”它可以对文本进行替换、删除、插入、追加单位同样是行但它能做流式编辑不需要打开文件就能原地修改。awk的核心能力是“结构化分析”它把每一行按分隔符切分成多个字段然后对这些字段做运算、统计、格式化输出。用一个生活化的类比来解释grep是安检员只负责把可疑的人从队伍里揪出来sed是理发师能把队伍里每个人的发型修剪成你想要的样子awk是会计它能统计队伍里每个人的年龄、职业、收入还能算出平均值和总和。2.2 什么时候用哪个选工具看需求不看习惯。只是过滤日志找关键字用grep别杀鸡用牛刀。需要批量修改配置文件内容用sed那是它的主场。要做多列统计、分组汇总、生成报表awk是最合适的尤其是处理那种“一列一列”的数据。还有一种情况比较考验经验几个工具配合着用。比如先用grep把符合条件的行筛出来再管道给awk做字段统计最后用sed格式化输出。这种组合拳在日志分析场景里非常常见。我自己写脚本时有个习惯先把大需求拆成小步骤再给每个步骤选合适的工具而不是试图用一个工具解决所有问题。2.3 正则表达式在哪个层面起作用正则表达式本身不是命令它是一种模式描述语言被各个工具以各自的方式支持。在grep里用基础正则和扩展正则在sed里支持基础正则加-r参数才支持扩展正则在awk里默认就是扩展正则。这是一个非常容易踩的坑很多人把grep的写法直接套到sed上结果什么都不匹配。正则表达式还分“贪婪匹配”和“非贪婪匹配”。默认情况下*和都是贪婪的会尽可能匹配更长的字符串。这在某些场景下会带来意外结果比如提取HTML标签里的内容时贪婪匹配可能从头匹配到尾把中间所有内容都吞掉。好在grep和sed并不原生支持非贪婪模式只有Perl兼容正则有这个能力但我们可以通过字符集排除法来达到同样的效果。3. 正则表达式核心知识拆解3.1 基础正则与扩展正则的核心区别正则表达式的语法体系分为两大类基础正则表达式BRE和扩展正则表达式ERE。两者的区别主要在于元字符是否需要转义。在BRE中()和{}需要写成()和{}才有特殊意义而在ERE中直接写()和{}就行。举个例子要匹配连续出现3次的字母aBRE写法是a{3}ERE写法是a{3}。这个差异让很多人摸不着头脑尤其是从Python正则转过来的人在Linux里总要把括号和花括号加上反斜杠或者加上反斜杠反而失灵非常坑。实操中我这样记grep默认用BRE加-E参数后变成EREsed默认用BRE加-r参数后变成EREawk默认就是ERE不需要额外参数。只要你记住工具的默认参数和切换参数就不会再被这个坑绊住。3.2 常用元字符速查与记忆方法正则表达式里元字符不过二十多个但不同工具对它们的支持程度有细微差别。我整理了一个我自己一直在用的对照表标注了在用三剑客时哪些元字符可以直接用哪些需要转义哪些不支持。元字符含义grep(BRE)grep -Esed(BRE)awk^行首锚定支持支持支持支持$行尾锚定支持支持支持支持.任意单个字符支持支持支持支持*前一个字符重复0次或多次支持支持支持支持前一个字符重复1次或多次需转义支持需转义支持?前一个字符重复0次或1次需转义?支持需转义?支持{n,m}重复n到m次支持支持支持支持()分组需转义()支持需转义()支持|或逻辑需转义|支持需转义|支持[]字符集支持支持支持支持[^]排除字符集支持支持支持支持\b单词边界支持支持支持支持有一个记忆技巧凡是表示“数量”的元字符、?、{m,n}在ERE里都是直接写在BRE里都要加反斜杠。凡是表示“分组和分支”的元字符()和|同理。所以我在实际写脚本时凡是涉及这些字符一律用grep -E或sed -r彻底避开转义混乱的问题。3.3 贪婪匹配与最小匹配的处理技巧在处理日志和配置文件时贪婪匹配带来的问题非常典型。比如一行日志是这样[INFO] 2024-05-20 10:30:00 user login success from 192.168.1.100你想用正则提取时间戳。如果写成.*:.*贪婪匹配会从第一个冒号一直匹配到最后一个冒号把2024-05-20 10:30:00 user login success from 192.168.1全吞进去。解决这个问题的核心思路是“用字符集限制匹配范围”而不是依赖非贪婪模式。具体来说把.替换成[^:]写成[0-9]{2}:[0-9]{2}:[0-9]{2}这样不会超过你想要的边界。这是我处理时间、IP、端口等场景时最常用的技巧。3.4 正则表达式的性能隐患正则表达式写不好还有个隐患是性能。比如在处理几万行的日志时如果正则写得过于宽泛像.*.*.*这种连续通配匹配效率极低脚本运行时间可能从毫秒级飙升到秒级甚至分钟级。我在一次处理线上Nginx日志时就因为一个正则写得太贪导致脚本跑了将近20分钟才跑完。后来把正则精确定位到具体字段跑完只用了3秒。所以建议养成一个习惯正则能限定字符集就限定字符集能用锚点就用锚点能加次数限制就加次数限制。别图省事全用.省事一时后面耗时哭都来不及。4. 文本处理三剑客实操要点4.1 grep的进阶用法grep绝对是使用频率最高的文本处理命令但大多数人对它的认知停留在grep keyword filename。其实grep的参数设计非常精妙掌握几个关键参数能应对绝大多数场景。-E参数切换到扩展正则这个前面讲过用的频率非常高我一般直接alias一个egrep的别名来减少敲击。-v参数做反向匹配排除符合条件的行在过滤注释和空行时极其好用。-o参数只输出匹配到的部分而不是整行这个在做数据提取时特别有用。-c参数统计匹配行数而不是输出匹配内容适合快速统计某个关键字出现的次数。-A和-B参数分别控制匹配行之后和之前需要显示的上下文行数排查日志时配合grep -i忽略大小写使用效果拉满。我曾经处理过一个线上故障排查的场景线上服务突然报错日志量巨大直接grep ERROR app.log | head -n 50只能看到错误信息本身但我需要知道报错发生前用户做了什么操作。此时grep -B 5 ERROR app.log就能把错误行前5行一并输出问题原因立刻清晰起来。4.2 sed的流式编辑与原地修改sed是一个被低估的工具很多人只知道s/old/new/g替换实际上它的编辑能力非常强。最常见的用法是替换其中s表示替换操作g表示全局替换如果不加g只替换每行第一个匹配。注意分隔符不一定是/可以换成#、等当匹配内容里本身包含/的时候比如替换路径用#作分隔符就不需要转义了。这个细节我第一次写的时候没注意后来处理路径替换时踩了坑才长记性。sed的删除操作也很有用3d删除第3行/pattern/d删除匹配pattern的行1,10d删除第1到第10行。插入和追加分别用i和a但写法比较另类需要在命令后跟上要插入的内容比如sed /pattern/i\Insert this line before file。范围寻址是sed的强项/start/,/end/能匹配从start开始到end结束的所有行这在处理配置文件段落时特别有用比如批量修改Nginx中某个server块的路由规则。有一点必须强调sed默认不会直接修改文件内容它输出的是修改后的结果。如果不需要输出结果而是直接改文件需要加-i参数但-i参数在各Linux发行版上的表现有差异macOS上要求-i 而Linux上直接-i就行。我建议在脚本里用sed -i.bak这样会在修改前自动生成备份文件一旦改错了还能恢复。4.3 awk的字段处理与内置变量awk是文本处理三剑客里最难啃但也最强大的。它的核心模型是把每一行按分隔符切分成字段然后对字段做操作。默认分隔符是空格和制表符$1代表第一个字段$2代表第二个字段$0代表整行。NF表示每行字段总数NR表示当前处理到第几行。处理CSV或日志这类规整的文本我一般会先设置FS字段分隔符和OFS输出字段分隔符然后再写处理逻辑。比如awk -F , {print $1, $3} OFS--- file.csv输出时会用---把字段连接起来这个参数组合我在生成报表时几乎每次都用到。awk还有一个身份是“迷你编程语言”它支持变量、条件判断、循环、数组。最有价值的当属关联数组在做分组统计时极其顺手比如统计Nginx日志里每个IP的访问次数一行awk就能完成awk {count[$1]} END {for (ip in count) print ip, count[ip]} access.log | sort -k2 -rn | head -n 10。这个命令我几乎每天都会用到统计Top IP、Top URL、Top UA都靠它。awk的BEGIN块会在处理第一行之前执行END块会在处理完最后一行之后执行。BEGIN常用来初始化变量和设置分隔符END常用来输出统计结果。这种三段式结构让awk在处理数据时非常有逻辑层次。4.4 工具组合与小脚本实战单用一个工具解决不了复杂问题这是常态。我的经验是先用grep过滤无关行缩小处理范围再用sed做文本预处理把不规则的内容规整化最后用awk做字段分析输出结果。这条流水线是处理文本问题的通用思路。举个例子我一个日常任务从多台服务器的日志文件里提取今天所有404错误的访问IP统计每个IP出现的次数输出排行前5。命令串起来是cat /var/log/nginx/access.log* | grep 404 | awk {print $1} | sort | uniq -c | sort -rn | head -5。这里sort和uniq不是文本处理器三剑客但它们是流水线上环环相扣的组成部分。sort排序uniq去重计数最后sort按数字反向排序再用head截取前5条。这个组合几乎每个运维人都写过思路比背命令重要得多。5. 完整实操案例日志统计与配置批量修改5.1 场景定义与数据前置准备光讲理论没用我给你完整跑一遍我最近在做的实操任务。假设我有两份数据第一份是Nginx访问日志access.log格式如下192.168.1.10 - - [20/May/2024:10:15:30 0800] GET /api/v1/users HTTP/1.1 200 532 192.168.1.11 - - [20/May/2024:10:15:32 0800] GET /api/v1/products HTTP/1.1 200 1024 192.168.1.10 - - [20/May/2024:10:16:01 0800] GET /favicon.ico HTTP/1.1 404 22 192.168.1.12 - - [20/May/2024:10:17:20 0800] POST /api/v1/login HTTP/1.1 500 98第二份是MySQL配置文件my.cnf其中部分参数需要批量调整[mysqld] port3306 max_connections100 max_connect_errors10 character-set-serverutf8mb4我的目标是从日志中提取所有状态码是4xx或5xx的请求行统计每个IP发生错误请求的次数然后按次数降序输出同时把my.cnf里的max_connections从100改成200max_connect_errors从10改成20。5.2 日志分析完整过程第一步过滤出状态码为4xx或5xx的请求行。日志每行末尾就是状态码字段加上引号和空格正则要匹配到它。可以用grep -E (4|5)[0-9]{2} 这里的斜杠和引号需要小心转义我是这样写的grep -E HTTP/1\.[01] (4|5)[0-9]{2} access.log实测效果不错能精确匹配到404和500的行而200的行被过滤掉了。第二步提取IP字段。IP是每行的第一列用awk按空格切分后$1就是IP。在第一步结果的基础上管道给awkgrep -E HTTP/1\.[01] (4|5)[0-9]{2} access.log | awk {print $1}第三步统计IP出现次数并按次数排序。grep -E HTTP/1\.[01] (4|5)[0-9]{2} access.log | awk {print $1} | sort | uniq -c | sort -rn实测输出2 192.168.1.10 1 192.168.1.12这个结果直观展示了IP 192.168.1.10发生了2次错误请求192.168.1.12发生了1次。整个分析过程不到一秒钟。如果用Python写脚本去做好像也就那样但Shell一行搞定优势就在这里。5.3 配置文件批量修改完整过程现在处理my.cnf。需求是把max_connections100改成max_connections200max_connect_errors10改成max_connect_errors20。先模拟一个备份场景用sed -i.bak修改文件同时生成备份。命令是sed -i.bak -e s/^max_connections.*/max_connections200/ -e s/^max_connect_errors.*/max_connect_errors20/ my.cnf这里我在sed里用了两个-e参数分别是两个替换表达式。正则^max_connections.*限制了只能匹配以max_connections开头的内容其中^是行首锚定.*匹配从之后的所有字符防止误匹配到其他包含类似字符串的配置项。执行完看一下文件内容cat my.cnf输出结果[mysqld] port3306 max_connections200 max_connect_errors20 character-set-serverutf8mb4同时目录下自动生成了my.cnf.bak备份文件万一改错了可以随时恢复。这种修改配置文件的方式比用vim逐行手动修改要稳妥快捷得多尤其是面对几十台服务器时一个循环就能批量改完for host in $(cat servers.txt); do ssh $host sed -i.bak s/^max_connections.*/max_connections200/ /etc/my.cnf; done这里不得不提一个常见需求远程操作时需要交互式输入密码。手动输密码在你管理三五台服务器时还能忍机器一多就会让人崩溃。更合理的做法是配置好SSH密钥免密登录然后在shell的for循环里执行批量命令。我在管理几十台机器时都是先在本地生成公钥然后用ssh-copy-id一键分发到各服务器之后所有循环都能无人值守执行不会卡在密码输入环节等着人去敲键盘。5.4 与shell循环结合的高频操作for循环是shell脚本里最常和正则、文本处理器配合使用的结构。批量重命名文件、批量检查服务状态、批量处理日志几乎都离不开它。举一个批量重命名的案例。假设一个目录下有大量以.txt结尾的文件需要把其中的old_前缀统一改成new_前缀。用shell的for循环加sed参数替换可以写成for f in old_*.txt; do mv $f new_${f#old_}; done这个写法不依赖sed命令但充分展示了shell脚本中${f#old_}这种变量子串删除的写法。它把$f中匹配开头的old_删除再用new_拼接成新文件名配合循环一次性搞定。关于${}和$()的用法很多人一开始容易弄混${var}是取变量值$()是执行命令并返回结果。比如now$(date %s)是执行date命令而echo ${now}是输出变量now的值。这两个看似相似本质却完全不同。还有一类高频操作是用循环逐行读取文件内容然后对每一行做判断。比如检查一批URL的HTTP状态码是否正常while read -r url; do code$(curl -s -o /dev/null -w %{http_code} $url) if [ $code ! 200 ]; then echo $url returns $code fi done urls.txt这个脚本里$(curl ...)把curl命令的输出存入变量code-w %{http_code}让curl只输出状态码。这种处理方式在巡检场景里极其实用。5.5 组合技实战统计日志后自动生成报表把前面学到的内容组合成一个稍微复杂的场景统计访问日志中每种HTTP方法GET、POST、PUT、DELETE等的请求次数并生成一个带表头的报表。awk {print $6} access.log | tr -d | sort | uniq -c | sort -rn | awk BEGIN {print METHOD COUNT} {printf %-6s %d\n, $2, $1}这段命令的分解逻辑是第一段awk提取每行的第6个字段也就是HTTP方法因为日志格式里它是GET这样带引号的用tr -d 把引号删掉然后sort排序uniq -c计数sort按次数降序排列最后再交给awk格式化打印出对齐的表格。实际执行结果类似METHOD COUNT GET 8 POST 4 PUT 2 DELETE 1这段命令虽然用了5个工具但每个工具只负责一个小环节组合成流水线之后效率极高。这种“单点功能明确、管道串联协同”的思路是Shell文本处理的核心方法论。6. 常见问题与排查技巧实录6.1 特殊字符转义导致的匹配失败刚接触正则的人最常遇到的坑就是转义。比如想匹配包含点号的IP地址如果写成192.168.1.10在正则里.会匹配任意字符导致192X168X1X10这样的内容也能匹配上。正确写法是192\.168\.1\.10。同理匹配路径中的斜杠时在sed里如果还用/做分隔符就需要转义sed s/\/usr\/local/\/opt/g。更聪明的方式是换一个分隔符sed s#/usr/local#/opt#g。这个技巧能极大提升可读性我强烈推荐。6.2 中文处理与字符集处理中文内容时容易遇到一个尴尬问题正则里的.默认匹配不到中文字符的情况不太常见但[[:alnum:]]、\w这类字符类并不包含中文。如果你需要匹配中文字符最稳妥的方法是直接指定范围[一-龥]或者[\u4e00-\u9fa5]。这在日志分析、页面内容提取时是用得到的。还有一点要留意文件编码必须是UTF-8否则匹配结果会一团糟。用file命令可以快速确认文件编码我处理中文数据前都会先检查这一步免得把所有时间浪费在排查乱码上。6.3 变量与引号的使用误区在shell脚本里用正则引号是最容易出问题的地方。单引号和双引号的区别在于双引号内会做变量展开单引号内是字面量。如果你想把一个变量的值作为正则模式的一部分必须用双引号。实操中我经常这样用patternERROR grep $pattern app.log但如果正则本身包含$、!、反引号之类的特殊字符双引号可能会把它们解释成变量。这时可以用单引号加拼接的方式处理grep ERROR.*$date app.log。这类引号细节一旦写错脚本可能不会报错只是匹配结果完全不符合预期排查起来非常隐蔽。有一次我在处理日志提取时脚本运行结果一直不对排查了一个多小时才发现是双引号里的$1被shell当成位置参数展开变成了空字符串正则模式缺失了一大段自然匹配不到想要的内容。后来我养成一个习惯凡是正则模式里包含$符号就用单引号包裹整个模式如果确需插入变量就把变量单独用双引号包起来再拼接。6.4 常用问题速查表现象原因解决方法grep匹配结果比预期多正则中.未转义转义为\.或改用[^ ]限制sed替换没生效忘了加-i只输出了结果确认是否需要原地修改必要时加-i.bakawk输出的列不对分隔符设置错误确认-F参数或检查字段编号是否正确中文匹配失败文件编码不是UTF-8先用file检查编码再决定要不要转码脚本运行时变量被吞正则中$被shell解析用单引号包裹正则变量单独用双引号拼接循环中ssh卡在密码提示服务器未配置免密登录用ssh-copy-id分发公钥或改用expect处理输入for循环里文件名带空格变量未加双引号统一用$f这种写法包住变量匹配行过多导致输出爆炸正则写得太宽泛给正则加限定条件比如行首锚定、数量限制6.5 调试技巧与排错思路正则和文本处理的排错我有一套固定的方法论。第一步先用echo把要处理的文本打印出来确认数据格式和预期是否一致。第二步单独测试正则是否匹配正确比如echo test string | grep -E pattern不断缩小范围。第三步再把它套进管道命令里逐步增加复杂度。第四步实在不行用sed -n s/pattern//p来看一下到底哪些行被匹配到了代表整个匹配内容打印出来才能看到正则具体匹配了什么。这个方法虽然朴素但实战效果非常好。大多数时候问题出在“你以为的内容”和“实际的内容”有差异而不是工具本身用错。6.6 调试中的一个小技巧最后分享一个让我少走很多弯路的技巧在处理复杂的文本格式时先用cat -A查看文件内容它能显示出所有不可见字符包括行尾的$、Tab键的^I。有一次我在处理一个Windows格式的配置文件时正则怎么写都不匹配后来用cat -A一看每行末尾都带着^M$只有把\r处理掉才匹配成功。这个细节如果不亲眼看到凭猜恐怕很难定位到。7. 写在最后的一点体会文本处理这块内容说到底是“练”出来的。我第一次用awk做统计报表时花了大半天才拼出正确命令走了不知道多少弯路。但掌握了思路之后再复杂的文本处理需求我都能很快拆解成grep过滤、sed编辑、awk统计这几个环节。你可能背不住每个参数但你要能记住“我需要做什么”“哪类工具擅长这件事”然后去查参数用法效率会比死记硬背高得多。另外我强烈建议你在自己的机器上把这些命令亲手跑一遍。看十遍文章不如写一遍命令。遇到不对的就用echo慢慢试看看中间步骤的输出是什么很快就能建立起直觉。Shell编程最迷人的地方就在于任何复杂的文本处理都被抽象成了几个简单工具的协作你只需要把它们的接口接对剩下的就交给管道。
企业数字化 ERP 产品动态
相关推荐
Shell正则表达式与grep/sed/awk实战:日志分析与文本处理技巧 开头先讲个我最近实际遇到的场景。手里拿了一份三天前的nginx访问日志,将近1.2GB,老板让我把5xx错误请求全部筛出来,再按接口路径统计一下哪些上游接口最容易超时。我当时的第一个念头是:直接grep几个状态码不就行了吗?… · 2026/9/24 19:24:58
Java Web智慧医疗平台源码拆解:SpringBoot+Vue前后端分离实战 1. 医疗信息化项目,为什么值得你关注这套源码医疗行业的信息化改造一直是Java后端开发者绕不开的业务场景。早年间我做过的医疗项目大多是SSH框架配合JSP页面,前后端耦合严重,改个字段要同时动三四个文件。这两年随着SpringBoot和Vue这类前后… · 2026/9/24 19:24:58
BERT新闻分类实验:20NewsGroups微调全流程与避坑指南 简介:这份课程论文配套资源围绕20Newsgroups新闻分类实验展开,面向医学健康数据分析与挖掘课程的本科生或入门NLP学习者,用于理解BERT预训练模型在文本分类中的完整应用流程。压缩包共18个文件,以Python源码、txt数据、训练日志和… · 2026/9/24 19:24:51
猕猴桃目标检测数据集:1701张多角度真实摆拍,VOC+YOLO双格式 简介:本资源是一个专为计算机视觉目标检测任务构建的高质量猕猴桃(Kiwi)单类别数据集,适用于深度学习初学者、算法工程师及农业AI应用研究者,可直接用于YOLO系列、Faster R-CNN等主流检测模型的训练与验证。数据集共包… · 2026/9/24 19:57:15
日本路面缺陷检测数据集:YOLOv5 7类9712张图实战指南 简介:这份资源面向从事道路巡检、智能交通与计算机视觉方向的目标检测开发者,提供日本马路路面缺陷检测数据集,可直接用于YOLOv5训练与算法验证。数据按YOLOv5标准目录组织,无需额外转换即可投入训练,图像为600600的RG… · 2026/9/24 19:57:15
办公电脑开机密码怎么改?账户类型与密码策略全解析 1. 为什么办公电脑要单独管理开机密码前阵子帮一位同事处理电脑问题,他刚入职没多久,公司配的笔记本电脑用的是上一个离职员工留下的账户,登录密码则是IT部门给的临时密码。他问我:“我想改成自己的密码,应该去哪里改&… · 2026/9/24 19:57:15
SVR回归预测模型保存与加载完整指南 简介:这是一套完整的支持向量回归(SVR)预测项目代码与数据包,面向机器学习初学者和需要快速上手回归建模的开发者。资源围绕SVR模型的构建、训练、保存及加载预测展开,涵盖joblib持久化、超参数调优思路,并… · 2026/9/24 19:57:15
无人机边缘计算卸载优化:DDPG实战指南 简介:本资源是一套面向计算机、电子信息工程及数学专业本科生的无人机辅助移动边缘计算(UAV-MEC)计算卸载优化实践代码,聚焦深度确定性策略梯度(DDPG)算法在动态任务调度中的落地实现,适用于课程… · 2026/9/24 19:57:15
408数据结构真题解析:栈与队列综合应用之最小容量问题 考408的同学应该对“数据结构选择题第1题”都有印象——它往往是整套卷子里最容易拿分、也最容易因疏忽失分的一道题。2010年这道关于栈基础操作的真题,表面上是问“栈的容量至少是多少”,实际上考的是你有没有真正理解栈的后进先出特性,能不… · 2026/9/24 19:57:08
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44