关于shell的计算
使用let 和小括号
[root@iZ8vbgw05auetj737q3v9rZ yx]# bash sihrsl.sh
2
0
[root@iZ8vbgw05auetj737q3v9rZ yx]# cat sihrsl.sh
#!bin/bash
let A=1+1
echo $A
B=$((100 % 2))
echo $B
字符串拼接,直接写在一起
[root@iZ8vbgw05auetj737q3v9rZ yx]# bash shirsl.sh
abcdef
[root@iZ8vbgw05auetj737q3v9rZ yx]# cat shirsl.sh
#!/bin/bash
A=abc
B=def
C=$A$B
echo $C
字符串
可以看做一个对象
例如A=abcdef
ID:…
type:char
value:abcdef
值的存储是有序的,所以可以索引和查找
int类型是无序的
因为没有办法通过下标去截取 切片
切片
对A字符串进行截取,取三位,第二位-第四位
1:3表示从第二位开始截取,一共截取三位
A=abcdef
C=${A:1:3}
[root@iZ8vbgw05auetj737q3v9rZ yx]# cat expr.sh
#!/bin/bash
A=abcdef
C=${A:1:3}
echo $C
[root@iZ8vbgw05auetj737q3v9rZ yx]# bash expr.sh
bcd
返回字符串长度
返回字符串的长度
A=abcabc
B=${#A}
[root@iZ8vbgw05auetj737q3v9rZ yx]# cat expr.sh
#!/bin/bash
A=abcabc
C=${A:1:3}
B=${#A}
echo $C
echo $B
[root@iZ8vbgw05auetj737q3v9rZ yx]# bash expr.sh
bca
6
替换
局部替换
D=${A/a/1}
全局替换
D=${A//a/1}
[root@iZ8vbgw05auetj737q3v9rZ yx]# cat expr.sh
#!/bin/bash
A=abcabc
C=${A:1:3}
B=${#A}
D=${A/a/1}
echo $C
echo $B
echo $D
[root@iZ8vbgw05auetj737q3v9rZ yx]# bash expr.sh
bca
6
1bcabc
[root@iZ8vbgw05auetj737q3v9rZ yx]# cat expr.sh
#!/bin/bash
A=abcabcabc
C=${A:1:3}
B=${#A}
D=${A//a/1}
echo $C
echo $B
echo $D
[root@iZ8vbgw05auetj737q3v9rZ yx]# bash expr.sh
bca
9
1bc1bc1bc
随机生成包含数字和字母的四位验证码
[root@iZ8vbgw05auetj737q3v9rZ yx]# cat check.sh
#!/bin/bash
code=qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890
for i in ` seq 4 `
do
#记得索引是从0开始的
num=$[RANDOM%61]#一共有62个字符
result=${code:$num:1}
echo -n $result
done
[root@iZ8vbgw05auetj737q3v9rZ yx]# bash check.sh
hrRx[root@iZ8vbgw05auetj737q3v9rZ yx]# bash check.sh
H4cD[root@iZ8vbgw05auetj737q3v9rZ yx]# bash check.sh
yMal[root@iZ8vbgw05auetj737q3v9rZ yx]# bash check.sh
m9Q2[root@iZ8vbgw05auetj737q3v9rZ yx]# bash check.sh
LOHj[root@iZ8vbgw05auetj737q3v9rZ yx]# bash check.sh
生成6为数字的验证码
利用字符串以及随机数
363747[root@iZ8vbgw05auetj737q3v9rZ yx]# cat shirsl.sh
#!/bin/bash
code=1234567890
for i in `seq 6`
do
num=$[RANDOM%9]
result=${code:$num:1}
echo -n $result
done
[root@iZ8vbgw05auetj737q3v9rZ yx]# bash shirsl.sh
424442[root@iZ8vbgw05auetj737q3v9rZ yx]#
利用随机数
18165/913718/9[root@iZ8vbgw05auetj737q3v9rZ yx]# cat check.sh
#!/bin/bash
for i in ` seq 6 `
do
num=$[RANDOM%9]
echo -n $num
done
[root@iZ8vbgw05auetj737q3v9rZ yx]# bash check.sh
436305[root@iZ8vbgw05auetj737q3v9rZ yx]#
awk后面不可以跟变量
必须是文件才可以
删除所有的空文件
[root@iZ8vbgw05auetj737q3v9rZ yx]# cat null1.sh
#!/bin/bash
for i in ` ls /home/yx `
do
#在脚本里面还是写ls -l,不要写ll
size=` ls -l $i | awk '{print $5}' `
if [ $size == "0" ]
then
rm -f $i
fi
done
[root@iZ8vbgw05auetj737q3v9rZ yx]# cat null.sh
#!/bin/bash
for i in ` ls /home/yx `
do
#判断是不是普通文件
if [ -f $i ]
then
#去除文件的大小
size=` wc -c $i | awk '{print $1}' `
if [ $size -eq 0 ]
then
rm -f $i
fi
fi
done
补充
wc test.txt
# 输出结果 但是会显示文件的名字
7 8 70 test.txt
# 行数 单词数 字节数 文件名
-c # 统计字节数,或--bytes:显示Bytes数。
-l # 统计行数,或--lines:显示列数。
-m # 统计字符数,或--chars:显示字符数。
-w # 统计字数,或--words:显示字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L # 打印最长行的长度,或--max-line-length。
-help # 显示帮助信息。
--version # 显示版本信息。
给某个文件添加某种权限
给yx.sh添加可执行的权限,也可以用数字表示,权限与数字的关系见下图
[root@iZ8vbgw05auetj737q3v9rZ yx]# chomd +x yx.sh
[root@iZ8vbgw05auetj737q3v9rZ yx]# chomd (数字) yx.sh
chmod g+w shirsl.sh
[root@iZ8vbgw05auetj737q3v9rZ yx]# chmod g+w shirsl.sh
修改文件权限:chmod
chmod 修改文件权限有两种使用格式:字母法与数字法。
字母法:chmod u/g/o/a +/-/= rwx 文件
chmod u=rw,g=rw,o=rw shirsl.sh
[root@iZ8vbgw05auetj737q3v9rZ yx]# chmod u=rw,g=rw,o=rw shirsl.sh
文件只是打开某个内容的方式而已,相当于一个钥匙
文件的作用只是让我们找到我们想要的内容
内容是放在磁盘上的
表分区的优点:
1、增强可用性
2、维护方便
3、提高查询效率
4、均衡I/O
单纯的创建文件(touch)是不占空间的
硬链接 直接访问磁盘 访问一次磁盘就是一次I/O
比如 一个名为“1.sh”的文件
我们通过1.sh去访问在磁盘上的内容,这种方式就是硬链接的方式
比如我们创建“2.sh”记录“1.sh”,那么2.sh是软链接
一个磁盘空间至少要有一个硬链接
如果把最后一个硬链接删掉,那么磁盘空间的内容也不符存在
也就是说,要开辟一个磁盘空间存放内容,必须要有一个硬链接
如果2.sh是1.sh的软链接
1.sh指向的内容改变了
那么2.sh依然可以使用,访问的是1.sh目前所指向的内容
(因为软链接2.sh只记录了1.sh这个名字)
软链接会自己创建存储空间
所有硬链接共用一个存储空间
【硬连接】
硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。
【软连接】
软链接文件有类似于Windows的快捷方式。包含的有另一文件的位置信息。
创建软链接
具体用法是:
ln -s [源文件] [软链接文件]
Linux的命令都放在bin下
Linux配置环境变量
切到根目录 下的etc
修改profile即可
比如里面配置好了hive,那么不管在什么路径之下,只要输入hive就可以启动它
[root@iZ8vbgw05auetj737q3v9rZ ~]# cd /
[root@iZ8vbgw05auetj737q3v9rZ /]# cd etc
[root@iZ8vbgw05auetj737q3v9rZ etc]# ls
adjtime inputrc rc4.d
aliases iproute2 rc5.d
aliases.db issue rc6.d
alternatives issue.net rc.d
anacrontab kdump.conf rc.local
asound.conf kernel redhat-lsb
at.deny krb5.conf redhat-release
audisp krb5.conf.d resolv.conf
audit ld.so.cache rpc
bash_completion.d ld.so.conf rpm
bashrc ld.so.conf.d rsyncd.conf
binfmt.d libaudit.conf rsyslog.conf
centos-release libnl rsyslog.d
centos-release-upstream libuser.conf rwtab
chkconfig.d locale.conf rwtab.d
chrony.conf localtime sasl2
chrony.keys login.defs securetty
cloud logrotate.conf security
cron.d logrotate.d selinux
cron.daily lsb-release.d services
cron.deny machine-id sestatus.conf
cron.hourly magic shadow
cron.monthly mail.rc shadow-
crontab makedumpfile.conf.sample shells
cron.weekly man_db.conf skel
crypttab mke2fs.conf ssh
csh.cshrc modprobe.d ssl
csh.login modules-load.d statetab
dbus-1 motd statetab.d
default mtab subgid
depmod.d my.cnf subgid-
dhcp my.cnf.d subuid
DIR_COLORS netconfig subuid-
DIR_COLORS.256color NetworkManager sudo.conf
DIR_COLORS.lightbgcolor networks sudoers
dracut.conf nscd.conf sudoers.d
dracut.conf.d nsswitch.conf sudo-ldap.conf
e2fsck.conf nsswitch.conf.bak sysconfig
environment ntp.conf sysctl.conf
ethertypes openldap sysctl.d
exports opt systemd
favicon.png os-release system-release
filesystems pam.d system-release-cpe
firewalld passwd terminfo
fstab passwd- tmpfiles.d
gcrypt pkcs11 tuned
gnupg pki udev
GREP_COLORS plymouth vconsole.conf
groff pm vimrc
group polkit-1 virc
group- popt.d wgetrc
grub2.cfg postfix wpa_supplicant
grub.d ppp X11
gshadow prelink.conf.d xdg
gshadow- printcap xinetd.d
gss profile yum
host.conf profile.d yum.conf
hostname protocols yum.repos.d
hosts python zlogin
hosts.allow rc0.d zlogout
hosts.deny rc1.d zprofile
init.d rc2.d zshenv
inittab rc3.d zshrc
[root@iZ8vbgw05auetj737q3v9rZ etc]# cat profile
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
if [ -x /usr/bin/id ]; then
if [ -z "$EUID" ]; then
# ksh workaround
EUID=`/usr/bin/id -u`
UID=`/usr/bin/id -ru`
fi
USER="`/usr/bin/id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
fi
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
unset i
unset -f pathmunge
#this is for java environment
export JAVA_HOME=/opt/jdk1.8.0_341
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre
export HADOOP_HOME=/opt/hadoop-3.1.3
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export
PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HIVE_HOME=/opt/hive
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:/usr/local/Hadoop/lib/*:.
export CLASSPATH=$CLASSPATH:/usr/local/hive/lib/*:.
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
[root@iZ8vbgw05auetj737q3v9rZ etc]# hive
which: no hbase in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/jdk1.8.0_341/bin:/opt/hadoop-3.1.3/sbin:/opt/hadoop-3.1.3/bin:/opt/hive/bin:/root/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hive/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop-3.1.3/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive Session ID = 29091095-1f8f-46c8-ad00-a08066ebde4a
Logging initialized using configuration in file:/opt/hive/conf/hive-log4j2.properties Async: true
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Hive Session ID = 67ab4126-054b-496a-afec-17e67e959b97
hive (default)> [root@iZ8vbgw05auetj737q3v9rZ etc]#
[root@iZ8vbgw05auetj737q3v9rZ etc]#
Linux下布置定时事件
在etc目录下的crontab文件里面设置
[root@iZ8vbgw05auetj737q3v9rZ etc]# cat crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
59 14 3 3 6 root touch /cron.txt
这里指定在3.3号星期五的14:59分在根目录下面建立一个cron.txt文件
结果如下,可以看到存在cron.txt
[root@iZ8vbgw05auetj737q3v9rZ etc]# date
Fri Mar 3 15:00:21 CST 2023
[root@iZ8vbgw05auetj737q3v9rZ etc]# cd /
[root@iZ8vbgw05auetj737q3v9rZ /]# ls
1.gz 3.txt cron.txt fjh1 lib64 mnt run tmp yx zyl1
1.sh a.sh csd.txt fjh.sh lost+found opt sbin usr yx1 ZZ
1.txt bin dev home LS proc srv var zbc.txt
2.txt boot etc lib media root sys wyh zyl
[root@iZ8vbgw05auetj737q3v9rZ /]#
Isolation
事务的隔离等级
控制事物对磁盘的访问
1、读未提交
2、读提交
3、可重复读
4、顺序读(可串行化)
1、读未提交 可以读到别人未提交的数据 最低的等级
可能会发生脏读 就是读到了还未确定的数据 (这个数据还没有确定下来,没有提交的数据)
可能发生幻读 数值一直在变化
可能发生“不可重复读” 如果数据变化了,无法读取到事务开始的时候看到的数据了
当事务比较多的话,可能会造成大量的冗余
那么I/O就会比较多,频繁I/O对磁盘造成负担
2、读提交 别人提交了,我就可以读取
也有可能产生幻读 不可重复读
优化方式:采用可重复读
死锁
多个用户同时修改某条数据的时候就会发生死锁(多个用户抢占一个资源)
死锁的不同属性
补充关于死锁的内容
(1)共享锁 相当于select 大家都可以查看
(2)悲观锁 不管在任何情况下,比如我在修改某条数据的时候,别人有可跟我抢占这条数据的可能性,那么我就在修改的时候独占这个资源,但是别人可以查看不可修改
行锁 对数据全部上锁
缺点: 我在修改某条数据的时候,把整个表资源独占,那么别人想改变其他的数据的时候,也不可以修改 降低效率
会避免死锁
(3)乐观锁 只有乐观锁的情况下会出现死锁
优点:
可以多个人修改表 前提是这些用户修改的数据是不一样的,不然会产生死锁
多数项目都是乐观锁
因为死锁可以杀死,但是悲观锁的效率问题是难以解决的
在安装数据库的时候,可以设定乐观锁或者悲观锁模式
悲观锁与乐观锁都是为死锁服务的,是生成死锁的前提
3、可重复读 数据在一段事务结束前永远不变
4、顺序读 当我在修改某张表的时候,别人不可以修改 只有我修改好之后,别人才可以进行修改
一般使用顺序读的项目比较少
项目使用最多的是“读提交”
一般认为commit之后的数据就是可信的有效的
除了MySQL之外,其他数据库不可以自动提交的
所以在项目上禁止使用Navicat
因为Navicat都是自动提交的
MySQL是默认自动提交的
所以MySQL可以与Navicat配合使用
PLSQL
一般来说手动提交比较好
可能写的代码是错误的
比如在insert的时候插入了错误的数据,自动提交会直接执行
那么在没有备份的情况下,这个被插入的表格就被毁掉了
oracle
优点:
运行速度快
可以并行并发 多线程
缺点:存储有上限 无法到达TB级别
措施:hive 分布式
数据库三范式
1、列不可分
比如住址可以拆分,身份证号不可以拆分
一个数据描述一个事务 这种就不可再分
比如如果我不拆分地址,那么统计广东省的人就要用模糊查询like
如果拆分了就可以直接group by
2、非主键列必须依赖于主键
上面字段必须设计在两个表里面
如果是一个表的话,因为一个老师可能会对应多个学生
3、非主键列必须直接依赖于主键
比如上述年龄不仅仅依赖于主键,而是依赖于年份
项目上难以达到三范式
只是一种理想状态
拆表拆列 会造成有非常多的表 非常少的列
那么查询一次就要关联非常多的表
而关联非常浪费时间
甚至项目会主张反三范式建模
会造成数据的大量冗余
因为数据表的维度不一样 可能会造成数据的数据冗余
比如部门表只有10条数据
员工表有1000条数据
如果把上述两个表的信息放在一张表里面,那么部门表的数据也会增加至1000条,正是因为数据表的维度不一样,造成了数据的冗余
维度(粒度) 比如合同号 借据号 贷款时间 还款期限(站在不同的角度量化某个事物)
指标(度量):比如贷款余额,利息总额,欠息金额,还款总额(具体计算出来的数据,用数量描述事物 指标90%以上都是数字)
指标根据维度计算 在描述维度
group by 后面的是维度
select +指标
指标治理:
制定指标字典
指标描述
指标公式
指标口径 以维度确定口径 以什么维度进行计算