AWK常用用法

news2024/11/18 3:20:57

awk简介

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将会使你的工作变的高大上。 awk 是三剑客的老大,利剑出鞘,必会不同凡响。

使用方法

1

awk '{pattern + action}' {filenames}

尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

awk 的原理

通过一个简短的命令,我们来了解其工作原理。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

[root@Gin scripts]# awk '{print $0}' /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

.....................................................

[root@Gin scripts]# echo hhh|awk '{print "hello,world"}'

hello,world

[root@Gin scripts]# awk '{print "hiya"}' /etc/passwd

hiya

hiya

hiya

hiya

...............................................

你将会见到/etc/passwd 文件的内容出现在眼前。现在,解释 awk 做了些什么。调用 awk时,我们指定/etc/passwd 作为输入文件。执行 awk 时,它依次对/etc/passwd 中的每一行执行 print 命令。

所有输出都发送到 stdout,所得到的结果与执行 cat /etc/passwd 完全相同。
现在,解释{ print }代码块。在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。
再次说明, awk 对输入文件中的每一行都执行这个脚本。

1

2

3

4

awk -F":" '{ print $1 }' /etc/passwd

awk -F":" '{ print $1 $3 }' /etc/passwd

awk -F":" '{ print $1 " " $3 }' /etc/passwd

awk -F":" '{ print "username: " $1 "\t\tuid:" $3" }' /etc/passwd

-F参数:指定分隔符,可指定一个或多个

print 后面做字符串的拼接

下面通过几实例来了解下awk的工作原理:

实例一:只查看test.txt文件(100行)内第20到第30行的内容(企业面试)

1

2

3

4

5

6

7

8

9

10

11

12

[root@Gin scripts]# awk '{if(NR>=20 && NR<=30) print $1}' test.txt   

20

21

22

23

24

25

26

27

28

29

30

实例二:已知test.txt文件内容为:

1

2

[root@Gin scripts]# cat test.txt

I am Poe,my qq is 33794712

请从该文件中过滤出'Poe'字符串与33794712,最后输出的结果为:Poe 33794712

1

2

[root@Gin scripts]# awk -F '[ ,]+' '{print $3" "$7}' test.txt

Poe 33794712

BEGIN 和 END 模块

通常,对于每个输入行, awk 都会执行每个脚本代码块一次。然而,在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况, awk 允许您定义一个 BEGIN 块。

因为 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。
awk 还提供了另一个特殊块,叫作 END 块。 awk 在处理了输入文件中的所有行之后执行这个块。通常, END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

实例一:统计/etc/passwd的账户人数

1

2

3

4

[root@Gin scripts]# awk '{count++;print $0;} END{print "user count is ",count}' passwd

root:x:0:0:root:/root:/bin/bash

..............................................

user count is  27

count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:

1

2

3

4

5

[root@Gin scripts]# awk 'BEGIN {count=0;print "[start] user count is ",count} {count=count+1;print $0} END{print "[end] user count is ",count}' passwd

[start] user count is  0

root:x:0:0:root:/root:/bin/bash

...................................................................

[end] user count is  27

实例二:统计某个文件夹下的文件占用的字节数

1

2

[root@Gin scripts]# ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'

[end]size is  1489

如果以M为单位显示:

1

2

[root@Gin scripts]# ll |awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"M"}'   

[end]size is  0.00142002 M

awk运算符

awk 赋值运算符:a+5;等价于: a=a+5;其他同类

1

2

[root@Gin scripts]# awk 'BEGIN{a=5;a+=5;print a}'

10

awk逻辑运算符:

1

2

[root@Gin scripts]# awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}'

0 1

判断表达式 a>2&&b>1为真还是为假,后面的表达式同理

awk正则运算符:

1

2

[root@Gin scripts]# awk 'BEGIN{a="100testaa";if(a~/100/) {print "ok"}}'

ok

1

2

[root@Gin scripts]# echo|awk 'BEGIN{a="100testaaa"}a~/test/{print "ok"}'

ok

关系运算符:

如: > < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字 才转为数值比较。字符串比较:按照ascii码顺序比较。

1

2

3

4

5

[root@Gin scripts]# awk 'BEGIN{a="11";if(a>=9){print "ok"}}' #无输出

[root@Gin scripts]# awk 'BEGIN{a=11;if(a>=9){print "ok"}}' 

ok

[root@Gin scripts]# awk 'BEGIN{a;if(a>=b){print "ok"}}'

ok

awk 算术运算符:

说明,所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0。

1

2

3

4

[root@Gin scripts]# awk 'BEGIN{a="b";print a++,++a}'

0 2

[root@Gin scripts]# awk 'BEGIN{a="20b4";print a++,++a}'

20 22

这里的a++ , ++a与javascript语言一样:a++是先赋值加++;++a是先++再赋值

三目运算符 ?:

1

2

3

4

[root@Gin scripts]# awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'

ok

[root@Gin scripts]# awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'

err

 常用 awk 内置变量

 注:内置变量很多,参阅相关资料

字段分隔符 FS

FS="\t" 一个或多个 Tab 分隔

1

2

3

4

[root@Gin scripts]# cat tab.txt

ww   CC        IDD

[root@Gin scripts]# awk 'BEGIN{FS="\t+"}{print $1,$2,$3}' tab.txt

ww   CC        IDD

FS="[[:space:]+]" 一个或多个空白空格,默认的

1

2

3

4

5

6

[root@Gin scripts]# cat space.txt

we are    studing awk now!

[root@Gin scripts]# awk -F [[:space:]+] '{print $1,$2,$3,$4,$5}' space.txt

we are  

[root@Gin scripts]# awk -F [[:space:]+] '{print $1,$2}' space.txt

we are

FS="[" ":]+" 以一个或多个空格或:分隔

1

2

3

4

[root@Gin scripts]# cat hello.txt

root:x:0:0:root:/root:/bin/bash

[root@Gin scripts]# awk -F [" ":]+ '{print $1,$2,$3}' hello.txt

root x 0

字段数量 NF

1

2

3

4

5

[root@Gin scripts]# cat hello.txt

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin:888

[root@Gin scripts]# awk -F ":" 'NF==8{print $0}' hello.txt

bin:x:1:1:bin:/bin:/sbin/nologin:888

记录数量 NR

1

2

[root@Gin scripts]# ifconfig eth0|awk -F [" ":]+ 'NR==2{print $4}'  ## NR==2也就是取第2行

192.168.17.129

RS 记录分隔符变量
将 FS 设置成"\n"告诉 awk 每个字段都占据一行。通过将 RS 设置成"",还会告诉 awk每个地址记录都由空白行分隔。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

[root@Gin scripts]# cat recode.txt

Jimmy the Weasel

100 Pleasant Drive

San Francisco,CA 123456

Big Tony

200 Incognito Ave.

Suburbia,WA 64890

[root@Gin scripts]# cat awk.txt

#!/bin/awk

BEGIN {

        FS="\n"

        RS=""

}

{

        print $1","$2","$3

}

[root@Gin scripts]# awk -f awk.txt recode.txt

Jimmy the Weasel,100 Pleasant Drive,San Francisco,CA 123456

Big Tony,200 Incognito Ave.,Suburbia,WA 64890

OFS 输出字段分隔符

1

2

3

4

5

6

7

8

9

[root@Gin scripts]# cat hello.txt

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin:888

[root@Gin scripts]# awk 'BEGIN{FS=":"}{print $1","$2","$3}' hello.txt

root,x,0

bin,x,1

[root@Gin scripts]# awk 'BEGIN{FS=":";OFS="#"}{print $1,$2,$3}' hello.txt

root#x#0

bin#x#1

ORS 输出记录分隔符

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

[root@Gin scripts]# cat recode.txt

Jimmy the Weasel

100 Pleasant Drive

San Francisco,CA 123456

Big Tony

200 Incognito Ave.

Suburbia,WA 64890

[root@Gin scripts]# cat awk.txt

#!/bin/awk

BEGIN {

        FS="\n"

        RS=""

        ORS="\n\n"

}

{

        print $1","$2","$3

}

[root@Gin scripts]# awk -f awk.txt recode.txt

Jimmy the Weasel,100 Pleasant Drive,San Francisco,CA 123456

Big Tony,200 Incognito Ave.,Suburbia,WA 64890

 awk 正则

 正则应用

规则表达式

awk '/REG/{action} ' file,/REG/为正则表达式,可以将$0 中,满足条件的记录送入到:action 进行处理

1

2

3

4

5

6

7

8

9

[root@Gin scripts]# awk '/root/{print $0}' passwd ##匹配所有包含root的行

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

[root@Gin scripts]# awk -F: '$5~/root/{print $0}' passwd  ## 以分号作为分隔符,匹配第5个字段是root的行

root:x:0:0:root:/root:/bin/bash

[root@Gin scripts]# ifconfig eth0|awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print $4}'

192.168.17.129

布尔表达式
awk '布尔表达式{action}' file 仅当对前面的布尔表达式求值为真时, awk 才执行代码块。

1

2

3

4

[root@Gin scripts]# awk -F: '$1=="root"{print $0}' passwd

root:x:0:0:root:/root:/bin/bash

[root@Gin scripts]# awk -F: '($1=="root")&&($5=="root") {print $0}' passwd

root:x:0:0:root:/root:/bin/bash

 awk 的 if、循环和数组

条件语句

awk 提供了非常好的类似于 C 语言的 if 语句。

1

2

3

4

5

6

7

8

9

10

11

12

13

{

        if ($1=="foo"){

                if($2=="foo"){

                        print "uno"

                }else{

                        print "one"

                }

        }elseif($1=="bar"){

                print "two"

        }else{

                print "three"

        }

}

使用 if 语句还可以将代码:

1

/matchme/ { print $1 $3 $4 }

转换成:

1

2

3

4

5

{

  if ( $0 !~ /matchme/ ) {

    print $1 $3 $4

  }

}

循环结构

我们已经看到了 awk 的 while 循环结构,它等同于相应的 C 语言 while 循环。 awk 还有"do...while"循环,它在代码块结尾处对条件求值,而不像标准 while 循环那样在开始处求值。

它类似于其它语言中的"repeat...until"循环。以下是一个示例:
do...while 示例

1

2

3

4

5

{

    count=1do {

        print "I get printed at least once no matter what"

    while ( count !=1 )

}

与一般的 while 循环不同,由于在代码块之后对条件求值, "do...while"循环永远都至少执行一次。换句话说,当第一次遇到普通 while 循环时,如果条件为假,将永远不执行该循环。

for 循环

awk 允许创建 for 循环,它就象 while 循环,也等同于 C 语言的 for 循环:

1

2

3

for ( initial assignment; comparison; increment ) {

    code block

}

以下是一个简短示例:

1

2

3

for ( x=1;x<=4;x++ ) {

    print "iteration", x

}

此段代码将打印:

1

2

3

4

iteration1

iteration2

iteration3

iteration4

break 和 continue

此外,如同 C 语言一样, awk 提供了 break 和 continue 语句。使用这些语句可以更好地控制 awk 的循环结构。以下是迫切需要 break 语句的代码片断:

1

2

3

4

5

while 死循环

while (1) {

print "forever and ever..."

}

while 死循环 1 永远代表是真,这个 while 循环将永远运行下去。

以下是一个只执行十次的循环:

1

2

3

4

5

6

7

8

9

#break 语句示例

x=1

while(1) {

  print "iteration", x

  if ( x==10 ) {

    break

  }

  x++

}

这里, break 语句用于“逃出”最深层的循环。 "break"使循环立即终止,并继续执行循环代码块后面的语句。
continue 语句补充了 break,其作用如下:

1

2

3

4

5

6

7

8

9

10

11

x=1while (1) {

        if ( x==4 ) {

        x++

        continue

    }

    print "iteration", x

    if ( x>20 ) {

        break

    }

    x++

}

这段代码打印"iteration1"到"iteration21", "iteration4"除外。如果迭代等于 4,则增加 x并调用 continue 语句,该语句立即使 awk 开始执行下一个循环迭代,而不执行代码块的其余部分。如同 break 一样,

continue 语句适合各种 awk 迭代循环。在 for 循环主体中使用时, continue 将使循环控制变量自动增加。以下是一个等价循环:

1

2

3

4

5

6

for ( x=1;x<=21;x++ ) {

    if ( x==4 ) {

        continue

    }

    print "iteration", x

}

在while 循环中时,在调用 continue 之前没有必要增加 x,因为 for 循环会自动增加 x。

数组

AWK 中的数组都是关联数组,数字索引也会转变为字符串索引

1

2

3

4

5

6

7

8

9

10

11

{

    cities[1]=”beijing”

    cities[2]=”shanghai”

    cities[“three”]=”guangzhou”

    for( c in cities) {

        print cities[c]

    }

    print cities[1]

    print cities[“1”]

    print cities[“three”]

}

for…in 输出,因为数组是关联数组,默认是无序的。所以通过 for…in 得到是无序的数组。如果需要得到有序数组,需要通过下标获得。

数组的典型应用

用 awk 中查看服务器连接状态并汇总

1

2

3

netstat -an|awk '/^tcp/{++s[$NF]}END{for(a in s)print a,s[a]}'

ESTABLISHED 1

LISTEN 20

统计 web 日志访问流量,要求输出访问次数,请求页面或图片,每个请求的总大小,总访问流量的大小汇总

1

2

3

4

5

6

7

8

9

awk '{a[$7]+=$10;++b[$7];total+=$10}END{for(x in a)print b[x],x,a[x]|"sort -rn -k1";print

"total size is :"total}' /app/log/access_log

total size is :172230

21 /icons/poweredby.png 83076

14 / 70546

/icons/apache_pb.gif 18608

a[$7]+=$10 表示以第 7 列为下标的数组( $10 列为$7 列的大小),把他们大小累加得到

$7 每次访问的大小,后面的 for 循环有个取巧的地方, a 和 b 数组的下标相同,所以一

条 for 语句足矣

常用字符串函数

字符串函数的应用

替换

1

2

3

awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' this is a test!test!

在 info 中查找满足正则表达式, /[0-9]+/ 用”!”替换,并且替换后的值,赋值给 info 未

给 info 值,默认是$0

查找

1

2

awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'

ok #未找到,返回 0

匹配查找

1

2

awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'

ok #如果查找到数字则匹配成功返回 ok,否则失败,返回未找到

截取

1

2

awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'

s is a tes #从第 4 个 字符开始,截取 10 个长度字符串

分割

1

2

3

4

awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' 4

test 1 this 2 is 3 a

#分割 info,动态创建数组 tA,awk for …in 循环,是一个无序的循环。 并不是从数组下标

1…n 开始

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

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

相关文章

解决一个典型的商业案例研究任务

介绍 印尼的一家公司 Gojek 通过移动应用程序提供运输和物流、食品和购物、支付、日常需求、商业、新闻和娱乐等服务&#xff0c;对经济做出了超过70亿美元的贡献。 它拥有 90 万注册商户、超过 1.9 亿次应用下载以及超过 200 万名司机能够在120分钟内完成超过18万个订单。我们…

chatgpt赋能python:Python创建界面的重要性及实现方法

Python创建界面的重要性及实现方法 作为一名有10年Python编程经验的工程师&#xff0c;我深知Python在Web开发、数据分析和人工智能等方面的强大表现。然而&#xff0c;Python对于前端的支持一直是一个不被关注的领域。 随着网站、移动应用和电脑软件的普及&#xff0c;用户对…

Find My产品|Targus推出最新支持苹果Find My双肩包

Targus宣布推出 Cypress Hero Backpack 双肩包&#xff0c;最大的亮点在于支持苹果“Find My”&#xff0c;在丢失后可定位追踪。 Targus这款双肩包采用了环保材料&#xff0c;可以妥善地保护笔记本电脑&#xff0c;并提供丰富的收纳袋存放各种配件和物品。这款双肩包内置带衬…

Unity Addressables学习笔记(3)---加载远程场景Scenes

前言 Unity Addressables学习笔记—汇总 正文 1.创建一个新场景 我是创建在Resources/Scenes目录下&#xff0c;如图&#xff1a; 2.为场景创建一个Addressables的Group Game1Group就是我新创建的一个Group用来存放场景1的所有资源&#xff0c;分组的配置跟Remote一样&a…

vue 读取本地文件

1. vue读取本地文件 2.在文件夹下添加一个类 3.读取本地文件&#xff0c;先读取文件的内容 4.在 body下添加一个属性 5.读取后&#xff0c;写到 setTimeout方法中&#xff0c;返回一个错误信息。 6. restart方法&#xff0c;在组件渲染时调用 7. return setTimeout &#xff08…

使用Redis的zset集合实现小程序的滚动分页

一、 Redis中&#xff0c;使用有序集合&#xff08;sorted set&#xff09;实现滚动分页的原理如下&#xff1a; 将每个文档的 score 值设置为时间戳&#xff08;或根据其他规则计算的分数&#xff09;&#xff0c;将文档的 ID 作为 value&#xff0c;然后将其添加到有序集合中…

delphi 开发虚拟摄像头

用directshow创建一个虚拟摄像头 然后注册到系统&#xff0c; 在用一个main app 调用摄像头&#xff0c;往里面写流&#xff0c; 可以是屏幕录制&#xff0c;可以是播放的多媒体文件 然后具体是要实现录屏&#xff0c;或者播放多媒体文件&#xff0c;在虚拟摄像头插件中fil…

Godot 4 源码分析 - 初探

准备研究GoDot 4源码。 源码下载 获取源代码 在进入 SCons 构建系统并编译 Godot 之前&#xff0c;你需要将 Godot 的源代码下载到本地。 源代码位于 GitHub 上, 虽然你可以通过网站手动下载它, 但是通常你希望通过 git 版本控制系统来下载. 如果你是为了做贡献或拉动请求…

国产新秀---XS5018A,芯昇,图像信号处理芯片

国产视频处理芯片&#xff0c;大崛起。 XS5018A 是一款针对 CMOS 图像传感器的高性价比图像信号处理芯片&#xff0c;支持 1M/2M 像素 图像传感器&#xff0c;一组 10-bit DVP 输入接口&#xff0c; ISP 具备优异的 3D 降噪功能&#xff0c;标清模拟输出支持 960…

Java官方笔记6继承

继承 Java只有单继承&#xff0c;最顶级的父类是Object。 子类会继承父类的fields和methods&#xff0c;而不会继承constructors&#xff0c;因为constructors不属于methods&#xff0c;但是子类可以通过super调用父类的constructor。 子类继承父类的范围是&#xff1a;public、…

记录--让URL地址都变成了ooooooooo

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 发现一个很有创意的小工具网站&#xff0c;如封面图所示功能很简单&#xff0c;就是将一个URL地址转换为都是 ooooooooo 的样子&#xff0c;通过转换后的地址访问可以转换回到原始地址&#xff0c;简单…

chatgpt赋能python:Python创建Word文档指南

Python创建Word文档指南 在今天的数字时代&#xff0c;Word文档仍然是最常见和使用的文档类型之一。Python是一个强大的编程语言&#xff0c;可以用于自动化创建各种类型的文档&#xff0c;包括Word文档。在本篇文章中&#xff0c;我们将介绍如何使用Python创建Word文档&#…

Rust每日一练(Leetday0019) 跳跃游戏、合并区间、插入区间

目录 55. 跳跃游戏 Jump Game &#x1f31f;&#x1f31f; 56. 合并区间 Mmerge Intervals &#x1f31f;&#x1f31f; 57. 插入区间 Insert Interval &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专…

KP3114电源IC介绍--【其利天下】

KP3114 是一款高性能低成本 PWM 控制功率开关&#xff0c;适用于离线式小功率降压型应用场合&#xff0c;外围电路简单、器件个数少。同时产品内置高耐压 MOSFET 可提高系统浪涌耐受能力。 与传统的 PWM 控制器不同&#xff0c;KP3114 内部无固定时钟驱动 MOSFET&#xff0c;系…

为什么陶瓷板视觉技术会越来越受到人们的青睐?

随着科技的不断进步和应用&#xff0c;陶瓷板视觉技术越来越受到人们的青睐。陶瓷板视觉技术是一种新型的非接触式检测技术&#xff0c;它可以在生产过程中对产品进行高效、准确的检测和质量控制。下面我们来详细了解一下陶瓷板视觉技术的优势和应用。 一、优势 1.高效性 陶…

10款抓包工具优缺点对比

1. Wireshark 介绍&#xff1a;Wireshark是一个免费的网络协议分析工具&#xff0c;支持Windows、macOS和Linux等多个平台。它可以捕获和分析网络数据包&#xff0c;支持多种网络协议解码。优点&#xff1a;功能强大、支持多种协议解码、支持多平台、过滤器功能强大、免费开源。…

QT+OpenGL实例化和抗锯齿

QTOpenGL实例化和抗锯齿 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 实例化 如果我们需要渲染大量物体时&#xff0c; 代码看起来会像这样&#xff1a; for(int i 0; i < amount; i) {DoSom…

Mybatis 别名的配置 + Mybatis配置类的调查

参考资料 Mybatis配置类别名mybatis-spring-boot-autoconfigure类型别名&#xff08;typeAliases&#xff09;SpringBoot五步配置Mybatis超简教程 目录 一. 使用场景二. 前期准备2.1 实体类2.2 查询接口 三. 配置方式1 配置文件的方式3.1 application.yml文件3.2 SQL的XMl文件…

做完这些lab,国内外大厂横着走

hi&#xff0c;大家好&#xff0c;这里是极客重生&#xff0c;坚实的计算机基础&#xff0c;对我们发展都是至关重要的&#xff0c;不管是校招还是社招&#xff0c;因此我和小伙伴一起收集了一些国内外硬核lib和开源项目来帮助大家学习和巩固基础&#xff08;动手实践&#xff…

计算机组成原理 第一章_概述

typora-copy-images-to: images 文章目录 typora-copy-images-to: images1.现代计算机的结构2.各硬件的工作原理2.1 主存储器的基本组成2.2 运算器的基本组成2.3 控制器的基本组成2.4 计算机的工作过程 3.计算机系统的层次结构4. 计算机的性能指标4.1存储器的性能指标4.2 CPU的…