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

正则表达式与文本处理

目录

一、正则表达式

1、正则表达式定义

1.1正则表达式的概念及作用

1.2、正则表达式的工具

1.3、正则表达式的组成

2、基础正则表达式

3、扩展正则表达式

4、元字符操作

4.1、查找特定字符

4.2、利用中括号“[]”来查找集合字符

4.3、查找行首“^”与行尾字符“$”

4.4、查找任意一个字符“.”与重复字符“*”

4.5、查找连续字符范围“{}”

二、、grep语句

1、grep用法

2、grep案例

2.1、统计root字符总行数

 2.2、不区分大小写查找the所有的行

2.3、将没有出现 root 的行取出来

2.4、过滤出IP

三、sed命令

1、sed概述

1.1、sed定义

1.2、sed工作原理

2、sed基本用法

3、sed具体操作

3.1、打印输出

3.1.2、显示范围 行号

3.1.3、奇偶数表示

3.2、增加内容

3.3、删除

3.4、替换

3.5、插入文件

3.6、同时编辑

3.7、读取完退出

四、awk命令

1、awk定义

2、工作原理

3、工作流程

3.1、运行模式

3.2、执行流程

4、基本语法

4.1、命令格式

5、实验操作

5.1、内建变量

5.2、内置变量

5.3、BEGIN END 运算

5.4、awk高级用法

5.5、awk if语句

5.6、BEGIN END 循环

五、总结


一、正则表达式

1、正则表达式定义

1.1正则表达式的概念及作用

正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于描述字符串模式的工具。它是一种强大的文本处理工具,用于查找、匹配、替换或验证字符串中的文本数据。

正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。


1.2、正则表达式的工具

  • grep
  • sed
  • awk
  • egrep 

1.3、正则表达式的组成

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

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

LINUX 中常用的有两种正则表达式引擎

  • 基础正则表达式:BRE
  • 扩展正则表达式: ERE

2、基础正则表达式

支持的工具

  • grep
  • egrep
  • sed
  • awk

转义字符:

符号描述
\转义符,将特殊字符进行转义,忽略其特殊意义。
^匹配行首,匹配字符串的开始。
$匹配行尾,匹配字符串的结尾。
.匹配除换行符 \r\n 之外的任意单个字符。
[list]匹配 list 列表中的一个字符。
[^list]匹配任意不在 list 列表中的一个字符。
*匹配前面子表达式 0 次或者多次。
\{n\}匹配前面的子表达式 n 次。
\{n,\}匹配前面的子表达式不少于 n 次。
\{n,m\}匹配前面的子表达式 n 到 m 次。

注意:

  • egrep、awk使用{n}、{n, }、{n, m}匹配时“{}"前不用加"\”
  • egrep -E -n 'wo{2}d' test.txt   //-E 用于显示文件中符合条件的字符
  • egrep -E -n 'wo{2,3}d' test.txt

3、扩展正则表达式

通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用  范围更广的扩展正则表达式。
 

支持工具

  • egrep
  • awk

常用的几个扩展正则表达式元字符

符号描述
+重复一个或者一个以上的前一个字符。
?零个或者一个的前一个字符。
|使用或者(or)的方式找出多个字符。
()查找“组”字符串。
()+辨别多个重复的组。

例如:

①、

+重复一个或者一个以上的前一个字符。

②、

?零个或者一个的前一个字符。

③、

|使用或者(or)的方式找出多个字符。

④、

()查找“组”字符串。

⑤、

()+辨别多个重复的组。

4、元字符操作

4.1、查找特定字符

查找文件中的字符 “the” 

反向选择:查找文件中不包含“the”

4.2、利用中括号“[]”来查找集合字符

  • 查找文件中“shirt”与“short”这两个字符串

  • 查找包含重复单个字符“oo”时

  • 查找“oo”前面不是“w”的字符串

  • 查找“oo”前面不是小写字母的字符串

“a-z”表示小写字母,大写字母则通过“A-Z”表示。

  • 查找文件中包含数字的行

4.3、查找行首“^”与行尾字符“$”

基础正则表达式包含两个定位元字符:“^”(行首)与“$”(行尾)。在上面的示例中, 查询“the”字符串时出现了很多包含“the”的行,如果想要查询以“the”字符串为行首的行,则可以通过“^”元字符来实现。

  • 例如:

查询以小写字母开头的行可以通过“^[a-z]”规则来过滤,查询大写字母开头的行则使用
“^[A-Z]”规则,若查询不以字母开头的行则使用“^[^a-zA-Z]”规则。

  • 例如:

以小写字母开头

  • 以大写字母开头 

  • 以字母开头 

“^”符号在元字符集合“[]”符号内外的作用是不一样的,在“[]”符号内表示反向选择,在“[]” 符号外则代表定位行首。反之,若想查找以某一特定字符结尾的行则可以使用“$”定位符。

  • 例如:

  • 查询空白行

4.4、查找任意一个字符“.”与重复字符“*”

前面提到,在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。例如执行以下命令就可以查找“w??d”的字符串,即共有四个字符,以 w 开头 d 结尾。

“*”代表的是重复零个或多个前面的单字符。 

4.5、查找连续字符范围“{}”

在上面的示例中,使用了“.”与“*”来设定零个到无限多个重复的字符,如果想要限制一个范围内的重复的字符串该如何实现呢?例如,查找三到五个 o 的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{}”。因为“{}”在 Shell 中具有特殊意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符。“{}”字符的使用方法如下所示。


①、查询两个 o 的字符。

②、查询以 w 开头以 d 结尾,中间包含 2~7个 o 的字符串。

③、查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串。

二、、grep语句

1、grep用法

grep 是用于在文件或文本输入中搜索匹配特定模式的行的工具,并输出包含该模式的行。它非常适合用于过滤和查找文本中的特定字符串或正则表达式。

  • 语法格式
grep [选项]… 查找条件 目标文件
  • 使用参数
选项描述
-E开启扩展正则表达式 (Extended Regular Expressions)。允许使用更复杂的正则表达式。
-c计算匹配到的行数。
-i忽略大小写的不同(大小写视为相同)。
-o仅显示匹配到的字符串,而不是整行。
-v反向选择,显示不包含搜索字符串的行。
--color=auto为匹配的字符串部分添加颜色显示。
-n显示匹配行的行号。

2、grep案例

2.1、统计root字符总行数

root@localhost opt]# grep -c root /etc/passwd

 2.2、不区分大小写查找the所有的行

[root@localhost opt]# grep -i "the" cxc.txt

2.3、将没有出现 root 的行取出来

[root@localhost opt]# cat 222.txt 
[root@localhost opt]# grep -v root /opt/222.txt 

2.4、过滤出IP

[root@localhost opt]# ifconfig ens33 |grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"

三、sed命令

1、sed概述

1.1、sed定义

sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于Shell脚本中,用以完成各种自动化处理任务。


1.2、sed工作原理

读入新的一行内容到缓存空间;

从指定的操作指令中取出第一条指令,判断是否匹配pattern;

如果不匹配,则忽略后续的编辑命令,回到第2步继续取出下一条指令;

如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第2步继续取出下一条指令;

当所有指令都应用之后,输出缓存行的内容;回到第1步继续读入下一行内容;

当所有行都处理完之后,结束;

2、sed基本用法

  • 使用格式
sed [选项] '操作' 参数
sed [选项] -f scriptfile 参数
  • 常用选项
选项说明
-e 或 --expression=用指定命令或者脚本来处理输入的文本文件。
-f 或 --file=用指定的脚本文件来处理输入的文本文件。
-h 或 --help显示帮助信息。
-n、--quiet 或 --silent仅显示处理后的结果,不输出原始输入。
-i[.bak]直接编辑文本文件。如果指定 .bak,会创建备份文件。
-r 或 -E使用扩展正则表达式(Extended Regular Expressions, ERE)。
-s将多个文件视为独立文件,而不是单个连续的长文件流。
  • sed常用命令动作
选项说明
p打印输出
d删除指定行
i在指定行之前插入内容
a在指定行后面插入内容
c替换指定行所有内容
s搜索替换

3、sed具体操作

3.1、打印输出

[root@localhost home]# sed '' 123.txt 
[root@localhost home]# sed 'p' 123.txt 
[root@localhost home]# sed -n 'p' 123.txt 

3.1.2、显示范围 行号
[root@localhost home]# sed -n '1p' 123.txt 
[root@localhost home]# sed -n '1,3p' 123.txt 
[root@localhost home]# sed -n '1p;3p;5p' 123.txt 
[root@localhost home]# sed -n '1,+3p'  123.txt 

3.1.3、奇偶数表示
[root@localhost home]# sed -n '1~2p' 123.txt 
[root@localhost home]# sed -n '2~2p' 123.txt 
[root@localhost home]# sed -n '2~3p' 123.txt 
[root@localhost home]# sed -n '$p' 123.txt 
[root@localhost home]# 
[root@localhost home]# sed -n '/cxc/p' 123.txt 
[root@localhost home]# sed -n '/haha$/p' 123.txt 

[root@localhost home]# sed -n '/[0-9]/p' 456.txt 
[root@localhost home]# sed -n '/^root/p' 456.txt 
[root@localhost home]# sed -n '1!p' 456.txt 
[root@localhost home]# sed -n '/root/!p' 456.txt 
[root@localhost home]# sed -n '$=' 456.txt 

sed默认不支持扩展正则,如果要支持,需要加-r选项

3.2、增加内容

[root@localhost home]# sed '2ihello world' 456.txt

[root@localhost home]# sed '4ihello\nworld' 456.txt 

[root@localhost home]# sed '1ahello world' 456.txt

[root@localhost home]# sed '$ahello world' 456.txt 

注意:a或者i后面的所有内容都会被理解为需要添加的内容

3.3、删除

[root@localhost home]# sed '1d' 123.txt      //删除第一行2	zmx:oppo3	root:root4	wjh:1235	jjg:4566	jhw:7897  njnj:kgc8  ky37:lhai9  kfc:ail10  mdl:keyi
[root@localhost home]# sed '1,3d' 123.txt     //删除一到三行4	wjh:1235	jjg:4566	jhw:7897  njnj:kgc8  ky37:lhai9  kfc:ail10  mdl:keyi
[root@localhost home]# sed '/123/d' 123.txt    //删除带有123的行1	cxc:haha2	zmx:oppo3	root:root5	jjg:4566	jhw:7897  njnj:kgc8  ky37:lhai9  kfc:ail10  mdl:keyi
[root@localhost home]# 

3.4、替换

  • 常用选项
选项说明
g行内全局替换,替换行中的所有匹配项
p显示替换成功的行
w /PATH/FILE将替换成功的行保存至指定的文件中
I, i忽略大小写(i 是基本正则表达式的选项,I 是扩展正则表达式的选项)
[root@localhost home]# sed '/^root/ckgc' 456.txt    //以root开头的行替换成kgc
cxc:haha 
zmx:oppo
kgc                   //已替换
wjh:123
jjg:456
jhw:789
njnj:kgc
ky37:lhai
kfc:ail
mdl:keyi
[root@localhost home]# 
[root@localhost home]# sed '/haha/cnjzb' 456.txt   //带有haha字符的行替换成njzb
njzb                           //已替换
zmx:oppo
root:root
wjh:123
jjg:456
jhw:789
njnj:kgc
ky37:lhai
kfc:ail
mdl:keyi
njzb                       //已替换
[root@localhost home]# 

这里没有真的改变文件内容,只是输出到屏幕,如果想要真的替换,需要用-i选项,建议用-i之前对原文 件进行备份

3.5、插入文件

[root@localhost home]# sed '3r /etc/hosts' 456.txt     //将/etc/hosts文件插入到第三行下面
cxc:haha 
zmx:oppo
root:root
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
wjh:123
jjg:456
jhw:789
njnj:kgc
ky37:lhai
kfc:ail
mdl:keyi
lala:haha
[root@localhost home]# sed '$r /etc/hosts' 456.txt     //插入到最后一行
cxc:haha 
zmx:oppo
root:root
wjh:123
jjg:456
jhw:789
njnj:kgc
ky37:lhai
kfc:ail
mdl:keyi
lala:haha
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost home]# 

3.6、同时编辑

sed支持一个或多个-e参数

//提取第一行和第三行
[root@localhost home]# sed -n -e '1p' -e '3p' 123.txt 1	cxc:haha3	root:root
[root@localhost home]# sed -ne '1p' -ne '3p' 123.txt 1	cxc:haha3	root:root
[root@localhost home]# 

3.7、读取完退出

(注意:q不要和-i一起使用,以免覆盖源文件)

正常情况下sed会在读取完所有数据行之后退出,但是我们可以随时使用q指令来提前退出sed

[root@localhost home]# sed '3q' 123.txt    //表示仅显示处理后的结果1	cxc:haha2	zmx:oppo3	root:root
[root@localhost home]# 

四、awk命令

1、awk定义

20世纪70年代诞生于贝尔实验室,现在centos7用的是gawk之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

  • AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
  • 它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作
  • 数据可以来自标准输入也可以是管道或文件

有多种版本:

  • AWK:原先来源于 AT & T 实验室的的AWK
  • NAWK:New awk,AT & T 实验室的AWK的升级版
  • GAWK:即GNU AWK。所有的GNU/Linux发布版都自带GAWK,它与AWK和NAWK完全兼容

Linux中现在使用的是gawk 

2、工作原理

当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出 如果没有定义匹配条件默认是匹配所有数据行。

awk隐含循环,条件匹配多少次动作就会执行多少次 逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按 模式或者条件执行编辑命令。

3、工作流程

3.1、运行模式

正则表达式 : /root/ 匹配含有 root 的行 /*.root/

关系表达式: < > && || + *

匹配表达式: ~ !~ 动作:

变量 命令 内置函数 流控制语句它的语法结构如下:

3.2、执行流程

BEGIN 语句设置计数和打印头部信息,在任何动作之前进行

END 语句输出统计结果,在完成动作之后执行

AWK执行的流程非常简单:读(Read)、执行(Execute)与重复(Repeat)。

下面的流程图描述出 了AWK的工作流程:

​​​​​​​

①、开始块(BEGIN block):

顾名思义,开始块就是在程序启动的时候执行的代码部分,并且它在整个过程中只执行一次。一般情况 下,我们在开始块中初始化一些变量。BEGIN是AWK的关键字,因此它必须是大写的。不过,开始块部 分是可选的,你的程序可以没有开始块部分。

②、主体块(Body Block):

对于每一个输入的行,都会执行一次主体部分的命令。默认情况下,对于输入的每一行,AWK都会执行 命令。注意:在主体块部分,没有关键字存在。

③、结束块(END Block):

它是在程序结束时执行的代码。END也是AWK的关键字,它也必须大写。与开始块相似,结束块也是可选的。

4、基本语法

4.1、命令格式

awk 选项' 模式或条件{操作}' 文件1 文件2 ...
awk -f 脚本文件 文件1 文件2 ..

AWK 支持两种不同类型的变量:内建变量(可直接使用),自定义变量awk 内置变量(预定义变量)

变量解释
FS指定每行文本的字段分隔符,默认为空格或制表位
NF当前处理的行的字段个数,对应于当前的字段数(列的个数)
NR当前处理的行的行号(序数),对应于当前的行号
$0当前处理的行的整行内容
$n当前处理行的第 n 个字段(第 n 列)
FILENAME被处理的文件名(当前输入文件的名)
FNR各文件分别计数的行号
OFS输出字段分隔符,默认值是一个空格
ORS输出记录分隔符,默认值是一个换行符
RS行分隔符,默认是换行符

5、实验操作

5.1、内建变量

awk 包含几个特殊的内建变量(可直接用)如下所示:

变量解释
FS指定每行文本的字段分隔符,默认为空格或制表位
NF当前处理的行的字段个数
NR当前处理的行的行号(序数)
$0当前处理的行的整行内容
$n当前处理行的第 n 个字段(第 n 列)
FILENAME被处理的文件名
RS行分隔符
[root@localhost opt]# awk '{print}'      //再打印一边
123
123
456
456
[root@localhost opt]# awk '{print"hellow"}'      //字符串需要添加双引号
123
hellow
456
hellow
[root@localhost opt]# cat /etc/passwd |head -10 > zz.txt
[root@localhost opt]# 
[root@localhost opt]# awk -F: '{print $1}' zz.txt   //自定义冒号为分隔符显示分隔之后的第一列
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
[root@localhost opt]# awk -F: '{print $1,$2}' zz.txt  //逗号有空格效果,打印第一列和第二列
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
operator x
[root@localhost opt]# awk -F: '{print $1" "$2}' zz.txt   //空格需要使用双引号括起来
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
operator x
[root@localhost opt]# awk -F: '{print $1"\t"$2}' zz.txt  //用制表符作为分隔符输出
root	x
bin	x
daemon	x
adm	x
lp	x
sync	x
shutdown	x
halt	x
mail	x
operator	x
[root@localhost opt]# awk -F[:/] '{print $4}' zz.txt   //定义多个分隔符
0
1
2
4
7
0
0
0
12
0
[root@localhost opt]# 

5.2、内置变量

awk常用内置变量:$1、$2、NF、NR、$0

  • $1:代表第一列
  • $2:代表第二列以此类推
  • $0:代表整行
  • NF:一行的列数
  • NR:行数
[root@localhost opt]# awk -F: '/root/{print $0}' zz.txt    //打印包含root的整行内容
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost opt]# awk -F: '/root/{print $1,$6}' zz.txt  //打印包含root的第一列和第六列
root /root
operator /root
[root@localhost opt]# awk '/root/' zz.txt     //打印包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost opt]# awk -F[:/] '{print NF}' zz.txt   //以:/分割,打印每一行的列数
10
10
10
11
12
10
10
10
12
10
[root@localhost opt]# awk -F[:/] '{print NR}' zz.txt   //显示行号
1
2
3
4
5
6
7
8
9
10
[root@localhost opt]# awk -F: '{print NR,$0}' zz.txt   //每一行显示行号
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost opt]# awk 'NR==2' zz.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost opt]# awk -F: 'NR==2{print $1}' zz.txt   //打印第二行的第一列
bin
[root@localhost opt]# awk -F: '{print $NF}' zz.txt    //打印最后一列 
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologi
/sbin/nologin
[root@localhost opt]# awk 'END{print NR}' zz.txt     //打印总行数
10
[root@localhost opt]# awk 'END{print $0}' zz.txt 
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost opt]# awk -F: '{print"当前有"NF"列"}' zz.txt  //打印列数
当前有7列
当前有7列
当前有7列
当前有7列
当前有7列
当前有7列
当前有7列
当前有7列
当前有7列
当前有7列
[root@localhost opt]# awk -F: '{print"第"NR"行有"NF"列"}' zz.txt  //打印每一行有多少列
第1行有7列
第2行有7列
第3行有7列
第4行有7列
第5行有7列
第6行有7列
第7行有7列
第8行有7列
第9行有7列
第10行有7列
[root@localhost opt]# 

5.3、BEGIN END 运算

逐行执行开始之前执行什么任务,结束之后再执行什么任务,用BEGIN、END

BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次

END一般用来做汇总操作,仅在读取完数据记录之后执行一次

[root@localhost opt]# 
[root@localhost opt]# awk 'BEGIN{x=10;print x}'        
10
[root@localhost opt]# awk 'BEGIN{x=10;print x+5}'
15 
[root@localhost opt]# awk 'BEGIN{x=10;x++;print x+1}'  //BEGIN在处理文件之前,所以后面不跟
文件名也不影响
12
[root@localhost opt]# awk 'BEGIN{print x+1}'        //不指定初始值,初始值就为0
1
[root@localhost opt]# awk 'BEGIN{print 3.5+2.5}'     //小数也可以运算
6
[root@localhost opt]# awk 'BEGIN{print 6-2}'
4
[root@localhost opt]# awk 'BEGIN{print 2*6}'
12
[root@localhost opt]# awk 'BEGIN{print 3^2}'
9
[root@localhost opt]# awk 'BEGIN{print 1/2}'
0.5
[root@localhost opt]# 

关于数值与字符串的比较

比较符号:==、 != 、<= 、 >=、<、>

[root@localhost opt]# awk 'NR==5{print}' zz.txt    //打印第五行
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin[root@localhost opt]# awk 'NR==5' zz.txt    //打印第五行
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin[root@localhost opt]# awk 'NR<5' zz.txt    //打印1、2、3、4行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin[root@localhost opt]# awk -F: '$3==0' zz.txt       //打印第三列等于0的行
root:x:0:0:root:/root:/bin/bash[root@localhost opt]# awk -F: '$1=="root"' zz.txt   //打印第一列等于root的行
root:x:0:0:root:/root:/bin/bash[root@localhost opt]# awk -F: '$3>=1000' /etc/passwd    //打印第三列大于1000的行
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
cxc:x:1000:1000:cxc:/home/cxc:/bin/bash[root@localhost opt]# awk -F: '$3<10 || $3>1000' /etc/passwd   //打印第三列小于10或者大于100的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin[root@localhost opt]# awk -F: 'NR>4 && NR<7' zz.txt     //打印5、6行
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
[root@localhost opt]# seq 200 | awk '$1%7==0 && $1~/7/'   //所有能被7整除并且包含数字7的整数数字
7
70
77
147
175
[root@localhost opt]# 

其他内置变量的用法FS(输入)、OFS、NR、FNR、RS、ORS

  • FS:输入字段的分隔符 默认是空格
  • OFS:输出字段的分隔符 默认也是空格
  • FNR:读取文件的记录数(行号),从1开始,新的文件重新重1开始计数
  • RS:输入行分隔符 默认为换行符
  • ORS:输出行分隔符 默认也是为换行符

5.4、awk高级用法

定义引用变量

[root@localhost opt]# 
[root@localhost opt]# a=100
[root@localhost opt]# awk -v b="$a" 'BEGIN{print b}'
#将系统的变量a,在awk里赋值为变量b,然后调用变量b -v 选项将其传递给 awk
100
[root@localhost opt]# 
[root@localhost opt]# awk 'BEGIN{print "'$a'"}' 
#直接调用的话需要先用双引号再用单引号
100
[root@localhost opt]# 
[root@localhost opt]# awk -vc=1 'BEGIN{print c}'     //awk直接定义变量并引用
1
[root@localhost opt]# 
[root@localhost opt]# df -h | awk 'BEGIN{getline}/root/{print $0}'
#调用函数getline,读取一行数据的时候并不是得到当前行而是当前行的下一行
/dev/mapper/centos-root   26G  5.1G   21G   20% /
[root@localhost opt]# 
[root@localhost opt]# seq 10 | awk '{getline;print $0}'  //显示偶数行
2
4
6
8
10
[root@localhost opt]# 
[root@localhost opt]# 
[root@localhost opt]# seq 10 | awk '{print $0;getline}'     //显示奇数行
1
3
5
7
9
[root@localhost opt]# 
[root@localhost opt]# 
[root@localhost opt]# 

5.5、awk if语句

awk的if语句也分为单分支、双分支和多分支

[root@localhost opt]# awk -F: '{if($3<10){print $0}}' /etc/passwd 

#第三列小于10的打印整行
[root@localhost opt]# awk -F: '{if($3<10){print $3}else{print $1}}' /etc/passwd

#第三列小于10的打印第三列,否则打印第一列

[root@localhost opt]# awk -F: '{if($3<10){print $0}}' /etc/passwd   
//第三列小于10的打印整行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@localhost opt]# 
[root@localhost opt]# 
[root@localhost opt]# 
[root@localhost opt]# 
[root@localhost opt]# 
[root@localhost opt]# awk -F: '{if($3<10){print $3}else{print $1}}' /etc/passwd
//第三列小于10的打印第三列,否则打印第一列
0
1
2
3
4
5
6
7
8
operator
games
ftp
nobody
systemd-network
dbus
polkitd
abrt
libstoragemgmt
rpc
colord
saslauth
setroubleshoot
rtkit
pulse
qemu
ntp
radvd
chrony
tss
usbmuxd
geoclue
sssd
gdm
rpcuser
nfsnobody
gnome-initial-setup
avahi
postfix
sshd
tcpdump
cxc
[root@localhost opt]# 

5.6、BEGIN END 循环

awk还支持for循环、while循环、函数、数组等

①、第一步:运行BEGIN{ commands }语句块中的语句。

BEGIN语句块在awk开始从输入流中读取行之前被运行,这是一个可选的语句块,比方变量初始化、打 印输出表格的表头等语句通常能够写在BEGIN语句块中。

②、第二步:从文件或标准输入(stdin)读取一行。然后运行pattern{ commands }语句块,它逐行扫描文 件,从第一行到最后一行反复这个过程。直到文件所有被读取完成。

pattern语句块中的通用命令是最重要的部分,它也是可选的。假设没有提供pattern语句块,则默认运 行{ print },即打印每个读取到的行。awk读取的每一行都会运行该语句块。

③、第三步:当读至输入流末尾时,运行END{ commands }语句块。

END语句块在awk从输入流中读取全然部的行之后即被运行。比方打印全部行的分析结果这类信息汇总 都是在END语句块中完毕,它也是一个可选语句块。

(这三个部分缺少任何一部分都可以)

[root@localhost opt]# awk 'BEGIN {n=0 ; while ("w" | getline) n++ ; {print n-2}}'
//调用w命令,并用来统计在线用户数
2[root@localhost opt]# awk 'BEGIN {FS=":"} ;{if($3>=5){print}}' zz.txt 
//先处理完BEGIN的内容,再打印文本里面的内容
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin[root@localhost opt]# awk -F ":" '! ($3<10){print} ' zz.txt 
//输出第3个字段的值不小于10的行
operator:x:11:0:operator:/root:/sbin/nologin[root@localhost opt]# awk 'BEGIN{x=0};/\/bin\/bash$/ {x++;print x,$0};END {print x}' /etc/passwd
//统计以/ bin/bash结尾的行数
1 root:x:0:0:root:/root:/bin/bash
2 cxc:x:1000:1000:cxc:/home/cxc:/bin/bash
cxc:x:1000:1000:cxc:/home/cxc:/bin/bash

五、总结

grep 和 egrep 文本过滤 (更适合单纯的查找或匹配文本)

sed 流编辑器 实现编辑的(更适合编辑匹配到的文本)

awk 文本报告生成器 实现格式化文本输出(更适合格式化文本,对文本进行较复杂格式处理)

相关文章:

正则表达式与文本处理

目录 一、正则表达式 1、正则表达式定义 1.1正则表达式的概念及作用 1.2、正则表达式的工具 1.3、正则表达式的组成 2、基础正则表达式 3、扩展正则表达式 4、元字符操作 4.1、查找特定字符 4.2、利用中括号“[]”来查找集合字符 4.3、查找行首“^”与行尾字符“$”…...

Python | Leetcode Python题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution:def moveZeroes(self, nums: List[int]) -> None:n len(nums)left right 0while right < n:if nums[right] ! 0:nums[left], nums[right] nums[right], nums[left]left 1right 1...

微信小程序面试题汇总

面试题 1. 请简述微信小程序主要目录和文件的作用&#xff1f; 参考回答&#xff1a; 微信小程序主要目录和文件的作用&#xff1a;&#xff08;1&#xff09;project.config.json&#xff1a;项目配置文件&#xff0c;用的最多的就是配置是否开启https校验 &#xff08;2&am…...

学习日志:JVM垃圾回收

文章目录 前言一、堆空间的基本结构二、内存分配和回收原则对象优先在 Eden 区分配大对象直接进入老年代长期存活的对象将进入老年代主要进行 gc 的区域空间分配担保 三、死亡对象判断方法引用计数法可达性分析算法引用类型总结1&#xff0e;强引用&#xff08;StrongReference…...

Vue前端页面嵌入mermaid图表--流程图

一、安装Mermaid 首先&#xff0c;你需要在你的项目中安装Mermaid。可以通过npm或yarn来安装&#xff1a; npm install mermaid --save # 或者 yarn add mermaid结果如图&#xff1a; 二、Vue 方法一&#xff1a;使用pre标签 使用ref属性可以帮助你在Vue组件中访问DOM元素 …...

【web]-反序列化-easy ? not easy

打开后看到源码 <?php error_reporting(0); highlight_file(__FILE__);class A{public $class;public $para;public $check;public function __construct(){$this->class "B";$this->para "ctfer";echo new $this->class ($this->para…...

python 内置函数、math模块

一、内置函数 内置函数是 Python 解释器内置的一组函数&#xff0c;它们可以直接在 Python 程序中使用&#xff0c;无需额外导入模块。这些内置函数提供了基本的操作和功能&#xff0c;涵盖了广泛的用途&#xff0c;从数学运算到数据结构操作等等。 import mathprint(type(10)…...

Ubuntu Docker 安装

Ubuntu Docker 安装 1. 引言 Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 2. 系统要求 在安装 Docker 之前,…...

vue接入google map自定义marker教程

需求背景 由于客户需求&#xff0c;原来系统接入的高德地图&#xff0c;他们不接受&#xff0c;需要换成google地图。然后就各种百度&#xff0c;各种Google&#xff0c;却不能实现。----无语&#xff0c;就连google地图官方的api也是一坨S-H-I。所以才出现这篇文章。 google地…...

Spring Boot集成Redis与Lua脚本:构建高效的分布式多规则限流系统

文章目录 Redis多规则限流和防重复提交记录访问次数解决临界值访问问题实现多规则限流先确定最终需要的效果编写注解&#xff08;RateLimiter&#xff0c;RateRule&#xff09;拦截注解 RateLimiter 编写lua脚本UUID时间戳编写 AOP 拦截 总结 Redis多规则限流和防重复提交 市面…...

四、单线程多路IO复用+多线程业务工作池

文章目录 一、前言1 编译方法 二、单线程多路IO复用多线程业务工作池结构三、重写Client_Context类四、编写Server类 一、前言 我们以及讲完单线程多路IO复用 以及任务调度与执行的C线程池&#xff0c;接下来我们就给他结合起来。 由于项目变大&#xff0c;尝试解耦项目&#…...

单元测试--Junit

Junit是Java的单元测试框架提供了一些注解方便我们进行单元测试 1. 常用注解 常用注解&#xff1a; TestBeforeAll&#xff0c;AfterAllBeforeEach&#xff0c;AfterEach 使用这些注解需要先引入依赖&#xff1a; <dependency><groupId>org.junit.jupiter<…...

达梦数据库系列—30. DTS迁移Mysql到DM

目录 1.MySQL 源端信息 2.DM 目的端信息 3.迁移评估 4.数据库迁移 4.1源端 MySQL 准备 4.2目的端达梦准备 初始化参数设置 兼容性参数设置 创建迁移用户和表空间 4.3迁移步骤 创建迁移 配置迁移对象及策略 开始迁移 对象补迁 5.数据校验 统计 MySQL 端对象及数…...

随记0000——从0、1 到 C语言

C语言的发展历程是计算机科学史上的一个重要里程碑。 下面是从最早的机器语言到汇编语言&#xff0c;再到高级语言如 C 语言的简化演进过程&#xff1a; 1. 机器语言 定义与特点 机器语言是最底层的编程语言&#xff0c;由一系列二进制代码组成。直接被CPU执行&#xff0c;…...

C++ | Leetcode C++题解之第264题丑数II

题目&#xff1a; 题解&#xff1a; class Solution { public:int nthUglyNumber(int n) {vector<int> dp(n 1);dp[1] 1;int p2 1, p3 1, p5 1;for (int i 2; i < n; i) {int num2 dp[p2] * 2, num3 dp[p3] * 3, num5 dp[p5] * 5;dp[i] min(min(num2, num3…...

前端系列-8 集中式状态管理工具pinia

集中式状态管理工具—pinia vue3中使用pinia作为集中式状态管理工具&#xff0c;替代vue2中的vuex。 pinia文档可参考: https://pinia.web3doc.top/introduction.html 1.项目集成pinia 安装pinia依赖: npm install pinia在main.ts中引入pinia import { createApp } from vu…...

pytest使用

主要技术内容 1.pytest设计 接口测试 框架设想 common—公共的东西封装 1.request请求 2.Session 3.断言 4.Log 5.全局变量 6.shell命令 ❖ config---配置文件及读取 ❖ Log— ❖ payload—请求参数—*.yaml及读取 ❖ testcases—conftest.py; testcase1.py…….可…...

单表查询总结与多表查询概述

1. 单表查询总结 执行顺序&#xff1a; 从一张表&#xff0c;过滤数据&#xff0c;进行分组&#xff0c;对分组后的数据再过滤&#xff0c;查询出来所需数据&#xff0c;排序之后输出&#xff1b; from > where > group by > having > select > order by 2. …...

redis的使用场景和持久化方式

redis的使用场景 热点数据的缓存。热点&#xff1a;频繁读取的数据。限时任务的操作&#xff1a;短信验证码。完成session共享的问题完成分布式锁。 redis的持久化方式 什么是持久化&#xff1a;把内存中的数据存储到磁盘的过程&#xff0c;同时也可以把磁盘中的数据加载到内存…...

嵌入式Linux学习: 设备树实验

设备树&#xff08;DeviceTree&#xff09;是一种硬件描述机制&#xff0c;用于在嵌入式系统和操作系统中描述硬件设备的特性、连接关系和配置信息。它提供了一种与平台无关的方式来描述硬件&#xff0c;使得内核与硬件之间的耦合度降低&#xff0c;提高了系统的可移植性和可维…...

eqmx上读取数据处理以后添加到数据库中

目录 定义一些静态变量 定时器事件的处理器 订阅数据的执行器 处理json格式数据和将处理好的数据添加到数据库中 要求和最终效果 总结一下 定义一些静态变量 // 在这里都定义成全局的 一般都定义成静态的private static MqttClient mqttClient; // mqtt客户端 private s…...

【中项】系统集成项目管理工程师-第5章 软件工程-5.3软件设计

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…...

C++学习笔记-内联函数使用和含义

引言 内联函数是C为了优化在函数的调用带来的性能开销而设计的&#xff0c;特别是当函数体很小且频繁调用时&#xff0c;内联函数可以让编译器在调用点直接展开函数体&#xff0c;从而避免了函数调用的开销。 一、内联函数的定义与含义 1.1 定义 内联函数是通过在函数声明或…...

数据库(MySQL)-视图、存储过程、触发器

一、视图 视图的定义、作用 视图是从一个或者几个基本表&#xff08;或视图&#xff09;导出的表。它与基本表不同&#xff0c;是一个虚表。但是视图只能用来查看表&#xff0c;不能做增删改查。 视图的作用&#xff1a;①简化查询 ②重写格式化数据 ③频繁访问数据库 ④过…...

js 优雅的实现模板方法设计模式

在JavaScript中&#xff0c;优雅地实现模板方法设计模式通常意味着我们要遵循一些最佳实践&#xff0c;如清晰地定义算法的骨架&#xff08;模板方法&#xff09;&#xff0c;并确保子类能够灵活地扩展或修改这些算法中的特定步骤。由于JavaScript是一种动态语言&#xff0c;我…...

C语言——输入输出

C语言——输入输出 输入输出函数的类型getcharputcharprintf占位符的分类 scanf 什么是输入输出呢&#xff1f; 所谓输入输出是以计算机为主机而言的&#xff0c;往内存中输入数据为输入&#xff0c;反之从内存中输出数据为输出。 输入输出的功能 C语言本身是不提供输入输出功能…...

【微软蓝屏】微软Windows蓝屏问题汇总与应对解决策略

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

OpenCV图像滤波(2)均值平滑处理函数blur()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在OpenCV中&#xff0c;blur()函数用于对图像应用简单的均值模糊&#xff08;mean blur&#xff09;。这种模糊效果可以通过将图像中的每个像素替…...

Android lmkd机制详解

目录 一、lmkd介绍 二、lmkd实现原理 2.1 工作原理图 2.2 初始化 2.3 oom_adj获取 2.4 监听psi事件及处理 2.5 进程选取与查杀 2.5.1 进程选取 2.5.2 进程查杀 三、关键系统属性 四、核心数据结构 五、代码时序 一、lmkd介绍 Android lmkd采用epoll方式监听linux内…...

linux shell(中)

结构化命令 if语句 if-then 最基本的结构化命令是 if-then 语句。if-then 语句的格式如下&#xff1a; if command thencommands ifif command; then # 通过把分号&#xff08;;&#xff09;放在待求值的命令尾部&#xff0c;可以将 then 语句写在同一行commands ifbash sh…...

VMware三种网络模式---巨细

文章目录 目录 ‘一.网络模式概述 二.桥接模式 二.NAT模式 三.仅主机模式 四.案例演示 防火墙配置&#xff1a; 虚拟电脑配置 前言 本文主要介绍VMware的三种网络模式 ‘一.网络模式概述 VMware中分为三种网络模式&#xff1a; 桥接模式&#xff1a;默认与宿主机VMnet0绑…...

力扣高频SQL 50 题(基础版)第一题

文章目录 力扣高频SQL 50 题&#xff08;基础版&#xff09;第一题1757.可回收且低脂的产品题目说明思路分析实现过程准备数据&#xff1a;实现方式&#xff1a;结果截图&#xff1a; 力扣高频SQL 50 题&#xff08;基础版&#xff09;第一题 1757.可回收且低脂的产品 题目说…...

2.1.卷积层

卷积 ​ 用MLP处理图片的问题&#xff1a;假设一张图片有12M像素&#xff0c;那么RGB图片就有36M元素&#xff0c;使用大小为100的单隐藏层&#xff0c;模型有3.6B元素&#xff0c;这个数量非常大。 识别模式的两个原则&#xff1a; 平移不变性&#xff08;translation inva…...

网易《永劫无间》手游上线,掀起游戏界狂潮

原标题&#xff1a;网易《永劫无间》手游上线&#xff0c;网友&#xff1a;发烧严重 易采游戏网7月26日消息&#xff1a;自网易宣布《永劫无间》手游即将上线以来&#xff0c;广大游戏玩家的期待值就不断攀升。作为一款拥有丰富内容和极高自由度的游戏&#xff0c;《永劫无间》…...

RNN(一)——循环神经网络的实现

文章目录 一、循环神经网络RNN1.RNN是什么2.RNN的语言模型3.RNN的结构形式 二、完整代码三、代码解读1.参数return_sequences2.调参过程 一、循环神经网络RNN 1.RNN是什么 循环神经网络RNN主要体现在上下文对理解的重要性&#xff0c;他比传统的神经网络&#xff08;传统的神…...

php 根据位置的经纬度计算距离

在开发中,我们要经常和位置打交道,要计算附近的位置、距离什么的。如下: 一.sql语句 SELECT houseID,title,location,chamber,room,toward,area,rent,is_verify,look_type,look_time, traffic,block_name,images,tag,create_time,update_time, location->&g…...

17 Python常用内置函数——基本输入输出

input() 和 print() 是 Python 的基本输入输出函数&#xff0c;前者用来接收用户的键盘输入&#xff0c;后者用来把数据以指定的格式输出到标准控制台或指定的文件对象。无论用户输入什么内容&#xff0c;input() 一律作为字符串对待&#xff0c;必要时可以使用内置函数 int()、…...

【Web】LitCTF 2024 题解(全)

目录 浏览器也能套娃&#xff1f; 一个....池子&#xff1f; 高亮主题(划掉)背景查看器 百万美元的诱惑 SAS - Serializing Authentication exx 浏览器也能套娃&#xff1f; 随便试一试&#xff0c;一眼ssrf file:///flag直接读本地文件 一个....池子&#xff1f; {…...

家政项目小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;家政人员管理&#xff0c;家政服务管理&#xff0c;咨询信息管理&#xff0c;咨询服务管理&#xff0c;家政预约管理&#xff0c;留言板管理&#xff0c;系统管理 微信端账号功能…...

electron TodoList网页应用打包成linux deb、AppImage应用

这里用的是windows的wsl的ubuntu环境 electron应用打包linux应用需要linux下打包&#xff0c;这里用windows的wsl的ubuntu环境进行操作 1&#xff09;linux ubuntu安装nodejs、electron 安装nodejs&#xff1a; sudo apt update sudo apt upgrade ##快捷安装 curl -fsSL http…...

【C语言】 使用fgets和fputs完成两个文件的拷贝

目录 1、使用fgets和fputs完成两个文件的拷贝 2、使用fgets统计给定文件的行号 fgets和fputs的使用方法函数原型&#xff1a;int fputs&#xff08;const char *s,FILE *stream)&#xff1b; char *fgets(char *s,int size,FILE *stream)&#xff1b;fupts…...

使用PyTorch导出JIT模型:C++ API与libtorch实战

PyTorch导出JIT模型并用C API libtorch调用 本文将介绍如何将一个 PyTorch 模型导出为 JIT 模型并用 PyTorch 的 CAPI libtorch运行这个模型。 Step1&#xff1a;导出模型 首先我们进行第一步&#xff0c;用 Python API 来导出模型&#xff0c;由于本文的重点是在后面的部署…...

Python——异常捕获,传递及其抛出操作

01. 异常的概念 1. 程序在运行时&#xff0c;如果 python解释器遇到一个错误&#xff0c;会停止程序的执行&#xff0c;并且提示一些错误信息&#xff0c;这就是异常。 2. 程序停止执行并且提示错误信息这个动作&#xff0c;我们通常称之为&#xff1a;抛出&#xff08;raise…...

【Maven】 的继承机制

Maven是一个强大的项目管理工具&#xff0c;主要用于Java项目的构建和管理。它以其项目对象模型&#xff08;POM&#xff09;为基础&#xff0c;允许开发者定义项目的依赖、构建过程和插件。Maven的继承机制是其核心特性之一&#xff0c;它允许子项目继承和复用父项目的配置&am…...

微信小程序结合后端php发送模版消息

前端&#xff1a; <view class"container"><button bindtap"requestSubscribeMessage">订阅消息</button> </view> // index.js Page({data: {tmplIds: [UTgCUfsjHVESf5FjOzls0I9i_FVS1N620G2VQCg1LZ0] // 使用你的模板ID},requ…...

sqlalchemy报错sqlalchemy.orm.exc.DetachedInstanceError

解决方案&#xff1a; 在初始化数据库的代码中&#xff0c;将 maker sessionmaker(bindeng)修改为 maker sessionmaker(bindeng, expire_on_commitFalse)为什么要添加 expire_on_commitFalse 参数&#xff1f; expire_on_commit 可以用来更改 SQLAlchemy 的对象刷新机制&…...

华为网络模拟器eNSP安装部署教程

eNSP是图形化网络仿真平台&#xff0c;该平台通过对真实网络设备的仿真模拟&#xff0c;帮助广大ICT从业者和客户快速熟悉华为数通系列产品&#xff0c;了解并掌握相关产品的操作和配置、提升对企业ICT网络的规划、建设、运维能力&#xff0c;从而帮助企业构建更高效&#xff0…...

【React】详解样式控制:从基础到进阶应用的全面指南

文章目录 一、内联样式1. 什么是内联样式&#xff1f;2. 内联样式的定义3. 基本示例4. 动态内联样式 二、CSS模块1. 什么是CSS模块&#xff1f;2. CSS模块的定义3. 基本示例4. 动态应用样式 三、CSS-in-JS1. 什么是CSS-in-JS&#xff1f;2. styled-components的定义3. 基本示例…...

【ROS2】高级:安全-理解安全密钥库

目标&#xff1a;探索位于 ROS 2 安全密钥库中的文件。 教程级别&#xff1a;高级 时间&#xff1a;15 分钟 内容 背景安全工件位置 公钥材料 私钥材料域治理政策 安全飞地 参加测验&#xff01; 背景 在继续之前&#xff0c;请确保您已完成设置安全教程。 sros2 包可以用来创…...

C语言 ——— 数组指针的定义 数组指针的使用

目录 前言 数组指针的定义 数组指针的使用 前言 之前有编写过关于 指针数组 的相关知识 C语言 ——— 指针数组 & 指针数组模拟二维整型数组-CSDN博客 指针数组 顾名思义就是 存放指针的数组 那什么是数组指针呢&#xff1f; 数组指针的定义 何为数组指针&#xf…...