1、查看linux中某个端口是否被占用
1> 使用lsof
lsof -i:端口号 查看该端口是否被占用
2> 使用netstat
netstat -antpu |grep 80 过滤端口80的使用状态
2、linux中源码包编译安装后,不受systemctrl控制,启动/关闭服务方式:
启动:/usr/local/nginx/sbin/nginx【没有报错提示,代表成功了】
关闭:/usr/local/nginx/sbin/nginx -s stop
报错:Address already in use 【把http关掉】
注意:同一个端口在使用过程中,不能同时被两个程序占用
3、正常yum安装的非源码包,受systemctrl控制,可以systemctrl控制启动/关闭
启动:systemctrl restart httpd
关闭:systemctrl stop httpd
启动:service start httpd
关闭:service stop httpd
4、Linux里面$#、$0、$1、$2、$@、$*、$$、$?、$!、$_的含义
$#:传给脚本的变量总个数
$0:表示脚本本身的名字
$1:传给该shell脚本的第一个变量
$2:传给该shell脚本的第二个变量
$@:传给脚本的所有变量
$*:是以一个单字符串显示所有传递给脚本的变量,与位置变量不同,这个变量可超过9个
$$:脚本运行的当前进程ID号
$?:显示最后命令的执行状态,0表示执行成功,非0值表示执行失败
$!:代表最后一个后台进程的进程号,【可用于脚本进度条,执行完脚本后杀死该进程,杀死进度条】
$_:代表上一命令的最后一个参数
5、Linux里面隐藏所敲打的命令【常用于屏蔽显示密码及位数】
stty -echo 隐藏键盘输入命令
stty echo 显示键盘输入命令
6、Linux里面的三种引号
双引号(“ ”):界定一个完整的字符串
单引号(‘ ’):界定一个完整的字符串,且实现屏蔽特殊符号
反引号(` `):引用命令、提取命令结果 `命令`==$(命令)
7、bc计算器里的scale取结果位数
bc [选项]
-i:强制进入交互式模式; -l:定义使用的标准数学库; -w:对POSIX bc环境信息; -v:显示指令版本信息; -h:显示指令的帮助信息。 scale=n,管道给计算器后的值,取n位小数
# echo "scale=2;10/3"|bc -l # scale只对除法、取余、乘幂有效;规避办法:在最终结果加括号后除1
3.33
# echo "scale=2;(3.666*4.562)/1"|bc -l #采用结果除1巧妙地把想要的结果变出来了
16.72
8、Linux系统里面ssh操作
[root@room8pc205 ~]# ssh -X root@192.168.4.100 //这是正常情况下用ssh命令远程到虚拟机(ip:192.168.4.100)上
[root@room8pc205 ~]# ssh -X -p 1992 root@192.168.4.100 //这是在虚拟机(ip:192.168.4.100)在ssh服务配置文件最后增加了端口号Port 1992的情况下远程访问方式,-X 是以支持图形界面远程,-p [端口号] 这是表示从对方ssh配置文件设置的特定端口连接对方的ssh, root@192.168.4.100是以root身份远程。
9、Linux系统里面scp操作
[root@room8pc205 ~]# scp a.txt 192.168.4.100:/opt/ //这是正常情况下用scp命令传输文件到对方的/opt目录下
[root@room8pc205 ~]# scp -P 1992 a.txt 192.168.4.254:/opt/ //这是在对方的ssh加了端口号1992后,传输文件到对方的/opt目录下
10、Linux里面char与varchar的区别
在mysql教程中char与varchar都是用来存储字符串的,但是他们的保存方式不一样,char有固定的长度,而varchar属于可变长的字符类型。
char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)。
适宜使用char类型的情况:
- 存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的现在得不偿失。
- 固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。
- 十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。
使用varchar注意事项:
还有一个关于varchar的问题是,varchar他既然可以自动适应存储空间,那我varchar(8)和varchar(255)存储应该都是一样的,那每次表设计的时候往大的方向去好了,免得以后不够用麻烦。这个思路对吗?答案是否定的。mysql会把表信息放到内存中(查询第一次后,就缓存住了...,linux下很明显,但windows下似乎没有,不知道为啥),这时内存的申请是按照固定长度来的,如果varchar很大就会有问题。所以还是应该按需索取;由于某种原因char 固定长度,所以在处理速度上要比varchar快速很多,但是对费存储空间,所以对存储不大,但在速度上有要求的可以使用char类型,反之可以用varchar类型来实例。
建意:
- myisam 存储引擎 建议使用固定长度,数据列代替可变长度的数据列。
- memory存储引擎 目前都使用固定数据行存储,因此无论使用char varchar列都没关系,
- innodb 存储引擎 建意使用varchar 类型
11、MySQL里面数值类型的数
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
tinyint | 1字节 | -128~127 |
0~255 |
微小整数 |
smallint | 2字节 | -32768~32767 | 0~65535 |
小整数 |
mediumint | 3字节 | -2^23~2^23-1 |
0~2^24-1 |
中整数 |
int | 4字节 | -2^31~2^31-1 |
0~2^32-1 |
大整数 |
bigint | 8字节 | -2^63~2^63-1 | 0~2^64-1 |
极大整数 |
float | 4字节 | 单精度浮点数 | ||
double | 8字节 | 双精度浮点数 | ||
decimal | 对decimal(M,D),其中M为有效位数、D为小数位数,M应大与D,占M+2字节 |
mysql数据库中以:数据类型(m) 来约束数据,其中数字m在不同的数据类型中表示含义是不同的;这里以整形数据为例,例如tinyint(m)、int(m)、bigint(m),其中m代表显示宽度,对输入的值的大小没有影响,当字符长度超过(m)时,显示的值就是字符的真实位数(总位数超过m位);当字符长度小于(m)时,显示值是字符值加填充值(总位数等与m位),未设置时,系统默认拿空格填充,人眼看不出变化,一般设置为zerofill(表示用0填充),这样可以保持数据完整性和美观性。
12、Linux中重要的文件/etc/passwd和/etc/shadow
linux操作系统上的用户如果需要登录主机,当其输入用户名和密码之后:
- 首先在/etc/passwd文件中查找是否有你的账号,如果没有无法登录,如果有的话将该用户的UID和GID读出来,此外将此用户的shell设置也一并读出。
- 然后根据UID到/etc/shadow文件中去寻找相应用户的密码,如果匹配一致
- 进入shell控制的阶段。
/etc/passwd由“:”分割成7个字段
[root@53 ~]# cat -n /etc/passwd |head -5 //按行查看/etc/passwd前5行,以“:”为分割符号,分割成7个字段
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
第一字段:用户名
第二字段:用户的密码原来直接存储在第二字段,但是为了安全,最后专门有了/etc/shadow文件,现在默认用x替代
第三字段:用户的uid,一般情况下root为0,1-499默认为系统账号,有的更大些到1000,500-65535为用户的可登录账号,有的系统从1000开始。
第四字段:用户的gid,linux的用户都会有两个ID,一个是用户uid,一个是用户组id,在我们登录的时候,输入用户名和密码,其实会先到/etc /passwd查看是否有你输入的账号或者用户名,有的话将该账号与对应的UID和GID(在/etc/group中)读出来。然后读出主文件夹与 shell的设置,然后再去检验密码是否正确,正确的话正常登录。
第五字段:用户的账号说明解释
第六字段:用户的家目录文件夹
第七字段:用户使用的shell,如果换成/sbin/nologin/就是默认没有登录环境的。
/etc/shadow由“:”分割成9个字段
[root@53 ~]# cat /etc/shadow |head -5
root:$6$mRObz2Sl$lHrUUJD7SIGDupGx7GnSKceTwfg/lK.qxYHOshnMwsCgYtcEcW45QvVsdiZ5l6y89nY7qkwAF0J.646WgFcRu0:17297:0:99999:7:::
bin:*:16579:0:99999:7:::
daemon:*:16579:0:99999:7:::
adm:*:16579:0:99999:7:::
lp:*:16579:0:99999:7:::
第一字段:用户名,跟/etc/passwd对应。
第二字段:用户的密码加密字段,加密密码,加密算法升级为SHA512散列加密算法,如果密码位为“!!”或“*”代表没有密码,不能登录,其shell为/sbin/nologin。
第三字段:密码最后一次修改的时间,距离Linux诞生的日期(从1970-01-01开始,为什么?因为unix1969年发布雏形,基于当时对系统的考虑,就这样了),以1970年1月1日作为标准时间,每过一天时间间隔的时间戳加1天。
第四字段:密码最少多少天之后可以修改,要过多少天才可以更改密码,默认是0,即不限制密码的有效期
第五字段:密码多少天之后必须修改(例子中99999就是表明可以一直不用修改密码),若设置成20,即20天后到期,必须修改密码,不然登录不了系统。
第六字段:密码到期前的警告期限,若设置为6,即到期前6天将通知用户。密码修改之前几天提醒我修改(例子中是7天之前)
第七字段:账号失效宽限期(和第5字段相对比),要是没有修改延长几天,若设置为2,到期过后2天后再不修改密码,用户锁定。
第八字段:账号的生命周期(要用时间戳表示),到了指定的期限,账号将失效。无论怎样到这个时间过期(例子中的时间从1970-01-01算)
第九字段:保留字段,目前无含义
Linux系统推算root密码最后一次更改日期,计算距离1970-1-1时间:
[root@52 ~]# date -u -d"1970-01-01 UTC $((13025*86400))seconds" //这个13025是指相对1970年1月1日到现在已经经过多少天, 其中86400是一天多少秒? 60*60*24=86400秒
2005年 08月 30日 星期二 00:00:00 UTC
[root@52 ~]# date -u -d"1970-01-01 UTC $((17297*86400))seconds" //例如上面例子中的root密码最后一次更改时间如此
2017年 05月 11日 星期四 00:00:00 UTC
13、设置ssh欢迎页面信息
/etc/issue #登录前提示
/etc/motd #登录后提示
ssh还可以修改/etc/ssh/sshd_config里Banner项所指示的文件
14、Linux命令查看日历
[root@room8pc205 ~]# cal
用法:
cal [选项] [[[日] 月] 年]
选项:
-1, --one 只显示当前月份(默认)
-3, --three 显示上个月、当月和下个月
-s, --sunday 周日作为一周第一天
-m, --monday 周一用为一周第一天
-j, --julian 输出儒略日
-y, --year 输出整年
-V, --version 显示版本信息并退出
-h, --help 显示此帮助并退出
15、Linux命令查看天气预报
前提:命令行查询天气预报,需要能连上因特网的 Linux
原理:http://wttr.in
是一个允许你搜索世界各地天气预报的网站,而且它的是以 ASCII 字符的形式来显示结果的。通过使用 curl
访问 http://wttr.in
,就能直接在终端显示查询结果了。
[root@room8pc205 ~]# curl wttr.in/New+York //显示纽约天气
[root@room8pc205 ~]# curl wttr.in //获取所在地的天气信息,根据IP地址定位,可能有误差
[root@room8pc205 ~]# curl wttr.in/shenzhen //获取指定位置的天气
[root@room8pc205 ~]# curl wttr.in/New+York //你可以通过在 wttr.in
后加上斜杠和城市名称的方式来获得其他城市的天气情况。不过要把名字中的空格替换成 +
。
[root@room8pc205 ~]# curl wttr.in/New_York //你也可以以 Unix 时区的形式来填写城市名称
[root@room8pc205 ~]# curl wttr.in/JFK //若你对地区的三位机场代号很熟悉,你也可以使用机场代号来查询天气。一般来说使用机场要比使用城市更贴近你,而且更精确一些。
[root@room8pc205 ~]# curl wttr.in/~Statue+Of+Liberty //通过使用 ~
字符,你可以让 wttr.in
通过地标来猜测天气情况。
[root@room8pc205 ~]# curl wttr.in/@linuxconfig.org //你想不想知道 LinuxConfig 托管地的天气?现在有一个方法可以知道! wttr.in
可以通过域名获取天气。是的,这个功能可能不那么实用,但这很有趣啊。
更改温度单位:默认情况下, wttr.in 会根据你的实际地址来决定显示哪种温度单位(C 还是 F)。基本上,在美国,使用的是华氏度,而其他地方显示的是摄氏度。你可以指定显示的温度单位,在 URL 后添加 ?u 会显示华氏度,而添加 ?m 会显示摄氏度。
[root@room8pc205 ~]# curl wttr.in/New_York?m
[root@room8pc205 ~]# curl wttr.in/Toronto?u
在 ZSH 上有一个很奇怪的 bug,会使得这两条语句不能正常工作,如果你需要更换单位,恐怕需要改成使用 Bash 了。
注释:ZSH是一个Linux用户很少使用的shell,这是由于大多数Linux产品安装,以及默认使用bash shell。几乎每一款Linux产品都包含有zsh,通常可以用apt-get、urpmi或yum等包管理器进行安装
16、Linux服务器jps报process information unavailable
在Linux下执行 jps 是快速查看Java程序进程的命令,一般情况下hadoop,hbase,storm等进程都是通过jps查看,有些时候因为进程没有被正常结束,比如资源占用过大时挂掉或者没有结束进程就直接重启计算机,会导致原有进程变为-- process information unavailable这样的空值,有时候不用管它,一段时间后会自动消失,如果一直不消失的情况下,可以使用如下方法清理:
进入/tmp目录 cd /tmp 可以看到有很多以hsperfdata_{用户名}这样的目录,比如:hsperfdata_hbase,hsperfdata_kafka,hsperfdata_root这样的目录,是因为进程虽然在内存中关闭了,但是Linux还会在/tmp下寻找这些临时文件,而此时临时文件并没有没正常删除,这时候直接执行 rm -rf hsperfdata_* 删除这些目录,然后再次执行 jps 查看,以上那些进程就不存在了,总的来说直接执行 rm -rf /tmp/hsperfdata_* 可以快速清除那些残留进程
如果有很多正常运行的进程时,其中夹杂部分残留进程,这个时候不建议全部删除上面的目录,这时候要根据目录和进程的对应关系分析出残留的单个目录来删除无用的进程即可
17、添加用户并修改用户密码以及删除用户及用户家目录:
[root@localhost /]# useradd --help
用法:useradd [选项] 登录
useradd -D
useradd -D [选项]
选项:
-b, --base-dir BASE_DIR 新账户的主目录的基目录 #以这个指定目录为基目录,在其目录下创建用户家目录,如不指定则默认以/home目录为基目录
-c, --comment COMMENT 新账户的 GECOS 字段
-d, --home-dir HOME_DIR 新账户的主目录 #指定用户家目录,一般用绝对路径,优先级最高,指定后用户家目录为该目录,一般不指定已存在的目录,否则将不能删除用户家目录
-D, --defaults 显示或更改默认的 useradd 配置
-e, --expiredate EXPIRE_DATE 新账户的过期日期
-f, --inactive INACTIVE 新账户的密码不活动期
-g, --gid GROUP 新账户主组的名称或 ID #指定新建用户的主组
-G, --groups GROUPS 新账户的附加组列表 #指定新建用户附属组
-h, --help 显示此帮助信息并推出
-k, --skel SKEL_DIR 使用此目录作为骨架目录
-K, --key KEY=VALUE 不使用 /etc/login.defs 中的默认值
-l, --no-log-init 不要将此用户添加到最近登录和登录失败数据库
-m, --create-home 创建用户的主目录
-M, --no-create-home 不创建用户的主目录
-N, --no-user-group 不创建同名的组
-o, --non-unique 允许使用重复的 UID 创建用户
-p, --password PASSWORD 加密后的新账户密码
-r, --system 创建一个系统账户
-R, --root CHROOT_DIR chroot 到的目录
-s, --shell SHELL 新账户的登录 shell
-u, --uid UID 新账户的用户 ID
-U, --user-group 创建与用户同名的组
-Z, --selinux-user SEUSER 为 SELinux 用户映射使用指定 SEUSER
[root@localhost /]# userdel --help
用法:userdel [选项] 登录
选项:
-f, --force force some actions that would fail otherwise e.g. removal of user still logged in or files, even if not owned by the user
-h, --help 显示此帮助信息并推出
-r, --remove 删除主目录和邮件池 #删除用户时顺带将用户家目录删除,此项最常用
-R, --root CHROOT_DIR chroot 到的目录
-Z, --selinux-user 为用户删除所有的 SELinux 用户映射
useradd -d /usr/sam sam #创建sam用户,并指定sam的家目录为/usr/sam。不加-d指定的话,系统默认在/home目录下创建用户的家目录
userdel -r sam #删除sam用户及sam用户的家目录,-r表示删除用户家目录及其邮件池
useradd -b /test sara #创建sara用户,以/test目录为基目录创建家目录,查看用户家目录为/test/sara
useradd -M -s /sbin/nologin -g nginx nginx #-M 创建用户时不创建用户家目录;-s 指定创建的用户所使用的shell,/sbin/nologin表示不允许登录,如果nginx组不存在时会有报错提示,需要先创建nginx组
useradd -g sara1 -G sara2,sara3 sara #-g 创建用户时指定用户的属组sara1
例子1:
[root@localhost ~]# useradd -s /bin/sh -g sara1 -G sara2,sara3 sara #创建sara用户时,指定登录的shell是/sbin/nologin,即不允许该用户登录,-g 指定用户的主组(唯一) -G 指定用户的附属组(可以指定多个组)
[root@localhost ~]# ls /home/ #若没有特殊指定,默认将用户的家目录放到/home下
sara
[root@localhost ~]# id sara
uid=500(sara) gid=500(sara1) 组=500(sara1),501(sara2),502(sara3) #主组为sara1附加组为sara2和sara3
18、Linux中对比两个文件内容
Windows中对比两个文件用Beyond Compare,Linux中常用diff命令,详细使用方法参考以下链接:
https://www.cnblogs.com/wangqiguo/p/5793448.html#_label6
19、
20、
21、
22、
23、
24、
25、
26、
27、
28、
29、
30、
31、
32、
33、
34、
35、
36、
37、
38、
39、
40、
41、
42、
43、
44、
45、
46、
47、
48、
49、
50、
51、
52、
53、
54、
55、
56、
57、
58、
59、
60、
61、
62、
63、
64、
65、
66、
67、
68、
69、
70、
71、
72、
73、
74、
75、
76、
77、
78、
79、
80、
81、
82、
83、
84、
85、
86、
87、
88、
89、
90、
91、
92、
93、
94、
95、
96、
97、
98、
99、
100、
101、
102、
103、
104、
105、
106、
107、
108、
109、
110、
111、
112、
113、
114、
115、
116、
117、
118、
119、
120、
121、
122、
123、
124、
125、
126、
127、
128、
129、
130、
131、
132、
133、
134、
135、
136、
137、
138、
139、
140、
141、
142、
143、
144、
145、
146、
147、
148、
149、
150、
151、
152、
153、
154、
155、
156、
157、
158、
159、
160、
161、
162、
163、
164、
165、
166、
167、
168、
169、
170、
171、
172、
173、
174、
175、
176、
177、
178、
179、
180、
181、
182、
183、
184、
185、
186、
187、
188、
189、
190、
191、
192、
193、
194、
195、
196、
197、
198、
199、
200、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、
5、