Linux note5

文章介绍了Shell脚本中使用let和小括号进行计算,字符串的拼接、截取和替换方法,包括随机生成包含数字和字母的验证码。还涉及文件权限的管理,如添加可执行权限,以及环境变量的设置,如通过修改`/etc/profile`配置路径。另外,提到了Linux下的一些基本命令,如`chmod`用于修改文件权限,以及`cron`配置定时任务。
摘要由CSDN通过智能技术生成

关于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 +指标
指标治理:
制定指标字典
指标描述
指标公式
指标口径 以维度确定口径 以什么维度进行计算

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值