MySQL数据库
MySQL数据库的搭建
mysqladmin -uroot passwd123 #初始化密码
mysql -uroot -p123 # 登陆mysql
create database beijing charset utf8; #创建并支持中文数据库
*create database if not exists beijing charset utf8 #假设不存在则创建数据库
show databases; #查看数据库
drop database beijing; #删除beijing数据库
*drop database if exists beijing # 假设存在数据库则删除
use beijing #进入数据库
create table ditu( #创建数据表与数据表名称
>地区 varchar(9), # varchar 最大限制的可变长度字符串,最多255个字节,如名字,密码;
>新增 int, # int 整数 字节4
>累计 int,
>治愈 int );
desc ditu; #查看建立的表单
insert into ditu values(“朝阳区”,5,1728,1543); #在表单中输入内容
insert into ditu values(“大兴区”,3,131,9);
insert into ditu values(“东城区”,1,652,522);
select * from ditu; #查看完整表单
select 地区,新增,累计 from ditu; # 查看部分表单内容
show tables; #查看表单
#>地区 varchar(9) permary key auto_increment,
#primary key:主键
#auto_increment:自增
删除张三的语文成绩
- delete from 表名 where 字段名称=“字段1”
- delete from student where 姓名=“张三” and 分数=80;
更改语文分数为80
- update 表名 set 字段名称=“更改字段” where 字段名称=“字段1”;
- update student set 科目=“语文” where 分数=“80”;
where 条件 = ><
like % 模糊匹配
between …and … 在。。。之间
limit 3 显示3条
order by 字段名
#排序
order by 字段 desc 倒序排列
更改:update 表名 set 字段=值 where 条件
删除:delete from 表名 where 条件
[忘记密码]
更改密码
修改配置文件:
vim /etc/my.cnf
skip_grant_table #跳过密码验证
数据库中:
update mysql.user set password=password(“123”) where user=“root”
[and host=“localhost”];
数据库备份
mysqldump -uroot -p123 -A > 备份所有的库
-B 库名>备份指定的库
mysqldump -uroot -p123 库 表 >备份指定库下的指定表
数据库还原
1 数据库里 source 备份路径
2 linux 系统 mysql -uroot -p123 <备份的路径
3 超过11位的数字用 bigint 来替代 int 类型
数据库备份
开启二进制
vim /etc/my.cnf
log-bin=mysql #开启二进制
systemctl restart mariadb #重启服务
cd /var/lib/mysql #查看二进制文件ls
mysql -uroot -p 123
use qiche
1.创建数据库,数据表
2.设置初始密码
mysqladmin -uroot password 123
3.备份数据库
mysqldump -uroot -p123 -A > /root/backup.sql
4.进入mysql
MySQL -uroot -p123
5.备份到/root/backup.sql中,并退出\q
source /root/backup.sql
6.启动二进制文件
vim /etc/my.cnf
log-bin=mysql
7.重启mariadb
systemctl restart mariadb
8.查看MySQL配置文件
cd /var/lib/mysql/
ls
9.再次登陆mysql,记录新数据,并退出\q
insert into che values(0,“迈巴赫1”,9999); #che:表单名
insert into che values(0,“迈巴赫2”,9999);
insert into che values(0,“迈巴赫3”,9999);
select * from che; #查看是否成功记录
10.再次进入mysql配置文件,查看mysql.000001
cd /var/lib/mysql
cat mysql.000001
[里面是新记录的数据,是乱码的状态]
11.将mysql.000001,复制到/root/下
cp mysql.000001 /root/
[cd 返回到root目录下,查看文件]
12.登陆mysql,将数据库删除,并退出\q
drop database qiche;
[ 将数据库返回到 m y s q l 中 ] [将数据库返回到mysql中] [将数据库返回到mysql中]
13.在数据库中将数据备份回来
source /root/backup.sql
#backup.sql 是之前备份到root目录的文件
mysql -uroot -p123 </root/backup.sql
[检查是否成功
use qiche
select * from che ]
\q #退出
14.在root目录中将之前的mysql.000001备份回去
mysqlbinlog mysql.000001 | mysql -uroot -p123
15.在MySQL中查看是否成功
mysqlbinlog 二进制文件 |mysql -uroot -p123 还原二进制
mysqladmin -uroot -p123 flush-logs 刷新二进制节点
主从集群
主:
进入mysql中
*查看主二进制文件和位置节点
show master status;
建立主从通讯账户
grant all on . to lala@‘%’ identified by ‘123’;
#lala 为用户名
#123 为密码
*退出mysql,\q
编辑mysql配置文件
vim /etc/my.cnf
log-bin=mysql #开启二进制
server-id=20 #id唯一性,不可重复
systemctl restart mariadb #重启mysql
systemctl stop firewalld #关闭防火墙
从:
修改mysql配置文件
vim /etc/my.cnf
server-id=22 #id唯一
重启mariadb
*关闭防火墙
进入MySQL
#配置连接参数
[根据帮助文档 {help change master to}]
change master to
master_host=‘192.168.120.20’, #主的ip地址
master_user=‘lala’, #主建立通讯的用户
lala
master_password=‘123’, #主建立通讯的密码
master_log_file=‘mysql.000001’, #主二进制文件master_log_pos=254; #主二进制节点
#开启备连接与关闭
start slave;
stop slave;
#查看备连接状态
show slave status\G;
#Slave_IO_Running: Yes
#Slave_SQL_Running: Yes
#双yes即可
出现非双yes问题
1 配置完配置文件后没重启服务 [重启主从mariadb,备的mysql中,重启slave]
2 主从server-id相同 [my.cnf配置文件中的server-id相同]
3 主上二进制未开启 [vim /etc/my.cnf log-bin=mysql #开启二进制]
4 防火墙 [关闭防火墙 systemctl stop firewalld]
5 change master to 配置错误 [关闭slave,并重新检查配置,更改错误位置,再次启动slave]
mysql忘记密码
vim /etc/my.cnf
skip_grant_table #跳过密码,修改完后注释掉
max_connections=1024 #修改数据库最大连接数为1024
max_allowed_packet=128M #允许数据包大小为128M
systemctl restart mariadb #重启服务
mysql
update mysql.user set password=password("999") where user="root"; #更改密码
redis
redis安装
1.yum安装gcc-c++
yum -y install gcc-c++
2.上传压缩包:
redis-5.0.13.tar.gz
3.解压安装包:
tar -zxf redis-5.0.13.tar.gz
4.进入已解压redis-5.0.13目录,进行编译安装
cd redis-5.0.13
make && make install
5.编译安装完成后,启动redis
redis-server redis.conf &
6.查看redis端口,端口号为:6379
ss -ntlp | grep redis
7.redis-cli 客户端登录到redis服务器
----shutdown 关闭redis服务器
8.exit退出客户端登录
-
set 键 值 #设置键值
-
get 键 #取值
-
del 键 #删除
-
keys * #查看所有键
-
sadd 集合名称 集合元素1 元素2 元素2
-
smembers 集合名称 #查看集合元素
-
subscribe 频道名称 #创建一个订阅频道
-
publish 频道名称 “消息” #发布消息
[subscribe 与 publish 是在同一台虚拟机ip的情况下,一个用来查看消息,一个用来发布消息]
redis配置文件
vim redis.conf
69 bind 0.0.0.0 允许远程所有主机登录
88 protected-mode no 去掉写保护
113 timeout 300 设置客户端登录闲置时间
136 daemonize yes 设置成守护进程 相当于 redis-server redis.conf &
507 requirepass hao123 设置客户端登录的密码
在行内shutdown关闭后退出exit
在行外重新打开redis
redis-server redis.conf
再进入行内登陆密码认证
auth
[配置文件507行设置的密码]
输出ok即是成功
redis 主从集群
[三台虚拟机]
主从安装redis
{
yum -y install gcc-c++
上传解压tar -zxf redis…tar.gz
make && make install
…}
redis主从集群
- 主关闭防火墙
- systemctl stop firewalld
配置文件:
vim redis.conf
相同部分
1 69 bind 0.0.0.0
2 88 protected-mode no
3 507 requirepass hao123 密码
从的不同部分
286 replicaof 192.168.80.128 6379
293 masterauth hao123
进入redis并登陆
auth hao123
info #查看主从关系
远程免密登陆
linux 密钥对
1、ssh-keygen #生成秘钥
2、ssh-copy-id 远程ip #拷贝秘钥到远程
3、scp 命令 :scp 本地文件或路径 远程ip:路径 #拷贝到远程
例:scp /backup/mysql/baidu.sql 192.168.120.20:/opt/
增量备份
tar -g 节点名 -cPf #切记不可和参数z同时使用 P:绝对路径
shell脚本
vim 1.sh #创建脚本文件以.sh结尾
#!/bin/sh #说明脚本文件
#!/bin/sh
yum -y install httpd
systemctl start httpd
name="wahaha"
#调用变量 $变量名
#输入函数 read -ep"提示信息 e 支持tab" 变量名称
read -ep"请输入你的年龄:"age
#输出函数 echo "输出内容 $变量"
echo "我的名字:$name"
echo "你的年龄:$age"
花括号用不用都可以,但推荐使用
echo $your_name
echo ${your_name}
echo "I am good at ${skill}Script"
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
输出结果:
chmod +x test.sh
./test.sh 1 2 3
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
cut功能:分割
从一行中切割部分内容
-d : 设置分割符
-f : 指定分割后的域
-c : 按字符分割
cut 参数 文件
显示/etc/passwd,以冒号分隔的第一列到第三列
cut -d “:” -f1-3 /etc/passwd
显示/etc/passwd,以冒号分隔的第一列和第三列
cut -d “:” -f1,3 /etc/passwd
awk切片
-F :指定域分割符(默认空格或tab键)
-f :指定从脚本文件中读取awk命令
语法:
awk [ -F 分割符 ] `/模式/{操作}` 文件名
常见的操作是:print printf
$0则表示所有域
$1表示第一个域
$n表示第n个域
操作print
cat /etc/passwd |awk -F ':' '{print $1}'
操作printf:格式化输出
awk -F: '{printf "%-15s %i\n",$1,$3}' /etc/passwd
awk -F: '{printf "%5d\n",$3}' /etc/passwd
sort功能:排序
-r:逆序h
-t:设置分割符
-n:使用数字排序
-u:重复行仅显示一次
-k:按照第几个域排序
+a:从分隔后的第a域开始
-b:到分隔后的第b个域结束
[注:分隔后的列是从0开始计数]
显示/etc/passwd, b
uniq功能:过滤重复行
[uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的。]
-d:仅显示重复行
-u:仅显示非重复行
-c:显示行连续重复的次数
1、列出以前用户登陆的信息,以空格分隔的第一列,并且只显示不重复行
last | cut -d " " -f1 | uniq -u
2、列出以前用户登陆的信息,以空格分隔的第一列,并且只显示有重复数据行,每种重复只显示一行
last | cut -d " " -f1 | uniq -d
3、列出以前用户登陆的信息,以空格分隔的第一列,并且打印每一重复行出现次数
last | cut -d " " -f1 | uniq -c
wc功能:计数
-l:多少行
-m:多少字符
-w:多少字
查看/etc/passwd里面有多少行
cat /etc/passwd | wc -l
find命令的用法
语法格式:
find 目录 -选项 动作[-print -exec -ok…]
基本选项:
name :按照文件名查找文件
*:任意长度的字符串
?:任意一个字符
[]:取值范围内的一个字符
[0-9]数字
[a-zA-Z]字母
-type :查找某一类型文件:
d - 目录
l - 符号链接文件
f - 普通文件
。。。更多忽略
基本动作:
-print: 将匹配的文件输出到标准输出
-fprint 文件名:将匹配的文件输出到文件
-exec:对匹配的文件执行该参数所给出的命令。
[相应命令的形式为’command’ { } ;,注意{ }和\;之间的空格]
1、在/logs目录中查找更改时间在5日以前的文件并删除它们
find logs -type f -mtime +5 -exec rm {} ;
2、在当前目录中查找一分钟之前,以.sh后缀的文件,并将他复制到/opt下
find . -mtime -1 -name “*.sh” -exec cp {} /opt/ ;
循环语句
[ str1 opr str2 ] //注意方括号左右两边的空格
[ opr str ]
opr取值:
相等:= //判断两个字符串是否相等
不等:!= //判断两个字符串是否不等
空串:-z //判断字符串长度是否为0,即判断字符串是否为空,为空返回真,非空返回假
非空串:-n //判断字符串长度是否不为0,即判断字符串是否非空,为空返回假,非空返回真
关系运算符
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等(==),相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等(!=),不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于(>)右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于(<)右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于(>=)右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于(<=)右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
布尔运算符
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
字符串运算符
假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否不相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n “$a” ] 返回 true。 |
$ | 检测字符串是否不为空,不为空返回 true。 | [ $a ] 返回 true。 |
if循环
安装httpd检查是否成功并启动成功
#!/bin/sh
yum -y install httpd
if [ $? -eq 0 ];then # $?-以上命令
echo "httpd,安装成功"
systemctl start httpd
if [ $? -eq 0 ];then
echo "httpd,启动成功"
else
echo "httpd,启动失败"
fi
systemctl stop firewalld
else
echo "httpd,安装失败"
fi
#!/bin/sh
read -ep"请输入你的名字:" name
if [ $name = "张三" ];then
echo "输入正确"
else
if [ $name != "张三" ];then
echo "打脸"
elif[ $name -ne " " ];
echo "重新输入"
fi
fi
#!/bin/sh
yum -y install mariadb-server httpd php php-mysql >>/dev/null #/dev/null 回收站 不显示弹窗
if [ $? -eq 0 ];then
echo "lamp安装成功"
systemctl start mariadb
systemctl start httpd
systemctl stop firewalld
else
echo "安装失败"
fi
#mysql -e"命令"
mysql -uroot -p123 -e"create database if not exists wg"
if [ $? -eq 0 ];then
echo "配置成功"
mysql -uroot -p123 -e"grant all on *.* to china@'%' identified by '123'"
if [ $? -eq 0 ];then
echo "创建成功"
else
echo "创建时间"
fi
else
echo "配置失败"
fi
删除变量
使用 unset 命令可以删除变量。语法:
unset variable_name
case询问
#!/bin/sh
while true #死循环
do
echo "
1.启动httpd
2.停止httpd
3.重启httpd
4.退出"
read -ep"请用户进行选择:" xuan #输入的选项
case $xuan in #case询问变量xuan
1)
systemctl start httpd
if [ $? -eq 0 ];then
echo "启动成功"
else
echo "启动失败"
fi
;;
2)
systemctl stop httpd
if [ $? -eq 0 ];then
echo "成功"
else
echo "失败"
fi
;;
3)
systemctl restart httpd
if [ $? -eq 0 ];then
echo "启动成功"
else
echo "启动失败"
fi
;;
4)
break
;;
*)
echo "输入错误,请重新输入"
;;
esac
done
#while 死循环
while tre
...
done
#break 退出死循环
特殊字符处理参数
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。 如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与 ∗ 相同,但是使用时加引号,并在引号中返回每个参数。如 " *相同,但是使用时加引号,并在引号中返回每个参数。 如" ∗相同,但是使用时加引号,并在引号中返回每个参数。如"@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
$* 与 $@ 区别:
- 相同点:都是引用所有参数。
- 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
输出效果:
$ chmod +x test.sh
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3
shell脚本案列
MySQL数据库备份压缩
#!/bin/sh
yum -y install mariadb-server >/var/null #安装
#检查mariadb是什么状态,如果未启动则启动
systemctl status mariadb
if [ $? -eq 0 ];then #使用上面的命令,查看状态
echo "服务已启动" #如果是0则输出已启动
else
echo "未启动" #不是则输出未启动,并启动
systemctl restart mariadb
fi#结尾
#创建文件目录,判断是否存在,如果不存在则创建目录
dbs=(wg rg yd) #数组
if [ -d /backup/mysql/`date +%F` ];then #-d 判断目录是否存在
echo "目录存在" #-!d 目录不存在
else
echo "目录不存在,已创建"
mkdir -p /backup/mysql/`date +%F`
fi
#判断mysql是否备份成功,若成功则打包压缩至文件目录下,并判断是否压缩成功
for db in ${dbs[*]}
do
mysqldump -uroot -p123 -B $db >/backup/mysql/`date +%F`/$db-`date +%Y%m%d`.sql
if [ $? -eq 0 ];then
echo "$db 备份成功"
tar -zcPf /backup/mysql/`date +%F`/$db-`date +%Y%m%d`.sql.tar.gz /backup/mysql/`date +%F`/$db-`date +%Y%m%d`.sql
if [ $? -eq 0 ];then
echo "$db 已压缩"
else
echo "$db 压缩失败"
fi
else
echo "备份失败"
fi
done
#清除目录中以.sql结尾的文件,并判断
rm -rf /backup/mysql/`date +%F`/*.sql
if [ $? -eq 0 ];then
echo "sql已清除"
else
echo "sql未清除"
fi
检验是否安装mysql
#!/bin/sh
#验证是否安装mariadb
mysql --version >>/var/null
if [ $? -eq 0 ];then
echo "mariadb已安装"
else
echo "正在进行安装mariadb"
yum -y install mariadb-server >>/var/null
echo "安装成功!"
fi
利用shell脚本设置mysql主从集群
主:
yum -y install mariadb-server
if [ $? -eq 0 ];then
systemctl start mariadb
systemctl stop firewalld
echo "安装完毕"
fi
#配置编码
cat /etc/my.cnf |grep "server-id=20"
if [ $? -eq 0 ];then
echo "编码已配置"
else
echo "进行编码配置"
sed -i 3a"server-id=20" /etc/my.cnf
fi
#配置二进制
cat /etc/my.cnf | grep "log-bin=mysql"
if [ $? -eq 0 ];then
echo "二进制已配置"
else
echo "进行二进制配置"
sed -i 3a"log-bin=mysql" /etc/my.cnf
fi
systemctl restart mariadb
#mysqladmin -uroot password 123
mysql -uroot -p123 -e"grant all on *.* to yeye@'%' identified by '123'"
if [ $? -eq 0 ];then
echo "成功"
else
echo "失败"
fi
mysql -uroot -p123 -e"show master status"
if [ $? -eq 0 ];then
echo "成功1"
else
echo "失败2"
fi
从:
#!/bin/sh
#验证是否安装mariadb
mysql --version >>/var/null
if [ $? -eq 0 ];then
echo "mariadb已安装"
else
echo "正在进行安装mariadb"
yum -y install mariadb-server >>/var/null
echo "安装成功!"
fi
systemctl start mariadb
systemctl stop firewalld
mysqladmin -uroot password 123
cat /etc/my.cnf | grep "server-id=22"
if [ $? -eq 0 ];then
echo "编码已配置"
else
echo "正在配置"
sed -i 3a"server-id=22" /etc/my.cnf
fi
systemctl restart mariadb
mysql -uroot -p123 -e"stop slave"
mysql -uroot -p123 -e"change master to master_host='192.168.120.20',master_user='yeye',master_password='123',master_log_file='mysql.000007',master_log_pos=368;"
mysql -uroot -p123 -e"start slave"
mysql -uroot -p123 -e"show slave status\G"
利用shell脚本配置httpd
#!/bin/sh
yum -y install httpd
if [ $? -eq 0 ];then
echo "安装成功"
systemctl start httpd
systemctl stop firewalld
else
echo "安装失败"
fi
#用户输入虚拟主机ip
read -ep"输入虚拟主机ip:" ip
ifconfig ens34:0 $ip/24
#用户输入网站目录
read -ep"输入网站目录:" lu
mkdir -p /var/www/html/$lu
#修改httpd.conf 164c:文件164行
sed -i 164c"DiretoryIndex index.php" /etc/httpd/conf/httpd.conf
#修改配置文件
cat >>/etc/httpd/conf/httpd.conf<<EOF
<virtualhost $ip:80>
documentroot /var/www/html/$lu
</virtualhost>
EOF
systemctl restart httpd
echo ">>>>>$ip<<<<<<" >/var/www/html/$lu/index.html
echo "测试页面 $ip
以上文件内容解释
向文件追加内容
cat >>文件路径<<EOF
文件内容 #顶格写
EOF #以EOF结束
vim 加上文件 +行号 #直接定位某行
利用函数调用文件
函数模型
函数名(){
需要操作的内容
}
被调用的文件
a.sh
yun(){
num=`mysql -uroot -p123 -e"show slave status\G;"|grep "Yes"|wc -l` #判断主从是否正常,双yes
if [ $num -eq 2 ]
echo "主从没问题"
else
echo "主从有问题"
fi
}
yun # 函数名
调用函数
b.sh
source /root/a.sh #调用函数文件
yun # 需要调用的函数名
执行b文件
sh b.sh
利用脚本批量远程部署脚本
核心文件lamp.sh
#!/bin/sh
ping -c 2 www.baidu.com
if [ $? -eq 0 ];then
echo "网络正常"
else
echo "网络异常"
fi
yum -y install httpd mariadb-server php
if [ $? -eq 0 ];then
echo "lamp安装成功"
systemctl start httpd mariadb
systemctl stop firewalld
else
echo "lamp失败"
fi
cat >>/var/www/html/index.php<<EOF
<?php
phpinfo();
?>
EOF
systemctl restart httpd
echo "请访问php页面"
存放IP地址txt文件ip.txt
192.168.120.22
192.168.120.23
192.168.120.24
循环部署IP文件所有地址c.sh
#!/bin/sh
#循环部署文件
for ip in `cat /root/ip.txt`
do
#远程拷贝文件
scp /root/lamp.sh $ip:/root/
#远程执行脚本
ssh $ip sh /root/lamp.sh
if [ $? -eq 0 ];then
echo "部署成功"
else
echo "部署失败"
fi
done
ssh-keygen #生成秘钥
ssh-copy-id 远程ip #拷贝密钥到远程
sh c.sh #执行脚本
其他:
判断输出是否是10个字
一个中文字占3个字符,10个字就30个
#!/bin/sh
read -ep"请输入10个字:" zi
if [ $(expr length "$zi") -le 30 ];then
echo "$zi"
else
echo "$zi #"
fi
日志分析
了解ip 、pv、uv概念
ip值: 一天内使用不同ip地址访问网站次数;同一个ip访问多次同一个网站页面记为一次,独立ip数均为1,两台机器使用同一个ip,也记为1个ip访问
PV值: 页面浏览量,或点击量;既网站24小时人均浏览网站页面次数;
如果你的网站到了23点,单纯IP有60万条的话,每个访问者平均访问了3个页面,那么PV表的记录就要有180(60×3)万条
UV值: IP地址访问某个网站或点击某条新闻的人数;
同一天内,同一个IP地址,第一次进入网站具有独立IP的访问者,
同一天内再次访问该网站则不计数
日志格式
58.61.164.141 – - [22/Feb/2010:09:51:46 +0800] "GET / HTTP/1.1" 206 6326 "http://www.google.cn/search?q=webdataanalysis" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
192.168.24.235 - - [17/Nov/2017:09:37:23 +0800] "GET /Centos7/base/Packages/perl-PlRPC-0.2020-14.el7.noarch.rpm HTTP/1.1" 200 36592 "-" "urlgrabber/3.10 yum/3.4.3" "-"
192.168.24.235
-
访问主机:显示主机的ip地址或者已解析的域名
-
- 标识符:由identd或直接由浏览器返回浏览者的EMAIL或其他唯一标示,因为涉及用户邮箱等隐私信息,目前几乎所有 的浏览器就取消了这项功能
-
- 授权用户:用于记录浏览者进行身份验证时提供的名字,如果需要身份验证或者访问密码保护的信息则这项不为空,但 目前大多数网站的日志这项也都是为空的。
[22/Feb/2010:09:51:46 +0800]
-
日期时间:格式[日期/月份/年份:小时:分钟:秒钟 时区],占用的字符位基本固定
-
请求类型:常见的请求类型主要包括GET/POST/HEAD三种
-
请求资源:显示相应资源的URL,可以是网站、图片、动画、css资源等
-
协议版本号:显示协议以及版本信息,通常是HTTP/1.1 或 HTTP/1.0
-
状态码:响应状态; 1xx表示继续消息、
2xx表示请求成功、
3xx表示请求重定向、
4xx表示客户端错误、
5xx表示服务器错误
-
传输字节数: 请求中一共传输的字节数
- 来源页面:用于表示浏览者在访问该页面之前所浏览的页面,只有从上一页面链接过来的请求才会有该项输出, 如果是新开的页面则该项为空
-
用户代理:用于显示用户详细信息、包括IP、OS
cat access_log | awk '{print $1}'| sort | uniq -c |sort -n
查看日志文件的ip,切割 排序 过滤行 正序排序