Linux系统Shell脚本-----------正则表达式 文本三剑客之---------grep、 sed

news2025/2/3 21:56:17

一、正则表达式

1.前言


正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。在Linux中也就是代表我们定义的模式模板,Linux工具可以用它来过滤文本。

Linux的工具(如sed编辑器或者gawk程序)能够在处理数据时使用正则表达式对数据进行模式匹配,如果数据符合匹配的要求,那么就会进入下一步处理;如果数据不符合匹配的要求,就会被过滤掉。

通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。

正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等

主要用来匹配字符串(命令结果,文本内容)

2.正则表达式介绍

1、正则表达式---通常用于判断语句中,用来检查某一字符串是否满足某一格式

2、正则表达式是由普通字符与元字符组成

3、普通字符包括大小写字母、数字、标点符号及一些其他符号

4、元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符或表达式)在目标对象中的出现模式

3.正则表达式类型

  • 基本正则表达式  (BRE :basic regular expression)

  • 扩展正则表达式  (ERE:xtended regular expression)

  • 编程语言支持的高级正则表达式

man 7 regex
可以使用 man手册帮助

基本正则表达式 、 扩展正则表达式 的区别是不用写   \ (意思是转义)

grep sed  默认使用基础正则表达式
grep -E、 sed -r、   egrep、  awk  扩展正则表达式

4.正则表达式特点

元字符:预定义好的具有特殊含义的符号,这些符号能够进行通配

写正则表达式不难

可读性非常的差

二、基本正则表达式

1.元字符(字符匹配)

  • 普通字符包括大小写字母、数字、标点符号及一些其他符号。
  • 元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符( 即位于元字符前面的字符)在目标对象中的出现模式。

元字符:

注册用户   数字字母组成        20字符

\转义字符,可以把一些特殊的符号转换成普通的符号字符,还可以把一些普通字符转换成特殊功能,例:\!、\n、\$等
^表示匹配字符串开始的位置,匹配行首 例如: ^a    ^the    ^#   ^[a-z]
$表示匹配字符串结束的位置,例: word$
^$匹配空行
.匹配除\n之外的任意的一个字符,表示任意单个字符 例: go.d、 g…d
*匹配前面子表达式0次或者多次,例: goo*d、go.*d
.*

前面字符可以出现无数次,一到正无穷次,

但出现0次,不能匹配;最少出现一次

[ ]匹配[ ]中包含的任一字符,单个字符
[^] 匹配指定范围外的任意单个字符,示例:[^zhou]   [^a.z]    [a.z]
[^] 匹配指定范围外的任意单个字符,示例:[^zhou] [^a.z] [a.z]
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符 (水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
\w #匹配单词构成部分,等价于[_[:alnum:]]
\W #匹配非单词构成部分,等价于[^_[:alnum:]]
\S     #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s     #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意Unicode 正则表达式会匹配全角空格符


.  在方框中只代表  .  

.  不在方框中代表单个字符

[^]    匹配指定范围外的任意单个字符,示例: [^a.z]        [a.z]

标准格式   需要加  '   '   或者 "   "

abc   匹配字符串”abc",普通字符的匹配

[abcde ...]   匹配中括号内的任意单个字符
a[xyz]b    axb、ayb、azb,不能匹配aab amb

\n :匹配换行符
\t :匹配制表符
\w :匹配单词字符 [a-zA-Z0-9_]
\W :匹配非单词字符 [^a-zA-Z0-9_]
\s :匹配空白字符
\S :匹配非空白字符
\d :匹配数字
\D :匹配非数字
. 表示匹配任意单个字符

字符组:

普通中括号包围的字符组:表示某单个字符匹配中括号内的任一字符即匹配成功

x[abc]z:可以匹配包含”xaz” 、 "xbz"、"xcz"的字符串

取反表示法:中括号内开头使用^,表示只要不是中括号中的字符就匹配

x[^abc]z :可匹配包含"xdz"、“xez"等的字符串,但不能匹配包含"xaz”、“xbz”、“xcz”的字符串

范围表示法:

[a-z]:代表任一单个小写字母
[^a-z]:只要单个非小写字母的其它任一单个字符
[A-Z]:代表任一单个大写字母
[0-9]:代表任一单个数字

注:[0-59]   表示匹配0 、1、2、3、4、5、9 而不是0到59中间的数值

[a-z0-9A-Z]:代表任一字母或数字
[a-z0-9A-Z_]:代表任一字母、数字或下划线,即匹配单词字符 (word)
[A-z]或[a-Z]”: 建议不要使用这种横跨大小写字母的范围表达式,不同地方表达的含义不同,甚至有些按照字典顺序排序时,[a-d] 不是等价于abcd,而是等价于aBbCcDd。如果想要等价于abcd,应将locale环境设置为LC_ALL=C

特殊元字符在中括号中的匹配:
想要在中括号中匹配 ^  需将其放在中括号的非开头位置,如 [a^]

想要在中括号中匹配 -   需将其放在开头位置或结尾位置,如 [abc-] 、 [-abc] 

2.表示次数

*           #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.*          #任意长度的任意字符  不包括0次     
\?          #匹配其前面的字符出现0次或1次,即:可有可无
\+          #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\}       #匹配前面的字符n次
\{m,n\}     #匹配前面的字符至少m次,至多n次
\{,n\}      #匹配前面的字符至多n次,<=n
\{n,\}      #匹配前面的字符至少n次

  *   匹配前面子表达式出现0次或者多次

.*       任意长度的任意字符  不包括0次     至少出现1次

\?     匹配其前面的字符出现0次或1次,即:可有可无

\+   匹配其前面的字符出现最少1次, 即:肯定有且 >=1 次

\{n\}       匹配前面的字符n次

\{m,n\}    匹配前面的字符至少m次,至多n次

\{n,\}     匹配前面的字符至少n次

\{,n\}     匹配前面的字符最多n次

3.位置锚定

^ #行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行 (单独一行  只有root)
^$ #空行   
^[[:space:]]*$ #  空白行    tab   换行  回车


\< 或 \b        #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
\> 或 \b        #词尾锚定,用于单词模式的右侧
\<PATTERN\>     #匹配整个单词

\root\

4.分组或其他

分组:( ) 将多个字符捆绑在一起,当作一个整体处理,如:(root)+

后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名

方式为: \1, \2, \3, ... 分组

\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

或者
或者:\|

三、扩展正则表达式(表示字符相差不大)

grep -E

egrep 默认使用的 是扩展正则表达式

表示次数

*         匹配前面字符任意次
?        表示匹配前面的子表达式0或者1次
+        表示匹配前面的子表达式1次以上 (1次或多次)
{n}      匹配n次
{m,n}   至少m,至多n次
{,n}      匹配前面的字符至多n次,<=n,n可以为0
{n,}      匹配前面的字符至少n次,<=n,n可以为0

表示分组

( )

将括号里的内容看成一个整体
|以或的方式匹配字符串
+表示匹配前面的子表达式1次以上 (1次或多次)
表示匹配前面的子表达式0或者1次
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
后向引用:\1, \2, ...   
 | 或者  
a|b         #a或b
C|cat      #C或cat
(C|c)at    #Cat或cat

实验:

匹配 qq号    (一般qq号5到12位)

匹配 手机号    (一般11位)

匹配邮箱

四、grep

格式:  grep [选项]… 查找条件 目标文件              

grep 默认使用基础正则表达式

-m     #匹配#次后停止      匹配到 #行 停止   

-v     显示不被pattern匹配到的行,即取反

-i     忽略字符大小写

-n     显示匹配的行号

-c     统计匹配的行数 ,统计匹配到的行数

-o    仅显示匹配到的字符串

-q      静默模式,不输出任何信息    写脚本用哦

面试题: -A   -B  -C  这三个选项

-A          #after, 后#行 

-B        #before, 前#行

-C         #context, 前后各#行

-e     实现多个选项间的逻辑or关系     如:grep –e ‘cat ' -e ‘dog' file

-w       匹配整个单词

-E 使用ERE,相当于egrep   

-f   file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件   grep  -f   a    b
-r   递归目录,但不处理软链接     开始搜索目录
-R   递归目录,但处理软链接

面试题:

统计当前主机的连接状态             ss -nta | grep -v '^State' |cut -d" " -f1|sort |uniq -c

统计当前连接主机数                 ss -nt |tr -s " "|cut -d " " -f5|cut -d ":" -f1 |sort|uniq -c           

五、sed

sed 即 Stream EDitor,和 vi 不同,sed是行编辑器

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快

1.sed概述

sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

2.sed的工作流程

sed 的工作流程主要包括读取、执行和显示三个过程∶

读取∶ sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中 (又称模式空间,pattern space)
执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址, 否则sed 命令将会在所有的行上依次执行。
显示∶发送修改后的内容到输出流。在发送数据后, 模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

在所有的文件内容都被处理完成之前,上述过程将重复执行, 直至所有内容被处理完
注意∶ 默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

3.sed与vi的区别

vi命令打开文件是一次性将文件加载到内存,然后再打开。

Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快。

4.基本用法

sed [option]... 'script;script;...' [input  file...]
     选项         自身脚本语法         支持标准输入管道

5.sed脚本语法及命令

单引号中间需要写脚本;脚本格式如下:

'地址+命令' 组成     

地址:

1. 不给地址:对全文进行处理(比如行号)
2. 单地址:
   #:指定的行,$:最后一行
   /pattern/:被此处模式所能够匹配到的每一行,正则表达式
3. 地址范围:
   #,#     #从#行到第#行,3,6 从第3行到第6行
   #,+#   #从#行到+#行,3,+4 表示从3行到第7行
   /pat1/,/pat2/    第一个正则表达式和第二个正则表达式之间的行
   #,/pat/  从#号行为开始找到 pat为止 
   /pat/,#  找到#号个pat为止
4. 步进:~
     1~2 奇数行
     2~2 偶数行
sed -n 'n;p' testfile1		#打印偶数行
ed -n '2,${n;p}' testfile1

 不给地址:对全文进行处理(比如行号)

命令

p 打印当前模式空间内容,追加到默认输出之后
Ip 忽略大小写输出
d 删除模式空间匹配的行,并立即启用下一轮循环
a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w file 保存模式匹配的行至指定文件   seq 10 |sed -n '2wa.txt'
r file 读取指定文件的文本至模式空间中匹配到的行后    seq 10|sed '2r /etc/issue'
= 为模式空间中的行打印行号   sed '2=' /etc/passwd      sed -n -e '=;p' /etc/passwd
! 模式空间中匹配行取反处理seq 10 |sed -n '1~2!p'
q           结束或退出sed     seq 10 | sed '3q'

①sed脚本语法:地址+sed自己脚本命令,地址即范围例如全文或第一行,第一行至第三行等范围

②sed脚本命令:

p  打印当前模式空间内容  使用时关闭自动打印功能结合 -n 选项使用

q       结束或退出sed   

d      删除模式空间匹配的行,并立即启用下一轮循环

a   [\]text   在指定行后面追加文本,支持使用\n实现多行追加

i   [\]text   在行前面插入文本

c  [\]text 替换行为单行或多行文本

=   为模式空间中的行打印行号

w      file(文件) 保存模式匹配的行至指定文件

r       file 读取指定文件的文本至模式空间中匹配到的行后 

地址范围:

 不给地址:对全文进行处理(比如行号)

 #,#    #从#行到第#行

 /pat1/,/pat2/    第一个正则表达式和第二个正则表达式之间的行

步进:~
     1~2 奇数行
     2~2 偶数行

高级用法: 

sed -n 'n;p' testfile1        #打印偶数行
ed -n '2,${n;p}' testfile1

面试题:

如何打印一段时间间的日志

有一段时间本机访问量过高,如何查看日志提取出访问量前十的信息:

1.使用提取命令 (cut、awk、sed) 提取出ip地址的那一列

2使用sort按数字排序,将相同的地址整合到一起
3使用uniq -c统计出数量
4.使用sort 数字数字倒序排序
5.最后用head 取前十

6.sed选项

常用选项:

-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑[root@www data]#sed -n -e '/^r/p'  -e'/^b/p' /etc/passwd
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑

-i.bak 备份文件并原处编辑

-n 不输出模式空间内容到屏幕,即不自动打印,关闭自动打印

7.sed查找替换使用

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w   /PATH/FILE 将替换成功的行保存至文件中
I,i   忽略大小写

格式:sed '/可使用正则表达式选择范围/'   s/查找内容/替换内容/g

            g表示行内全局替换,固定格式的///可以用###等符号替换

注意:查找内容可使用正则表达式,替换内容不可使用正则表达式

查找替换    s/旧内容/新内容/修饰符    新内容一定是固定的字符串,你要修改的新内容

不打开配置文件进行修改

-i选项 备份selinux配置文件后缀加.bak  在config文件中找到SELINUX=enforcing修改为SELINUX=disabled,g表示所有搜索到的内容都替换。

分组替换:

只有扩展正则表达式才可以实现分组替换

分组后向引用

( )内的按顺序标为123 ,引用时\1调用第一个()的内容,\n表示调用第n个()的内容。

.*  表示任意长度字符不管是什么字符

\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

  1. -n选项关闭自动打印,-r  选项开启扩展正则表达式

  2. 's///'查找替换标准格式。三个()括起来的内容分别表示元素123,调用时改变调用顺序打印即可改变内容顺序

提取ip地址

方法一:

ifconfig ens33 |sed -nr   '2s/.*inet  (.*)   netmask.*/\1/p'


#查看ens33的网卡信息传给sed处理,-n选项关闭自动打印,-r选项开启扩展正则表达式
's///'查找替换标准格式,.*inet 表示以inet为止的前面所有字符 (.*) 括号表示使用反向引用
.*表示该处的任意字符 netmask.*表示以netmask开头后面的所有字符。\1表示反向引用第一个()的
内容,p表示打印出来。

方法二:

ifconfig ens33|sed -rn  '2s/.*inet ([0-9. ]+) .*/\1/p'

提取jar包的版本号:

提取ifcfg-ens33

提取network-scripts

提取文件的属性用数字显示

提取0644

提取0644

注意大小写哦

&指代前面找到的内容

8.变量

使用sed查询是可以直接调用变量

9.修改端口

10.修改网卡名

方法一:

sed -ri.bak '/^GRUB_CMDLINE_LINUX/s#(.*)"$#\1 net.ifnames=0"#' /etc/default/grub

方法二:

sed -ri.bak '/^GRUB_CMDLINE_LINUX/s#"$# net.ifnames=0"#' /etc/default/grub

11.sed的高级用法


sed 中除了模式空间,还另外还支持保持空间(Hold Spae), 利用此空间,可以将模式空间中的数据,临时保存至保持空间,从而后续接着处理,实现更为强大的功能。

常见的高级命令

P 打印模式空间开端至\n内容,并追加到默认输出之前
h 把模式空间中的内容覆盖至保持空间中
H 把模式空间中的内容追加至保持空间中
g 从保持空间取出数据覆盖至模式空间
G 从保持空间取出内容追加至模式空间
x 把模式空间中的内容与保持空间中的内容进行互换
n 读取匹配到的行的下一行覆盖至模式空间
N 读取匹配到的行的下一行追加至模式空间
d 删除模式空间中的行
D如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1427420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HAL库硬件SPI点亮板载LCD屏幕

1、本节内容介绍 1.1、HAL库硬件SPI 在cubemx中的配置及注意事项; 1.2、HAL库SPI详解与结构介绍; 1.3、实现硬件SPI驱动板载ST7789显示屏,240*240像素&#xff1b; 源码地址&#xff1a;https://gitee.com/MR_Wyf/hal-cubemx-rt-thread/tree/hal_rttNano_st7789_menu/ 或者…

多线程互斥量进阶

问题 一个线程多次尝试获取同一个互斥量&#xff0c;会发生什么&#xff1f; 不同类型的互斥量 Linux 上的示例程序 死锁的概念 等待关系 线程所需资源被其他线程所持有&#xff0c;进而必须等待 (无法继续执行) 循环等待 当线程之间出现循环等待关系时&#xff0c;即&…

2024美赛MCM Problem A: Resource Availability and Sex Ratios资源可用性和性别比例 完整代码以及思路分享

虽然一些动物物种存在于通常的雄性或雌性性别之外&#xff0c;但大多数物种实质上是雄性或雌性。虽然许多物种在出生时的性别比例为1&#xff1a;1&#xff0c;但其他物种的性别比例并不均匀。这被称为适应性性别比例的变化。例如&#xff0c;美洲短吻鳄孵化卵的巢穴的温度会影…

RIP——路由信息协议

目录 1 内部网关协议 RIP 1.1 协议 RIP 的工作原理 1.2 RIP“距离”的定义 1.3 RIP 协议的三个特点 1.4 RIP 协议的优缺点 1.5 路由表的建立 路由表主要信息和更新规则 2 距离向量算法 3 RIP2 报文 4 坏消息传播得慢 5 启动RIP 启动RIP: router rip 命令 启用和检…

TCP 连接掉线自动重连

文章目录 TCP 连接掉线自动重连定义使用连接效果 TCP 接收数据时防止掉线。TCP 连接掉线自动重连。多线程环境下TCP掉线自动重连。 欢迎讨论更好的方法&#xff01; TCP 连接掉线自动重连 定义 定义一个类&#xff0c;以编写TCP连接函数Connect()&#xff0c;并且&#xff1a…

vue-3d-loader

vue-3d-loader - npm GitHub - king2088/vue-3d-loader: VueJS and threeJS 3d viewer 是对 vue-3d-model 的改进&#xff0c;降低Threejs使用难度 # 默认安装 "vue-3d-loader": "^1.3.4", 只支持vue2 npm i vue-3d-loader # vue3 需要安装2版本&#xf…

2024美赛 MCMProblem B: Searching for Submersibles 问题B 搜索潜水器 完整思路代码分享

总部位于希腊的小型海上巡航潜艇&#xff08;MCMS&#xff09;公司&#xff0c;制造能够将人类运送到海洋最深处的潜水器。潜水器被移动到该位置&#xff0c;并不受主船的束缚。MCMS现在希望用他们的潜水器带游客在爱奥尼亚海底探险&#xff0c;寻找沉船。然而&#xff0c;在他…

homeword_day1

第一章 命名空间 一&#xff0e;选择题 1、编写C程序一般需经过的几个步骤依次是&#xff08; B &#xff09; A. 编辑、调试、编译、连接 B. 编辑、编译、连接、运行 C. 编译、调试、编辑、连接 D. 编译、编辑、连接、运行 2、所谓数据封装就是将一组数据和与这组数据…

Servlet简述

Servlet是动态web资源开发技术&#xff0c;其实就是一个接口&#xff0c;将来定义Servlet实现类时&#xff0c;都必须实现该接口&#xff0c;并让web服务器运行Servlet 1.快速入门 使用注释配置访问路径在Servlet3.0之后应用&#xff0c;在此之前都是使用xml配置文件来配置的。…

推荐一款Linux、数据库、Redis、MongoDB统一管理平台!

官方演示 状态查看 ssh 终端 文件操作 数据库操作 sql 编辑器 在线增删改查数据 Redis 操作 Mongo 操作 系统管理 账号管理 角色管理 资源管理 一.安装 1.下载安装包 cd /opt wget https://gitee.com/dromara/mayfly-go/releases/download/v1.7.1/mayfly-go-linux-amd64.zi…

Ruoyi-Cloud-Plus_Nacos配置服务漏洞CVE-2021-29441_官方解决方法以及_修改源码解决---SpringCloud工作笔记199

CVE-2021-29441 这个漏洞是Nacos的,通过使用postman,直接访问接口: 就可以直接添加nacos的用户 Nacos是Alibaba的一个动态服务发现、配置和服务管理平台。攻击者通过添加Nacos-Server的User-Agent头部将可绕过(nacos.core.auth.enabled=true)鉴权认证,从而进行API操作。 …

深度解析 Netty 架构与原理

一共 28661字&#xff0c;耐心看完。 在阅读本文前最好有 Java 的 IO 编程经验&#xff08;知道 Java 的各种 IO 流&#xff09;&#xff0c;以及 Java 网络编程经验&#xff08;用 ServerSocket 和 Socket 写过 demo&#xff09;&#xff0c;并对 Java NIO 有基本的认识&…

状态压缩 笔记

棋盘式的f[i][j]中表示状态的j可以是状态本身也可以是在合法状态state中的下标 用状态本身比较方便&#xff0c;用下标比较省空间 用下标的话可以开id[M]数组记录一下 蒙德里安的梦想 求把 NM的棋盘分割成若干个 12的长方形&#xff0c;有多少种方案。 例如当 N2&#xff0…

Camunda 流程引擎API介绍

&#x1f496;专栏简介 ✔️本专栏将从Camunda(卡蒙达) 7中的关键概念到实现中国式工作流相关功能。 ✔️文章中只包含演示核心代码及测试数据&#xff0c;完整代码可查看作者的开源项目snail-camunda ✔️请给snail-camunda 点颗星吧&#x1f618; &#x1f496;Services …

Map和Set讲解

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 集合框架 模型 Set 常见方法和说明 Set总结 Map说明 Map常见方法和说明 Map 中HashMap的 …

SpringBoot 使用定时任务(SpringTask)

Spring3.0以后自带的task&#xff0c;可以将它看成一个轻量级的Quartz&#xff0c;而且使用起来比Quartz简单许多。 使用步骤&#xff1a; 1.导入坐标 在spring-boot-starter-web坐标中&#xff0c;就包含了SpringTask&#xff0c;所以一般的Web项目都包含了。 <depende…

fastadmin导入excel并对导入数据处理

情景描述 fastadmin有自带的导入功能&#xff0c;但是不好用&#xff0c;它要求你的表格标题必须跟数据表的备注一致&#xff0c;而且拿到的数据是直接插入数据表&#xff0c;我们无法获取想要的数据并对数据进行处理&#xff1b;而且有时候我们只是想要单纯的读取文件功能&…

HTTP中传输协议的数据格式

HTTP 概述&#xff1a;超文本传输协议(Hyper Text Transfer Protocol) 传输协议&#xff1a;定义了客户端和服务器通信时&#xff0c;发送数据的格式 客户端和服务器端交互&#xff1a;客户端向服务器端发送请求&#xff0c;服务器端向客户端响应请求 HTTP特点&#xff1a;…

Aspose.Words简单使用

Aspose.Words简单使用 简介 Aspose.Words for Java 是一个用于处理和操作 Word 文档的强大 Java 库。本文档提供了使用 Maven 在你的 Java 项目中集成和使用 Aspose.Words 的简单步骤。 安装步骤 1. 配置 Aspose Maven 仓库 在你的 pom.xml 文件中添加以下配置&#xff0c…

python中的异步实践与tornado应用

最近项目中由于在python3中使用tornado,之前也有用过&#xff0c;是在python2中&#xff0c;由于对于协程理解不是很透彻&#xff0c;只是套用官方文档中的写法&#xff0c;最近比较细致的看了下协程的用法&#xff0c;也将tornado在python3中异步的实践了一下。 异步基础 要…