当前位置: 首页 > news >正文

Linux进阶系列(四)——awk、sed、端口管理、crontab

目录

  • 1. 写在前面
  • 2. awk —— 强大的文本处理工具
    • 2.1 awk 概述
    • 2.2 awk 脚本结构
    • 2.3 awk 的内置变量
    • 2.4 awk 的高级用法
    • 2.5 awk实践
  • 3. sed —— 流式文本编辑器
    • 3.1 sed 的基本语法
    • 3.2 sed 常用命令
    • 3.3 sed 的高级用法
  • 4. Linux 端口管理
    • 4.1 端口的概念
    • 4.2 查看端口状态
    • 4.3 开放与关闭端口
  • 5. crontab —— Linux 定时任务管理
    • 5.1 crontab 的基本用法
    • 5.2 crontab 的时间格式
    • 5.3 crontab 的特殊字符
    • 5.4 crontab 的环境变量与日志
  • Ref

1. 写在前面

在 Linux 系统的运维和管理中,处理文本、调度任务、以及管理端口是极为重要的工作环节。对于一个系统管理员或者开发人员来说,能否熟练地运用 Linux 系统提供的工具,不仅影响着日常工作的效率,还关乎整个系统的安全性和稳定性。在这些工具中,awksed 是两种非常强大且灵活的文本处理工具,它们不仅能够轻松应对大多数的文本处理需求,还能与其他工具组合使用,解决复杂问题。而 crontab 则是 Linux 系统中用于管理周期性任务的命令,让我们能够高效地调度和自动化重复性任务。最后,了解并熟悉如何管理网络端口,则是保障系统网络安全和服务质量的重要手段。本文将详细探讨 awksed、Linux 端口管理和 crontab 的用法,帮助你更好地掌握 Linux 运维的关键技能。

2. awk —— 强大的文本处理工具

2.1 awk 概述

awk 是 Linux 系统中一个非常强大的文本处理语言,主要用于从文件或者输入流中扫描、提取和操作文本内容。其灵活的模式匹配和处理功能,特别适合于处理结构化文本数据,例如日志文件、CSV 文件等。与许多传统的文本处理工具相比,awk 不仅功能强大,而且简洁高效,它内置的许多功能可以让用户通过极少的代码实现复杂的文本处理任务。此外,awk 还支持通过编写脚本实现更复杂的操作,甚至可以在多个文件之间处理数据。它内置了许多用于文本分割、统计和输出的变量和函数,使其成为文本处理工作中的一把利器。

awk 的基本调用方式如下:

awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)

这里的 script 是处理文本的核心代码,用户可以通过编写简单的 script 来对输入文件或流进行操作。awk 提供了一系列选项,使用户可以灵活地控制处理过程。例如,-F 选项用于指定字段分隔符,-v 选项可以给用户自定义的变量赋值,而 -f 选项则允许从脚本文件中读取 awk 命令,便于将更复杂的操作存储在外部文件中。

2.2 awk 脚本结构

awk 脚本通常包含三个部分:BEGINpatternEND。每一部分的作用不同,执行的顺序也有所不同。

  • BEGIN 语句块:在文本处理开始前执行,通常用于初始化变量、打印表头等操作。
  • pattern 语句块:对输入文件的每一行进行处理,匹配特定的条件后执行相应的操作。
  • END 语句块:当所有输入行处理完毕后执行,常用于打印汇总结果、清理资源等。

例如,以下是一个典型的 awk 脚本示例:

echo "A line 1\nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }'

这个脚本首先在 BEGIN 块中打印了 Start,然后处理每一行内容,并在 END 块中打印 End。这个流程展示了 awk 处理文本的基本结构,便于用户理解如何根据不同的场景编写对应的 awk 脚本。

2.3 awk 的内置变量

为了简化操作,awk 提供了许多内置的变量帮助处理文本。例如:

  • $0:当前行的所有文本。无论该行包含多少字段,$0 都会捕获整个行内容。
  • $1, $2, ...:当前行的第 1 个、第 2 个字段。通过 $n,用户可以访问当前行中的特定字段,这在处理多列数据时非常有用。
  • NF:当前行的字段数。通过 NF,用户可以轻松获取一行中有多少个字段,这在字段数量不固定的情况下非常实用。
  • NR:当前行号。NR 表示处理到的行号,便于统计和跟踪数据处理进度。
  • FS:输入字段分隔符,默认为空格,但用户可以通过 -F 选项自定义分隔符。

使用这些变量,用户可以高效地从文本中提取需要的数据。例如,下面的例子展示了如何使用 $1$2 来提取文本的前两个字段:

echo -e "line1 f2 f3\nline2 f4 f5" | awk '{print $1, $2}'

输出结果为:

line1 f2
line2 f4

这种简洁的语法使 awk 在处理字段分隔的数据时具有极高的效率,特别是当处理 CSV 文件、日志文件等格式化文本时,awk 能够快速提取和操作数据。

2.4 awk 的高级用法

awk 不仅仅支持简单的文本处理,还可以进行复杂的逻辑判断和运算。awk 支持多种运算符和判断条件,使其能够轻松应对复杂的场景。例如:

  • 算术运算符+-*/%^,用于基本的数值运算。
  • 逻辑运算符&&||,用于条件判断。
  • 正则表达式~ 用于模式匹配,!~ 用于不匹配。
  • 关系运算符<<=>>=!===,用于比较操作。

例如,下面的示例展示了如何使用逻辑运算符和条件判断:

awk 'BEGIN{a=1; b=2; print (a>5 && b<=2), (a>5 || b<=2);}'

输出结果为:

0 1

该示例中,通过逻辑运算符 &&|| 来判断两个变量的大小关系,并根据判断结果输出 01。这种灵活的语法让 awk 在处理数据时不仅仅局限于简单的文本操作,还可以进行复杂的数据分析和条件筛选。

2.5 awk实践

awk 还可以用于执行一些常见的文本处理任务。例如:

统计文件的行数:

awk 'END{ print NR }' filename

该命令将在处理完文件的所有行后,输出文件的总行数,这对于日志分析等场景非常有用。

提取并操作字段:

awk '{print $1, $3}' filename

该命令提取文件中每一行的第 1 和第 3 个字段,并将其输出,可以用于快速查看特定列的数据。

传递外部变量:

awk 支持通过 -v 选项传递外部变量,允许用户灵活地在脚本中使用外部参数。例如:

VAR=100
awk -v var=$VAR '{print var}'

这将把外部变量 VAR 的值传递给 awk 脚本,并在脚本中使用。

3. sed —— 流式文本编辑器

sed 是另一种强大的文本处理工具,它与 awk 的功能互补,尤其擅长逐行编辑和修改文本流。通过使用 sed,用户可以执行插入、删除、替换、查找等操作,并且不会改变源文件,除非使用 -i 选项进行文件修改。其高效、灵活的设计使其成为 Linux 系统管理中不可或缺的工具。

3.1 sed 的基本语法

sed 的基本调用语法如下:

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

常用选项包括:

  • -e:允许指定多个 sed 命令在一次执行中处理输入文件。
  • -i:直接编辑源文件,而非仅仅输出结果。
  • -n:关闭默认输出,仅输出处理结果。
  • -f:从脚本文件中读取命令,适用于复杂的操作。

3.2 sed 常用命令

替换命令 s

替换文本中的某个模式:

sed 's/old/new/g' filename

该命令将在文件中将所有 old 替换为 newg 表示全局替换,即替换每一行中的所有匹配项。

删除命令 d

删除指定行或符合条件的行:

sed '2d' filename

该命令将删除文件中的第二行,适用于删除日志文件中的某些无效数据等场景。

插入和附加命令 ia

插入或附加文本到指定行:

sed '2i\新内容' filename  # 在第二行前插入
sed '2a\新内容' filename  # 在第二行后插入

这些命令可以用于在文件的某些特定位置插入或附加新内容。

3.3 sed 的高级用法

sed 还支持多次命令执行和高级的正则表达式处理,适用于更复杂的文本操作场景。例如:

多次替换

sed -e 's/test/check/' -e 's/old/new/' filename

此命令将一次性执行两次替换操作:将 test 替换为 check,并将 old 替换为 new

删除空白行

sed '/^$/d' filename

该命令删除文件中的所有空白行,常用于清理文本文件的冗余数据。

4. Linux 端口管理

在 Linux 系统中,端口是网络通信的一个重要概念。通过端口,操作系统可以区分并管理多个并发的网络服务。系统管理员需要定期检查端口的状态,确保系统中的服务正常运行,同时避免不必要的端口开放带来的安全隐患。

4.1 端口的概念

每个端口号都对应着一种服务,例如:

  • 20, 21:FTP
  • 22:SSH
  • 80:HTTP
  • 443:HTTPS

通过这些端口号,系统能够识别并管理不同的网络服务。在 Linux 系统中,常见的端口管理工具包括 netstatsslsof

4.2 查看端口状态

管理员可以通过以下命令查看系统中哪些端口正在被监听或者被占用:

使用 netstat

netstat -tuln

netstat 是一个老牌工具,用于显示网络连接、路由表、接口统计数据、伪装连接和多播成员等信息。

使用 ss

ss -tuln

ssnetstat 的替代工具,它执行相同的功能,但更快、更现代化。

使用 lsof

lsof -i :port

lsof 则是一个列出系统中打开文件的工具,可以通过端口号列出哪些进程正在使用该端口。

4.3 开放与关闭端口

在 Linux 系统中,管理员可以使用 iptables 或者 firewalld 来控制端口的开启和关闭:

使用 iptables 开放和关闭端口

# 开放端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT# 关闭端口
iptables -A INPUT -p tcp --dport 80 -j DROP

通过上述命令,管理员可以根据需要打开或关闭特定的端口,从而管理服务的访问权限。

使用 firewalld 管理端口

# 开放端口
firewall-cmd --zone=public --add-port=80/tcp --permanent# 关闭端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent

firewalld 是一个更现代的防火墙管理工具,它允许管理员以更加动态和持久的方式来控制网络端口的访问权限。

5. crontab —— Linux 定时任务管理

在 Linux 系统中,crontab 提供了一种灵活的方式来定期执行任务。与 Windows 的任务计划类似,crontab 能够指定任务在特定的时间点执行,例如定期备份数据、运行脚本、或者清理日志文件等。通过 crontab,我们可以实现任务的自动化,减少手动操作的频率,提高工作效率。

5.1 crontab 的基本用法

crontab 的基本语法如下:

crontab [-u user] file
crontab [-u user] { -e | -l | -r }

其中,-e 用于编辑用户的 crontab 文件,-l 用于列出当前用户的定时任务,-r 则用于删除 crontab 文件。crontab 还可以通过 -u 选项指定某个用户的任务管理文件,便于管理员在多用户系统中进行管理。

5.2 crontab 的时间格式

crontab 文件中的每一行表示一个定时任务,其时间字段格式如下:

* * * * * command
- - - - -
| | | | |
| | | | +----- 星期几 (0 - 7, 0 和 7 表示星期天)
| | | +--------- 月份 (1 - 12)
| | +------------- 日期 (1 - 31)
| +------------------ 小时 (0 - 23)
+--------------------- 分钟 (0 - 59)

这种格式非常灵活,可以根据需求精确地设定任务的执行时间。例如:

每 5 分钟执行一次任务

*/5 * * * * /path/to/script.sh

每天凌晨 1 点执行备份任务

0 1 * * * /path/to/backup.sh

每周一上午 8:30 执行清理任务

30 8 * * 1 /path/to/cleanup.sh

5.3 crontab 的特殊字符

crontab 还支持一些特殊字符,使得时间调度更加灵活。例如:

  • *:表示所有可能的值。例如,在 分钟 字段中使用 *,表示每分钟都执行任务。
  • ,:用于分隔多个值。例如 1,15 表示任务将在第 1 分钟和第 15 分钟执行。
  • -:表示一个范围。例如 1-5 表示任务将在第 1 分钟到第 5 分钟之间执行。
  • /:用于指定间隔频率。例如 */5 表示任务将每隔 5 分钟执行一次。

这些特殊字符的组合使用能够进一步提高任务调度的灵活性。例如,以下命令表示每隔 5 分钟执行一次任务:

*/5 * * * * /path/to/script.sh

5.4 crontab 的环境变量与日志

crontab 在执行任务时,可能会遇到环境变量设置的问题。为了确保任务顺利执行,建议在 crontab 中显式设置环境变量,或者使用脚本的绝对路径。此外,crontab 的日志文件通常位于 /var/log/cron,当任务执行失败时,可以通过查看该文件获取错误信息并进行调试。


Ref

[1] https://wangchujiang.com/linux-command/c/awk.html

相关文章:

Linux进阶系列(四)——awk、sed、端口管理、crontab

目录 1. 写在前面2. awk —— 强大的文本处理工具2.1 awk 概述2.2 awk 脚本结构2.3 awk 的内置变量2.4 awk 的高级用法2.5 awk实践 3. sed —— 流式文本编辑器3.1 sed 的基本语法3.2 sed 常用命令3.3 sed 的高级用法 4. Linux 端口管理4.1 端口的概念4.2 查看端口状态4.3 开放…...

利用Metasploit进行信息收集与扫描

Metasploit之信息收集和扫描 在本文中&#xff0c;我们将学习以下内容 使用Metasploit被动收集信息 使用Metasploit主动收集信息 使用Nmap进行端口扫描 使用db_nmap方式进行端口扫描 使用ARP进行主机发现 UDP服务探测 SMB扫描和枚举 SSH版本扫描 FTP扫描 SMTP枚举 …...

基于Pytorch框架的深度学习MODNet网络精细人像分割系统源码

第一步&#xff1a;准备数据 人像精细分割数据&#xff0c;可分割出头发丝&#xff0c;为PPM-100开源数据 第二步&#xff1a;搭建模型 MODNet网络结构如图所示&#xff0c;主要包含3个部分&#xff1a;semantic estimation&#xff08;S分支&#xff09;、detail prediction…...

Go语言中的并发编程

Go语言中的并发编程Go语言中的并发编程主要依赖于两个核心概念&#xff1a;goroutine 和 channel。1. Goroutinegoroutine 的特点结束 goroutine2. Channel创建 Channel发送和接收数据Channel 的类型使用 select 语句简单的多个 goroutine使用 WaitGroup 等待所有 goroutine 完…...

python学习笔记(3)——控制语句

控制语句 我们在前面学习的过程中&#xff0c;都是很短的示例代码&#xff0c;没有进行复杂的操作。现在&#xff0c;我们将开始学习流程控制语句。 前面学习的变量、数据类型&#xff08;整数、浮点数、布尔&#xff09;、序列&#xff08;字符串、列表、元组、字 典、集合&am…...

关系数据库设计之Armstrong公理详解

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 一、Armstrong公理简介 Armstrong公理是一组在关系数据库理论中用于推导属性依赖的基本规则。这些公理是以著名计算机科学家威廉阿姆斯特朗&…...

【Geoserver使用】SRS处理选项

文章目录 前言一、Geoserver的三种SRS处理二、对Bounding Boxes计算的影响总结 前言 今天来看看Geoserver中发布图层时的坐标参考处理这一项。根据Geoserver官方文档&#xff0c;坐标参考系统 (CRS) 定义了地理参考空间数据与地球表面实际位置的关系。CRS 是更通用的模型&…...

python里面的单引号和双引号的区别

在Python中&#xff0c;单引号&#xff08;‘’&#xff09;和双引号&#xff08;“”&#xff09;在大多数情况下是等价的&#xff0c;没有本质区别。它们都用于创建字符串。以下是一些关键点&#xff1a; 功能相同&#xff1a; 两者都可以用来定义字符串&#xff0c;例如&…...

为什么不要在循环,条件或嵌套函数中调用hooks

为什么不要在循环&#xff0c;条件或嵌套函数中调用hooks 前言useState Hook 的工作原理具体实现1、初始化2、第一次渲染3、后续渲染4、事件处理简单代码实现 为什么顺序很重要Bad Component 第一次渲染Bad Component 第二次渲染 总结 前言 自从 React 推出 hooks 的 API 后&a…...

将成功请求的数据 放入apipost接口测试工具,发送给后端后,部分符号丢失

将成功请求的数据 放入apipost接口测试工具&#xff0c;发送给后端后&#xff0c;部分符号丢失 apipost、接口测试、符号、丢失、错乱、变成空格背景 做CA对接&#xff0c;保存CA系统的校验数据&#xff0c;需要模仿前端请求调起接口&#xff0c;以便测试功能完整性。 问题描…...

N诺计算机考研-错题

B A.LLC,逻辑链路控制子层。一个主机中可能有多个进程在运行,它们可能同时与其他的一些进程(在同一主机或多个主机中)进行通信。因此在一个主机的 LLC子层的一个服务访问点,以便向多个进程提供服务。B.MAC地址,称为物理地址、硬件地址,也称为局域网地址,用来定义网络设…...

vue3 数字滚动组件封装

相关参考文献 干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React) Vue3 插件方式 安装插件: countup.js 封装组件: components/count-up/index.js <template><div class="countup-wrap"><slot name="prefix"></slot&g…...

如何确保消息只被消费一次:Java实现详解

引言 在分布式系统中&#xff0c;消息传递是系统组件间通信的重要方式&#xff0c;而确保消息在传递过程中只被消费一次是一个关键问题。如果一个消息被多次消费&#xff0c;可能会导致业务逻辑重复执行&#xff0c;进而产生数据不一致、错误操作等问题。特别是在金融、电商等…...

Web3技术在元宇宙中的应用:从区块链到智能合约

随着元宇宙的兴起&#xff0c;Web3技术正逐渐成为其基础&#xff0c;推动着数字空间的重塑。元宇宙不仅是一个虚拟世界&#xff0c;它还代表着一个由去中心化技术驱动的新生态系统。在这个系统中&#xff0c;区块链和智能合约发挥着至关重要的作用&#xff0c;为用户提供安全、…...

关于QSizeGrip在ui界面存在布局的情况下的不显示问题

直接重写resizeEvent你会发现&#xff1a;grip并没有显示 void XXXXX::resizeEvent(QResizeEvent *event) {QWidget::resizeEvent(event);this->m_sizeGrip->move(this->width() - this->m_sizeGrip->width() - 3,this->height() - this->m_sizeGrip->…...

开始场景的制作+气泡特效的添加

3D场景或2D场景的切换 1.新建项目时选择3D项目或2D项目 2.如下图操作&#xff1a; 开始前的固有流程 按照如下步骤进行操作&#xff0c;于步骤3中更改Company Name等属性&#xff1a; 本案例分辨率可以如下设置&#xff0c;有能力者可根据需要自行调整&#xff1a; 场景制作…...

位运算--(二进制中1的个数)

位运算是计算机科学中一种高效的操作方式&#xff0c;常用于处理二进制数据。在Java中&#xff0c;位运算通常通过位移操作符和位与操作符实现。 当然位运算还有一些其他的奇淫巧计&#xff0c;今天介绍两个常用的位运算方法&#xff1a;返回整数x的二进制第k位的值和返回x的最…...

使用Docker和Macvlan驱动程序模拟跨主机跨网段通信

以下是使用Docker和Macvlan驱动程序模拟跨主机跨网段通信的架构图&#xff1a; #mermaid-svg-b7wuGoTr6eQYSNHJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-b7wuGoTr6eQYSNHJ .error-icon{fill:#552222;}#mermai…...

RestCloud webservice 流程设计

RestCloud webservice 流程设计 操作步骤 离线数据集成&#xff08;首页&#xff09; → \rightarrow → 示例应用数据集成流程&#xff08;边栏&#xff09; → \rightarrow → 所有数据流程 → \rightarrow → webservice节点获取城市列表 → \rightarrow → 流程设计 …...

从入门到精通:QT 100个关键技术关键词

Qt基础概念 Qt Framework - 一个跨平台的C图形用户界面应用程序开发框架。它不仅提供了丰富的GUI组件&#xff0c;还包括网络、数据库访问、多媒体支持等功能。 Qt Creator - Qt官方提供的集成开发环境&#xff08;IDE&#xff09;&#xff0c;集成了代码编辑器、项目管理工具、…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...