Linux文本处理工具:AWK的妙用

在平时的工作中,会涉及到很多脚本的编写及文本的处理,学好awk可以使你写的脚本看起来更高级,而且涉及到大本文的时候效率也会更高哦,快点赞来学习吧!评论可获得作者精心整理的大厂awk面试相关题目一份

AWK的基本格式

awk [options] ‘program’ file…注释:program->pattern{action statements;..}pattern和action:pattern部分决定动作语句何时触发及触发事件(BEGIN,END)action statements对数据进行处理,放在{}内指明(print, printf)

awk工作原理:

第一步:执行BEGIN{action;… }语句块中的语句第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。第三步:当读至输入流末尾时,执行END{action;…}语句块注意:pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块

注意:awk程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块,共3部分组成。BEGIN语句块和END语句块分别为文家处理前和处理后执行的语句段

1)OPTIONS

选项(options):

-F指明输入时用到的字段分隔符(默认以空格为分隔符)-v var内置变量|var=value: 自定义变量变量分为内置变量和自定义变量:

内置变量:

  • FS:输入字段分隔符,默认为空白字符(与-F效果相同)

[root@dashui ~]# awk -v FS=”:” ‘{print $1,$3}’ /etc/passwdroot 0bin 1daemon 2

  • OFS:输出字段分隔符,默认为空白字符

[root@dashui ~]# awk -v FS=”:” -v OFS=”*” ‘{print $1,$3}’ /etc/passwdroot*0bin*1daemon*2

  • RS:输入记录分隔符,指定读入时的换行符,原换行符仍有效

[root@dashui ~]# awk -v RS=’ ‘ ‘{print}’ hah //指定读入时的分割符,只要出现空格就被换行nihaoahahaiamfanin[root@dashui ~]# cat hah nihao a hahai amfanin

  • ORS:输出记录分隔符,输出时用指定符号代替换行符

[root@dashui ~]# cat hah nihao a hahai amfanin[root@dashui ~]# awk -v ORS=’=== ‘ ‘{print}’ hah //指定输出分隔符为===,所以原来换行被替换成===nihao a haha=== i amfanin=== [root@dashui ~]#

  • NF:字段数量

[root@dashui ~]# awk -F: ‘{print NF}’ /etc/passwd //以:为分隔符,每一行有几个字段777

  • NR:行号(如果有多个文件,则行号统计在一起)

[root@dashui ~]# awk ‘{print NR}’ hah12[root@dashui ~]# awk ‘{print NR}’ hah /etc/fstab //hah的行号和/etc/fstab的统计在了一块 1234567891011121314

  • FNR:各文件分别计数,行号

[root@dashui ~]# awk ‘{print FNR}’ hah /etc/fstab 12123456789101112FILENAME:当前文件名[root@dashui ~]# awk ‘{print FILENAME}’ hah //因为前面的pattern没有写,所以默认每读入一行,就执行一次printhahhah[root@dashui ~]# cat hah nihao a hahai amfanin

  • ARGC:命令行参数的个数

[root@dashui ~]# awk ‘{print ARGC}’ hah //其中第一个参数为awk ,第二个为 hah22

  • ARGV:数组,保存的是命令行所给定的各参数

[root@dashui ~]# awk ‘{print ARGV[0]}’ hah //0是第一个参数,1是第二个参数awkawk[root@dashui ~]# awk ‘{print ARGV[1]}’ hah hahhah

  • 自定义变量
  • (1) -v var=value变量名区分字符大小写(2) 在program中直接定义

[root@dashui ~]# awk -v name=xiaoshui ‘BEGIN{print name}’xiaoshui[root@dashui ~]# awk ‘BEGIN{name=”xiaozhao”;print name}’xiaozhao 注意:自定义变量时需要加上双引号,不加的话可能会定义不成功,如下[root@dashui ~]# awk ‘BEGIN{name=xiaozhao;print name}'[root@dashui ~]# awk ‘BEGIN{name=”xiaozhao”;print name}’xiaozhao

2)program

program分为pattern和action

pattern部分决定动作语句何时触发及触发事件(BEGIN,END)action statements对数据进行处理,放在{}内指明(print, printf)(1)action(print、printf)

Expressions:算术,比较表达式等Control statements:if, while等Compound statements:组合语句input statementsoutput statements:print等

print

print格式:print item1, item2, …

(1) 逗号分隔符(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式(3) 如省略item,相当于print $0

[root@dashui ~]# awk -F : ‘{print $1,$3}’ /etc/passwdroot 0bin 1daemon 2[root@dashui ~]# awk -F : ‘{print $1,”xiaoshui”,$3}’ /etc/passwdroot xiaoshui 0bin xiaoshui 1daemon xiaoshui 2[root@dashui ~]# awk -F : ‘{print }’ /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin

  • printf

格式化输出:printf“FORMAT”, item1, item2, …(1) 必须指定FORMAT(2) 不会自动换行,需要显式给出换行控制符,(3) FORMAT中需要分别为后面每个item指定格式符

格式符:与item一一对应

%c: 显示字符的ASCII码%d, %i: 显示十进制整数%e, %E:显示科学计数法数值%f:显示为浮点数%g, %G:以科学计数法或浮点形式显示数值%s:显示字符串%u:无符号整数%%: 显示%自身

修饰符:

#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f-: 左对齐(默认右对齐)%-15s+:显示数值的正负符号%+d[root@dashui ~]# awk -F : ‘{printf “%s %d”,$1,$3 }’ /etc/passwd //如果不加默认是不换行的root 0bin 1daemon 2

(2)pattern

  • PATTERN:根据pattern条件,过滤匹配的行,再做处理

(1)如果未指定:空模式,匹配每一行(2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来

[root@dashui ~]# awk ‘/^UUID/{print $1}’ /etc/fstab // 以UUID开头的行UUID=136f7cbb-d8f6-439b-aa73-3958bd33b05fUUID=bf3d4b2f-4629-4fd7-8d70-a21302111564UUID=cbf33183-93bf-4b4f-81c0-ea6ae91cd4f6UUID=5e11b173-f7e2-4994-95b9-55cc4c41f20b

  • relational expression: 关系表达式,结果有“真”有“假”,结果为“真”才会被处理

真:结果为非0值,非空字符串假:结果为空字符串或0值

[root@dashui ~]# awk ‘0{print $0}’ hah //因为前面为0,所以不执行[root@dashui ~]# awk ‘!0{print $0}’ hah //与上面相反nihao a hahai amfanin[root@dashui ~]# awk -F: ‘$3==0{print $0}’ /etc/passwd //只有当$3=0时候,才会执行printroot:x:0:0:root:/root:/bin/bash

  • (4) line ranges:行范围

startline,endline:/pat1/,/pat2/不支持直接给出数字格式

[root@dashui ~]# awk -F: ‘/^root>/,/^daemon>/{print}’ /etc/passwd //打印以root开头与以daemon开头的之间的行root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin[root@dashui ~]#

  • (5)(5) BEGIN/END模式

BEGIN{}: 仅在开始处理文件中的文本之前执行一次END{}:仅在文本处理完成之后执行一次

[root@dashui ~]# awk ‘BEGIN{print “start”}{print $0}END{print “end”}’ hah //在开始和结束时候分别打印start和endstartnihao a hahai amfaninend[root@dashui ~]# cat hahnihao a hahai amfanin


AWK的操作

  • 算术操作符:

x+y, x-y, x*y, x/y, x^y, x%y-x: 转换为负数+x: 转换为数值

[root@dashui ~]# awk ‘BEGIN{i=1;j=2;sum=i+j;{print sum}}’ 3

  • 字符串操作符:没有符号的操作符,字符串连接

赋值操作符:=, +=, -=, *=, /=, %=, ^=++, –比较操作符:, >=, <, <=, !=, ==模式匹配符:~:左边是否和右边匹配包含!~:是否不匹配

[root@dashui ~]# awk -F: ‘$1~”root”{print $0}’ /etc/passwd //当$1即usrename为root或者包含 root时候,执行printroot:x:0:0:root:/root:/bin/bashchroot:x:1003:1003:,62984566:/home/chroot:/bin/bashrooter:x:3320:4327:,62984566:/home/rooter:/bin/bash[root@dashui ~]# awk -F: ‘$3<2{print $0}' /etc/passwd //$3即uid小于2时,执行printroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin

  • 逻辑操作符:与&&,或||,非!

[root@dashui ~]# awk -F: ‘$3>1000 && $3<2000{print $0}' /etc/passwdxiaoshui:x:1001:1001:xiaoshui,342342342:/home/xiaoshui:/bin/bashchroot:x:1003:1003:,62984566:/home/chroot:/bin/bashcentos:x:1004:1004:,62984566:/home/centos:/bin/bash[root@dashui ~]# awk -F: '$1=="root" || $1=="xiaoshui"{print $0}' /etc/passwdroot:x:0:0:root:/root:/bin/bashxiaoshui:x:1001:1001:xiaoshui,342342342:/home/xiaoshui:/bin/bash

  • awk控制语句

{ statements;… } 组合语句 if(condition) {statements;…} if(condition) {statements;…} else {statements;…} while(conditon) {statments;…} do {statements;…} while(condition) for(expr1;expr2;expr3) {statements;…} break continue delete array[index] delete array exit

  • (1){ statements;… } 组合语句

[root@dashui ~]# awk ‘{a=1;print a}’ hah //将多个语句组合在一起11

  • (2) if(condition) {statements;…}

[root@dashui ~]# awk -F: ‘{if($3==0){print $0}}’ /etc/passwdroot:x:0:0:root:/root:/bin/bash**注意:条件在小括号中,条件后的语句需在{ }中**

  • (3) if(condition) {statements;…} else {statements;…}
  • if(condition1){statement1}else if(condition2){statement2}else{statement3}

[root@dashui ~]# awk ‘{if($0==”dashui”){print “dashui”} else{print “not dashui”}}’ hahnot dashuinot dashuidashui[root@dashui ~]# cat hahnihao a hahai amfanindashui

  • (4) while(conditon) {statments;…}

//下面是找到以空格开头后跟linux16的行,将匹配到的行中的每个字段的长度与8比较,大于8的输出[root@dashui ~]# awk ‘/^[[:space:]]+linux16/{i=1;while(i8){print $i,length($i)};i++}}’ /etc/grub2.cfg /vmlinuz-3.10.0-327.el7.x86_64 30root=UUID=136f7cbb-d8f6-439b-aa73-3958bd33b05f 46net.ifnames=0 13/vmlinuz-0-rescue-3f3be6c44d1047a8b32f91efd2f2c5ab 50root=UUID=136f7cbb-d8f6-439b-aa73-3958bd33b05f 46net.ifnames=0 13 做上面的实验时,因为手抖输出了点,将if后面的print中i前面的$符号给忘记了,结果就成了下面的情况[root@dashui ~]# awk ‘/^[[:space:]]+linux16/{i=1;while(i8){print i,length(i)};i++}}’ /etc/grub2.cfg 2 13 17 12 13 17 1

//分析:print i,因为前面i赋值的是数字,本意是想打印

符号丢掉时,i也只是代表数字了所以打印出来的237237表示的就是第几个字段,而length(i)就更好理解了,因为length()就是求括号中的字符串的长度,且因为i都为个位数,所以就为1喽(注意:如果单单是length(i),i之前没有被定义,此时打印出来的为0,以为i之前没有被定义,所以为空)

  • (5)do-while循环

语法:do {statement;…}while(condition)意义:无论真假,至少执行一次循环体

[root@dashui ~]# awk ‘BEGIN{i=0;do{i++}while(i<1){print i}}'1[root@dashui ~]# awk 'BEGIN{i=0;do{i++}while(i<=1){print i}}'2

  • (6)for循环

语法:for(expr1;expr2;expr3) {statement;…}

[root@dashui ~]# awk ‘/^[[:space:]]+linux16/{for(i=1;i<NF;i++){print $i}}' /etc/grub2.cfg linux16/vmlinuz-3.10.0-327.el7.x86_64root=UUID=136f7cbb-d8f6-439b-aa73-3958bd33b05frorhgbquietlinux16/vmlinuz-0-rescue-3f3be6c44d1047a8b32f91efd2f2c5abroot=UUID=136f7cbb-d8f6-439b-aa73-3958bd33b05frorhgbquiet特殊用法:能够遍历数组中的元素;语法:for(varin array) {for-body}[root@dashui ~]# awk -F: '{bash[$7]++}END{for (i in bash){print i,bash[i]}}' /etc/passwd/etc/nologin 2/bin/sync 1/bin/bash 47/shell/csh 1/sbin/nologin 34/sbin/halt 1/bin/csh 2/sbin/shutdown 1[root@dashui ~]#

  • (7)switch语句

语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}

  • (8)break和continue

break表示跳出循环,而continue表示跳过本轮循环

[root@dashui ~]# awk ‘BEGIN{sum=0;for(i=1;i<10;i++){if(i==5){break}print i}}'1234[root@dashui ~]# awk 'BEGIN{sum=0;for(i=1;i<10;i++){if(i==5){continue}print i}}'12346789

  • (9)next

提前结束对本行处理而直接进入下一行处理(awk自身循环)

#$3%2!=0即uid为奇数,跳过此行,即只打印uid为偶束的行[root@dashui ~]# awk -F: ‘{if($3%2!=0) next; print $1,$3}’ /etc/passwdroot 0daemon 2lp 4shutdown 6mail 8games 12

awk数组

关联数组:array[index-expression]

index-expression:

(1) 可使用任意字符串;字符串要使用双引号括起来(2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历

注意:如果数组的键值为字符串时,最后以双引号给引起来

[root@dashui ~]# awk ‘BEGIN{weekdays[“mon”]=”Monday”;weekdays[“tue”]=”Tuesday”;print weekdays[“mon”]}’Monday若要遍历数组中的每个元素,要使用for循环[root@dashui ~]# netstat -tan|awk ‘/^tcp>/{state[$NF]++}END{for(i in state){print i,state[i]}}’LISTEN 3ESTABLISHED 1

awk函数

  • 数值处理:

rand():返回0和1之间一个随机数

注意:需配合srand()函数使用,不然不是随机数

[root@dashui ~]# awk ‘BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100)}'54452324147256923131

  • 字符串处理:

length([s]):返回指定字符串的长度

sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹配的内容替换为s

gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容

[root@dashui ~]# echo “2008:08:08 08:08:08″|awk ‘sub(“:”,”-“,$0)’2008-08:08 08:08:08[root@dashui ~]# echo “2008:08:08 08:08:08″|awk ‘gsub(“:”,”-“,$0)’2008-08-08 08-08-08[root@dashui ~]#

split(s,array,[r]):以r为分隔符,切割字符s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…

这里使用split函数将第五个字段中的ip和端口号分开,只取出了ip。

[root@dashui ~]# netstat -tan | awk ‘/^tcp>/{split($5,ip,”:”);count[ip[1]]++}END{for (i in count) {print i,count[i]}}’10.1.0.82 10.0.0.0 3[root@dashui ~]# netstat -tan Active Internet connections (servers and established)Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 52 10.1.0.26:22 10.1.0.82:54143 ESTABLISHEDtcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN [root@dashui ~]#

  • 自定义函数

格式:function name ( parameter, parameter, … ) {statementsreturn expression}

这里自定义了一个函数,求出两个变量的最大值。

[root@dashui ~]# awk -f awk.fun 3[root@dashui ~]# cat awk.fun function max(v1,v2) {v1>v2?var=v1:var=v2return var}BEGIN{a=3;b=2;print max(a,b)}**注意:和之前的shell中的函数有些不同,这里如果需要像awk函数中传递变量,则需要在括号中定义形参。**

awk中调用shell命令

  • system命令

[root@dashui ~]# awk BEGIN'{system(“hostname”)}’dashui.localdomain

空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了awk的变量外其他一律用””引用起来。

[root@dashui ~]# awk ‘BEGIN{name=”xiaoshui”;system(“echo your name is ” name)}’your name is xiaoshui

awk脚本

将awk程序写成脚本,直接调用或执行

将action写入到脚本中,然后调用执行[root@dashui ~]# awk -F: -f f1.awk /etc/passwdroot 0bin 1daemon 2adm 3hu [root@dashui ~]# cat f1.awk {if($3<4)print $1,$3}# 脚本文件中的/bin/awk -f表示是用awk -f来执行下面语句[root@dashui ~]# ./f1.awk -F: /etc/passwdroot 0bin 1daemon 2adm 3hu [root@dashui ~]# cat f1.awk #!/bin/awk -f#this is a awk script{if($3<4)print $1,$3}

  • 向awk脚本传递参数

格式:awkfile var=value var2=value2… Inputfile

# min和max分别对应脚本文件中的min和max[root@dashui ~]# ./f1.awk -F: min=100 max=200 /etc/passwdavahi-autoipd 170abrt 173rtkit 172usbmuxd 113pulse 171[root@dashui ~]# cat f1.awk #!/bin/awk -f{if($3>=min && $3<=max)print $1,$3}

强化练习

  • 1.打印一个表头,并且打印用户名和ID

[root@dashui ~]# awk -F: ‘BEGIN{printf “Username UID”}{printf “%-20s %d”,$1,$3}’ /etc/passwdUsername UIDroot 0bin 1daemon 2adm 3lp 4sync 5shutdown 6halt 7mail 8operator 11games 12

  • 2.打印一个表头和表尾,并打印用户名,ID,及shell

[root@dashui ~]# awk -F: ‘BEGIN{printf “Username UID Shell”}{printf “%-20s %d %10s”,$1,$3,$5}END{print “Finished…”}’ /etc/passwdUsername UID Shellroot 0 rootbin 1 bindaemon 2 daemonadm 3 admlp 4 lpsync 5 syncshutdown 6 shutdown…省略…haha 4376 xixi 4377 hehe 4378 Finished…[root@dashui ~]#

  • 3.对文本中的字段进行字符个数统计

[root@dashui ~]# awk ‘{print $0,length($0)}’ hahnihao a haha 12i amfanin 9dashui 6

  • 4.打印字符个数大于等于8的字段

#其实就是比题3多了一条if判断语句[root@dashui ~]# awk ‘{if(length($0)>8){print $0,length($0)}}’ hahnihao a haha 12i amfanin 9

  • 5.统计系统中shell的类型,并打印shell引用的次数

#中间运用了数组和for循环[root@dashui ~]# awk -F: ‘{count[$7]++}END{for (i in count){print i,count[i]}}’ /etc/passwd/etc/nologin 2/bin/sync 1/bin/bash 47/shell/csh 1/sbin/nologin 34/sbin/halt 1/bin/csh 2/sbin/shutdown 1

  • 6.统计fstab文件中,各文件系统被引用的次数

#比上题多了一步地址定界[root@dashui ~]# awk ‘/^[^#]/{count[$3]++}END{for (i in count){print i,count[i]}}’ /etc/fstab swap 1xfs 3

  • 7.统计系统中各TCP连接状态的数量

[root@dashui ~]# netstat -tan|awk ‘/^tcp>/{state[$6]++}END{for (i in state){print i,state[i]}}’LISTEN 3ESTABLISHED 1

  • 8.将文本的重复行去掉

#第一次读取aaa,arr[aaa]因为没有定义,所以为空,又取非,所以为真,arr[aaa]++是先赋值后加加,所以第一次打印出来#第二次,在遇见aaa时候,因为之前有值了arr[aaa]=1,所以取反为0,不执行后的print操作,但是++依然正常运行[root@dashui ~]# awk ‘!arr[$0]++’ hahaaabbbcccdddfff[root@dashui ~]# cat hah aaabbbcccaaadddaaaaaafffccc[root@dashui ~]#

谢谢浏览,以后会不定时更新…

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月21日
下一篇 2022年6月21日

相关推荐

  • 游戏听声辩位操作得心应手,双飞燕血手幽灵MR710无线耳机评测

    对于游戏党来说,玩游戏靠的不仅仅过硬的技术,关键时刻跟设备也有很大的关系。想啊哟在游戏中轻松取胜,有一双“顺风耳”可是非常重要的,它可以让我们耳听八方,时刻掌握敌军的情况。 #pg…

    2022年8月11日
  • Rufus 已支持绕过 Win11 22H2 强制登录微软账户要求

    IT之家 6 月 26 日消息,今年 5 月,微软开始强制要求新安装 Windows 11 22H2 Insider 版本后登录 Microsoft 帐户。目前已经有多种方法绕过这…

    2022年6月27日
  • 七爪源码:人类的 JavaScript 数据类型

    JS中数据类型的基础知识,适合初学者 数据类型是对数据的分类,它决定了该数据的可能值,以及您可以对它执行的操作。 JavaScript 有八种基本数据类型。 字符串 字符串是一组多…

    2022年6月26日
  • 《LOL》从代码上来说最难的是哪个英雄?

    这个问题有意思,虽然没接触过做游戏,但我好歹是个敲代码的,也玩过好几年时间的LOL,应该有资格来说一说。 在我看来,一个英雄的代码复杂度是和玩家交互的复杂度成正比,可以理解为操作越…

    2022年7月29日
  • Blender 3.2 更新!地表最强开源3D软件又上新功能啦

    期待已久的Bledner3.2终于发布,该软件此次增添了不少新功能和工具,比如Light Groups功能、shadow caustics和Curve Pen工具…不仅如此还有对B…

    2022年6月14日
  • 比亚迪回应巴菲特减持133万股 股票下跌多少?

    8月30日,港交所文件显示,巴菲特旗下公司近日减持133万股比亚迪股份。此消息一经曝光,引发市场的关注。受此影响,比亚迪股价下跌。8月31日,比亚迪方面对此进行回应。下面,我们一起…

    2022年8月31日
  • pdf怎么转word文档(有没有免费pdf转word软件)

    PDF转Word一直是上班族经常会遇到的办公难题,除了要用软件去转换之外,有没有其他免费又好用的方法呢?别说,还真有,今天就给大家分享三个实用的好方法吧! 一、直接复制 1.用PD…

    2022年4月19日
  • 比KO3实惠一半!掌阅最新阅读旗舰Ocean2超轻薄,看书更舒适

    Hello,大家好,我是静读君。 上一篇讲了Kindle的替代阅读器,其中简要说明Ko3的对标产品–掌阅Ocean 2。它们的具体参数如下: 静读君手上刚好有一台掌阅O…

    2022年6月22日
  • 剧本杀编剧的创作生态-

    近两年,剧本杀风靡全国,成为电影、KTV等娱乐活动之外的社交新宠。编剧产出剧本,进入发行销售,最终店家购买,玩家才能体验。因此,剧本始终是剧本杀的灵魂所在。 伴随着剧本杀的火热,剧…

    2022年6月30日
  • 安居,空置率,过剩?房子是抵抗通货膨胀的工具?

    买房,租房,达到安居。我个人胡说八道,不知道平台审核是否通过哦。 有钱的可以别墅山庄,没钱的可以乡野茅舍!不必强求,生命只是一个过程!活的是一个心态!生命短暂,请好好享受生命,不要…

    2022年8月31日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息