linux
7.6 文件的创建
-
目录选项
-
创建目录
-
mkdir
mkdir -p a/b 建立一个a目录,a目录下同时创建一个b目录,-p为递归
mkdir -p a{a1,a2} b 同时建立一个a和b目录,a目录下新建两个目录分别为a1 a2
-
-
删除空目录
-
rmdir
rmdir a 删除空目录 a
-
-
-
文件操作选项
-
复制文件
-
cp
cp text text2 将text文件复制并且改名为text2
cp text a 将text文件复制到a目录下
-
-
移动文件
-
mv
mv text a 将 text文件移动到a目录下
mv text text1 将text文件改名为text1
mv a/*.txt b 将a目录下所有的txt后缀的文件都移动到b目录下
-
-
删除文件
-
rm
rm -rf a 递归强制删除a目录或文件
-
-
新建文件
-
touch
touch abc 新建文件abc
-
-
7.7 命令的查看
-
查看文件
- cat 命令
- cat a 查看a文件的内容
- cat -n a 带行号查看a文件的内容
- cat -b a 将文件空行去掉后重新带行号显示内容
- cat text1 >> text2 将text1文件追加text2文件中
- cat text1 text2 > text3 将text1和text2合并成text3文件
- cat -A text 将text所有的内容显示出来
- more 命令
- more a 查看a文件的内容
- more -num a 一次性显示num行的a文件的内容
- more +num a 从num行开始显示a内容
- b回滚到文件头,enter向下翻动一行,s/空格向下翻一页,d翻动半页
- less 命令
- less -m a 带百分比显示a内容
- b向上回滚一页,u向上回滚半页, y向上回滚一行,d向下翻半页,空格向下翻一页,enter向下翻一页
- head 命令
- head -n 【n】a 显示a文件的n行内容
- head -c 【n】 a 显示a文件的前n个字节
- tail 命令
- tail a 显示a文件后十行内容
- tail -n 【n】a 显示a文件的后n行内容
- tail -c 【n】a 显示a文件的后n个字节
- echo 命令
- echo “aaaaa” >> a 将 aaaaa 写入到a文件的最后一行
- echo “aaaaa” > a 将aaaaa写入到a文件的第一行
- cat 命令
-
vim编辑器的使用
- 末行模式命令
- wq 保存退出
- q不保存退出
- set nu 显示行号
- set nonu 不显示行号
- :n 跳转到n行
- /n 查找指定字符n
- 1,3d 删除前三行
- 1,$d 删除所有行
- s/a/A 将光标所在行第一个a替换成A
- s /a/A/g 将光标所在行全局替换,将a替换成A
- 1,$ s/a/A/g 将所有的a替换成A
- % s/a/A/g 将所有的a都替换成A
- 1,2 m10 1-2行移动到10行之后
- 1,10 copy 20 1-10行复制到20行之后
- w <路径>/<文件名> 另存为
- noh 取消高亮光标
- 命令模式下
- ZZ 保存退出
- ZQ 不保存退出
- G跳转到文档末尾
- u 撤销,后退一步
- yy 复制光标所在行
- 33yy 复制光标所在开始的三行
- p 粘贴到光标所在下一行
- dd 删除光标所在行
- 3dd删除光标所在三行
- x 删除光标所在字符
- #x 删除光标所在处的#个字符
- X 向前删除一个字符
- #X 向前删除#个字符
- r(按住)直接替换光标所在字符
- 插入模式
- i 光标所在字符进入
- o 光标所在下一行进入
- a 光标所在字符之后进入
- 末行模式命令
-
用户权限
- cat /etc/passwd 所有的用户
- cat /etc/group 所有的组
- groups 组名 查看所属组
root : x : 0 : 0 : root :/root:/bin/bash
用户名:密码占位符:UID:GID:用户信息:家目录:shell
-
用户分为
- 超级用户: root
- 虚拟用户/系统用户/程序用户:nologin(centos7:1-999)不允许本地登录
- 普通用户 1000-5
-
用户的创建
-
useradd 用户名
-u 指定UID -d 指定家目录 -g 指定用户主组(原始组)前提是存在的 -G 指定用户次要组 -s 指定用户登录的shell -M 不建立家目录 -
passwd 用户名 (设置密码)
-d 清空用户密码 -l 锁定用户账号 -s 查看用户当前状态 -u 解锁用户账号 -
usermod 修改用户的属性
-l 更改账户的登录名称 -L 锁定账户 -U 解锁用户 -u 更改用户UID -g 更改用户主组 -G 更改用户次要组 -d 更改用户家目录 -s 更改用户shell -a 追加 -
userdel 删除选项
- userdel -r 用户名
-
-
添加用户组
- groupadd 创建组
- groupadd fu 直接添加fu组
- group -g 666 fu 建立组的同时设置GID
- groupmod 更改组属性
- groupmod -n fu666 fu 更改组名
- groupmod -g 666 fu 更改组gid
- groupadd 创建组
-
删除用户组
- groupdel 删除用户组
- -f 强制
- groups 查询用户组
- id 查询用户id
- groupdel 删除用户组
-
查询用户信息
- w
- who
- users
- who am i
-
etc/shadow
nginx:!!:18450:0:99999:7::: 用户名:密码:最后一次修改密码的时间:密码不可更改的时间:密码失效时间:密码失效提前多少天警告:密码过期宽限时间:账号失效时间:标志
- change修改
- change [用户名]
- change --help : 获取帮助
- [外链图片转存中…(img-I2DaGT2r-1595321676866)]
- change修改
-
su 切换用户命令
-
etc/group
user2:x:10000: 组名:密码:组管理员:组内用户(附属组)
- gpasswd命令也可以修改组
7.8 用户的权限
-
用户的权限
-
u用户所有者(属主)
-
g组成员(属组)
-
o其他
- r 读权限
- w 写权限
- x 执行权限
-
chmod 更改文件/目录的权限
chmod [选项] 权限 <目标>
-R 递归改变目录及其成员的权限 -v 改变权限时显示详细过程 -f 忽略错误信息 -
例子:
chmod u+x ,g+w, o-r f1 文件属主增加执行权限,属组成员增加写权限,其他去掉读权限
-
-
利用八进制模式
- r = 4
- w = 2
- x = 1
-
chmod 755 f1
为f1文件属主权限设置为读写执行权限,属组用户设置为读写权限,其他人设置为读写权限
-
umask 默认为0022,即创建的目录,默认权限为755
-
更改umask可以更改新创建目录的默认权限,但是文件会多减一即644,不给执行权限(x)
umask 0033 mkdir f2 新创建的f2目录默认权限变成了744
-
-
chown更改文件所属命令
-
chown[选项] [属主:属组] <目标>
-
-R递归选项
-
-v执行时显示详细信息
chown text text1 将text1属主改成text
chown text:text text1 将text1的属主和属主改成 text
chown : text text1 直降text1属组改成text,须保留前面的:(冒号)
-
-
-
chgrp更改文件属组
- chgrp [选项] [属组] <目标>
- -R递归选项
- -v显示详细信息
- chgrp [选项] [属组] <目标>
-
通配符
- 通配符是匹配符合条件的文件名,通配符是完全匹配,ls、find、cp不支持正则表达式,只能使用shell的通配符来进行匹配。
*通配符* | *含义* | *实例* |
---|---|---|
* | 匹配 0 或多个字符 | a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。 |
? | 匹配任意一个字符 | a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。 |
[list] | 匹配 list 中的任意单一字符 | a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。 |
[!list]或[^list] | 匹配 除list 中的任意单一字符 | a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。 |
[c1-c2] | 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] | a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b… a9b。 |
[!c1-c2]或[^c1-c2] | 匹配不在c1-c2的任意字符 | a[!0-9]b 如acb adb |
{string1,string2,…} | 匹配 sring1 或 string2 (或更多)其一字符串 | a{abc,xyz,123}b 列出aabcb,axyzb,a123b |
-
正则表达式
-
正则表达式是用来在文件中匹配符合条件的字符串,正则表达式是包含匹配,grep、awk、sed等命令都支持正则表达式。
*一)* *基础正则表达式*
*符号* *含义* *举例* * 匹配前一个字符≥0次 "abc*"满足的例子abbb、abcdk *.* 任意字符 "a.c"满足的例子abc、fapcc .* 任意字符 ^ 开始标记 "^abc"满足的例子abc、abcd $ 结束标记 ”abc$”满足的例子abc、mmabc + 匹配前一个字符≥1次 "abc+"满足的例子abcd、abcccdd [] []内如果不是范围,选其一;是范围的话,范围内选其一 "m[abc]p"满足的例子acpd;m[1-9]p满足的例子m8pp [^] 非(在[]内) "[^abc]"满足的例子:ddd、mpd 1 grep “^13[0-9]” text {} \ {m\ }、\ {m,n\ }、\ {m,\ }、\ {,n\ }分别为匹配前一个字符m次、m到n次、≥m次、≤n次 abc \ {3,5 \ }满足的例子abcccc、abcccccc 扩展 *符号* *含义* *举例* + 匹配前一个字符≥1次 "abc+"满足的例子abcd、abcccdd AA|BB 匹配AA或者BB {} {m}、{m,n}、{m,}、{,n}分别为匹配前一个字符m次、m到n次、≥m次、≤n次 ****“abc{3,5}”****满足的例子abcccc、abcccccc ? 匹配前一个字符0或1次 "abc?"满足的例子ab、mabcd () 将候选的所有元素放在()内,用|隔开 "a(1|2|3)bc"满足的例子a1bc、mba3bcd <word> 匹配单词 [外链图片转存中…(img-MqLCqcpp-1595321676871)][外链图片转存中…(img-QRcd6qP0-1595321676878)]
-
7.9 输出命令选项
-
grep 命令
-
搜索与正则表达式匹配的行,并将结果输出
-
grep [选项] <关键字> <文件名>
*选项* *含义* *功能描述* -i ignore case 忽略大小写 -o 只输出匹配的部分 -v invert match 不匹配匹配的 -l file-with-match 输出匹配的文件名 -L file-without-match 输出不匹配的文件名 -c count 输出匹配的数目(行数)次数 -n number 输出匹配行的同时在前面加上文件名及在文件名中的行数 -h no-filename 抑制文件名的输出 –color=auto 表示使用颜色填充匹配到的内容,使其高亮显示
-
-
-
cut 命令:
-
截取命令
-
cut [选项] <文件名>
-
-d 自定义分隔符,默认为制表符
-f 与-d一起使用,提取第几列
-
-
-
-
管道命令 |
-
可结合cut 、grep的命令使用
cut -d ":" -f 1,6 /etc/passwd |grep -i root > a.txt 以:为分隔符,将/etc/passwd文件的1,和6列打印,并使用grep命令将包含root的内容输出到a.txt文件中
-
输出重定向 >
-
追加 >>
-
0 输入,1 正确,2 错误
grep -i root /etc/passwd 2> a.txt 将此命令错误的信息放在a.txt中(默认是1,就是讲正确的信息放进去)
-
-
printf格式化输出
-
printf [选项] <输出内容>
%s 字符串 %f 浮点格式 %c ASCII字符,即显示对应参数的第一个字符 %d,%i 十进制整数 %o 八进制值 %u 不带正负号的十进制值 %x 十六进制值(a-f) %X 十六进制值(A-F) %% 表示%本身
-
printf "字符串:%s , 整数:%d, 小数:%.3f " 字符串 100 100.33333
% .3f 保留小数点后三位
[外链图片转存中…(img-PQd5he6b-1595321676885)]
常用转义字符 | |
---|---|
\a | 警告字符,通常为ASCII的BEL字符 |
\b | 后退 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ | 表示\本身 |
printf "字符串:%-20s , 整数:%-5d, 小数:%4.3f " 字符串 100 100.33333
-20: 左对齐,保留20位
-5:左对齐保留五位
4:右对齐保留四位(即+)默认是右对齐
-
awk
- 作用:AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
-
用法:awk [-F|-f|-v] ‘ BEGIN{} [pattern] {command1; command2} END{} ’ file
-
BEGIN{} awk开始 时第一个执行的
-
[pattern] 正则表达式
-
{command1;command2} awk、内容
-
END{} awk结束要显示的内容
-
*运算符*
*运算符* *描述* = += -= *= /= %= ^= **= 赋值 ?: C条件表达式 || 逻辑或 && 逻辑与 ~ 和 !~ 匹配正则表达式和不匹配正则表达式 < <= > >= != == 关系运算符 空格 连接 + - 加,减 * / % 乘,除与求余 + - ! 一元加,减和逻辑非 ^ *** 求幂 ++ – 增加或减少,作为前缀或后缀 $ 字段引用 in 数组成员 *内建变量*
*变量* *描述* $n 当前记录的第n个字段,字段间由FS分隔 $0 完整的输入记录 FILENAME 当前文件名 FNR 各文件分别计数的行号 FS 字段分隔符(默认是任何空格) IGNORECASE 如果为真,则进行忽略大小写的匹配 NF 一条记录的字段的数目 NR 已经读出的记录数,就是行号,从1开始 OFMT 数字的输出格式(默认值是%.6g) OFS 输出字段分隔符, 默认也是空格 ORS 输出记录分隔符(默认值是一个换行符) RS 记录分隔符(默认是一个换行符) [外链图片转存中…(img-1R7IyWgB-1595321676889)][外链图片转存中…(img-J5qHAiX3-1595321676891)]
![img](c:/Users/Administrator/AppData/Local/cts/image/200709211503191.png
-
[外链图片转存中…(img-9Nu43PAh-1595321676892)]
awk '{print $10}' 2020708.log |grep -c "admin_login.php"
1、统计登录页面/upload/admin/admin_login.php被访问多少次
[外链图片转存中…(img-yURs9f27-1595321676895)]
awk '{print $10}' 2020108.log | grep -c "admin_.*.php"
2、统计admin_****.php 类文件共被访问次数
[外链图片转存中…(img-lETMkvI3-1595321676897)]
[外链图片转存中…(img-EbecvW5G-1595321676899)]
awk '{print $10}' 2020708.log |grep -o "admin_.*.php" | awk '{if(arr[$1]==0){print $1; arr[$1]=1}}'|wc -l
统计2020608.log文件以admin_开头以.php 结尾的文件共有多少种
awk '{print $10}' 2020708.log |grep -o "admin_.*.php" | sort -u
[外链图片转存中…(img-jtC4V02W-1595321676900)]
[外链图片转存中…(img-KOrNwUAj-1595321676901)]
[外链图片转存中…(img-l8I0F2vO-1595321676903)]
awk '{if($5>="[08/jul/2020/2020:21:00:00" && $5 <= "[08/jul/2020/2020:21:59:59") printf $5 "\n"}' 2020708.log | wc -l (如果用print自带换行,不需要加“\n”否则会多出来一倍结果)
4、21:00:00 - 21:59:59 共有多少次访问
[外链图片转存中…(img-8scWRG6i-1595321676904)]
5、登录页/upload/admin/admin_login.php 21:00:00 - 21:59:59期间共有多少次访问。
[外链图片转存中…(img-ACkwlqox-1595321676907)]
6、统计使用POST方式访问/upload/admin/admin_login.php页面的共多少次
[外链图片转存中…(img-Zunw4rvc-1595321676907)]
6、统计使用POST方式访问/upload/admin/admin_login.php页面的共多少次
[外链图片转存中…(img-PMel4egt-1595321676909)]
6、统计使用POST方式访问/upload/admin/admin_login.php页面的共多少次
[外链图片转存中…(img-jAPEOwud-1595321676912)]
7、统计使用POST方式访问/upload/admin/admin_login.php并且登录成功的有多少次
[外链图片转存中…(img-lWdutmiY-1595321676913)]
7、统计使用POST方式访问/upload/admin/admin_login.php并且登录成功的有多少次
[外链图片转存中…(img-z6jed77v-1595321676916)]
/ :代表本身 \: 代表转义
[外链图片转存中…(img-oiAOuKjy-1595321676917)]
7、统计使用POST方式访问/upload/admin/admin_login.php并且登录成功的有多少次
[外链图片转存中…(img-90RABXQz-1595321676918)]
7、统计使用POST方式访问/upload/admin/admin_login.php并且登录成功的有多少次 将次数打印在结尾
[外链图片转存中…(img-A9I9Lat9-1595321676921)]
7、统计使用POST方式访问/upload/admin/admin_login.php并且登录成功的有多少次 使用END方法将次数打印出来
[外链图片转存中…(img-L35jWqn4-1595321676922)]
[外链图片转存中…(img-OHDkNzRq-1595321676925)]
7.10 shell
-
sed命令
- 作用:sed是一个流编辑器,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替- -换、删除、新增、选取等特定工作。而vi编辑器不能当作管道命令。
- 用法:sed [-nefri] ‘command’ 文件名
- 常用选项:
-n∶在一般 sed 的用法中,sed会把所有资料一般都会被输出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来;
-e∶允许对输入数据使用多条sed命令编辑;
-f∶直接将 sed的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-i∶直接修改读取数据的文件内容,而不是由屏幕输出,注:该选项会更改原文件的内容;
- 常用命令:
a\∶行追加,在指定行后追加内容,当追加多行内容时,除最后一行不加\外,其他行的行尾都要加\,表示数据未输入完;
c\∶行替换,c的后面可以接字串,这些字串可以取代 n1,n2 之间的行;
i\∶行插入,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
d∶删除,删除指定的行;
p∶打印,输出指定的行;
s∶字串替换,通常搭配正规表达式,例如 1,20s/old/new/g ;
-
shell
-
vim one.sh (新建一个名字为one.sh 的shell) #!/bin/bash (在vim内第一行必须写这个) #这是第一个shell (#为注释符) echo "你好世界" chmod u+x one.sh (为one.sh增加执行权限) ./one.sh (由于one.sh不在bin目录下,所以需要在前面加上./执行)
-
-
声明shell的变量
-
用法:declare [+/-] [选项] 变量名
选项:
+/- "-“可用来指定变量的属性,”+"则是取消变量所设的属性。
-p 显示指定变量的被声明的类型。
-r 将变量设置为只读。
-x 指定的变量会成为环境变量,可供shell以外的程序来使用。
-i 将变量声明为整数型。
-
[外链图片转存中…(img-dOUTv0w4-1595321676926)]
[外链图片转存中…(img-cHndspVd-1595321676930)]
-
特殊变量
*表11-1-6 特殊变量*
*位置参数变量* *实例* $? 上个命令的退出状态,或函数的返回值。一般情况下,大部分命令执行成功会返回 0,失败返回1。 $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 $! 表示最近一个后台命令的进程ID。 $PPID 父进程ID $HOME 表示当前用户家目录 $PATH 环境变量 $PWD 当前工作目录 -
位置参数变量
*表11-1-5 位置参数变量*
*位置参数变量* | *实例* |
---|---|
$n | n为数字,$0代表脚本本身,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 使 用 在 括 号 包 含 , 如 9代表第一到第九个参数,十以上的参数需要使用在括号包含,如 9代表第一到第九个参数,十以上的参数需要使用在括号包含,如{10}。 |
$* | 该变量代表命令行中所有参数,$*将所有参数当成一个整体。 |
$@ | 该变量代表命令行中所有参数,但$@把每个参数区分对待。 |
$# | 该变量代表命令行中所有参数的个数。 |
匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] | a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b… a9b。 |
匹配 sring1 或 string2 (或更多)其一字符串 | a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一。 |
-
test 比较运算符不可用,用英文缩写代替
> -gt < -lt >= -ge <= -le = -eq != -ne &&逻辑与 -a ||逻辑或 -o [外链图片转存中…(img-pcpLESVZ-1595321676932)][外链图片转存中…(img-Op3G8TRN-1595321676932)][外链图片转存中…(img-JTyQGn5x-1595321676934)]
-
shell脚本的编写
-
1.求和计算,如果和等于66 ,显示你真六。
vim 1.ch #!/bin/bash #这是求和shell a=$[$1+$2]; echo $a; if test $a eq 66 ;then echo "你真六"; fi
-
2、编写shell 脚本,实现传入两个参数,判断两个参数的大小
vim 2.ch #!/bin/bash #这是比较大小shell if test $1 -gt $2; then echo "$1大于$2"; else echo "$2大于$1"; fi
-
3、编写shell脚本,实现传入三个参数,打印出3个数字中最大的数字(不考虑相等的情况)。
vim 3.ch #!/bin/bash #这是比较大小shell a=$[$1-$2]; b=$[$1-$3]; c=$[$2-$3]; if test $a -gt 0 -a $b -gt 0 ;then echo $1; elif test $a -lt 0 -a $c -gt 0 ;then echo $2; else test $b -lt 0 -a $c -lt 0 ;then echo $3; else echo "相等"; fi
-
-
[外链图片转存中…(img-PzmTLWDP-1595321676936)]或者
-
[外链图片转存中…(img-grOAHOI6-1595321676939)]
-
4、编写shell脚本,实现传入学员分数,判断并输出学员分数等级。
vim 4.ch #!/bin/bash #这是成绩判断 if test $1 -lt 60 ; then echo "不及格"; elif test $1 -gt 50 -a $1 -lt 71; then echo "及格"; elif test $1 -gt 70 -a $1 -lt 81; then echo "良好"; elif test $1 -gt 80 -a $1 -lt 91; then echo "优秀"; else echo "太秀了"; fi
-
5、编写shell,实现判断传入的参数是否同时是3和5的整数倍,是输出”Yes” 否者输出”NO”
vim 5.ch #!/bin/bash #这是判断取余 a=$[$1 % 5]; b=$[$1 % 5]; if test $a -eq 0 -a $b -eq 0 ;then echo "yes"; else echo "no"; fi
- 6、编写shell脚本,实现传入年份判断年份是否为闰年 闰年:能被400整除或者(能被4整除,但不能被100整除)
vim 6.ch
#!/bin/bash
#这是判断闰年
a=$[ 1 b = 1 % 4]; b= 1b=[ 1 c = 1 % 100]; c= 1c=[$1 % 400];
if $a -eq 0 -a $b -ne 0 ; then
echo “闰年”;
elif $b -eq 0 -a $c -eq 0 ;then
echo “闰年”;
else
echo “平年”;
fi- read -p
-
[外链图片转存中…(img-tF6VHStE-1595321676940)][外链图片转存中…(img-oTBoq52E-1595321676944)]
[外链图片转存中…(img-B30lWEFW-1595321676944)]
-
SHELL里的括号
name=zhangsan echo $name zhangsan echo ${name}name1 #打印变量时将后面的一起加上去 zhangsanname1 num=1 num1=2 num3=$[$num+num1] #逻辑运算时使用 echo $num3 3 num=1 num1=2 echo (($num3=$num+$num1)) echo $((num+num1)) 3 ((num++)) echo $num 2 let $num=$num+$num1 #let运算时不用加括号 echo $num 3 [ 1==1 ] 判断 中括号两头必须加空格
[外链图片转存中…(img-ixygVujH-1595321676946)]
7.11 for循环
-
嵌套分支结构
-
if [ 条件一 ];then echo ""; if [满足条件一时进入此];then echo ""; else echo""; fi #主分支结束 else echo "不满足条件一时直接进入此条件"; fi
-
[外链图片转存中…(img-tGgnqFRV-1595321676951)]
- for 循环
#!/bin/bash
#循环
for ((i=10;i<10;i++));do
echo $1;
done
echo "我是循环";
- 嵌套循环(最多就三次,多了会特别慢)
#!/bin/bash
#嵌套循环
for ((i=0;i<10;i++));do
for((j=0;j<10;j++));do
echo '$i='$1'$j='$j;
done
done
echo "我是循环体"
-
crontab 定时任务
-
-e 修改计划任务 -l 查看计划任务 -r 删除所有计划任务列表 -u 为指定用户设定计划任务 -
分:时:日: 月 :周
分 0-59 时 0-23 日 1-31 月 1-12 周 0-6 分 时 日 月 周 1 20 3 * * echo "呵呵" >> /home/ujiuye/cron.txt 每月的三号 20:01 执行任务
- 定义连续时间: 1-5 8-10
- 定义不连续时间: 1,3,5
- 周期间隔: */5
- 任意时间: *
[外链图片转存中…(img-C7Q5y7Hp-1595321676953)]
-
-
wget 下载
-
for in循环
#!for S in $(ls /home);do echo $s; done
#!/bin/bash arr=(a b c 1 2 3); #建立一个数组 for var in ${arr[@]};do #@/*将所有的数组内容都打出来 echo $var' done
-
while循环
#!/bin/bash num=0; while [ $num -lt 10 ] do echo $num; (($num++)); done
-
函数
#!/bin/bash
function say(){
echo "我是say、方法";
}
say;
#!/bin/bash
function say(){
echo $[$1+$2];
}
say 110 120 ;
- 九九乘法口决表
[外链图片转存中…(img-YPfJIJMh-1595321676957)]
[外链图片转存中…(img-DesSB84K-1595321676959)]
7.13 mysql数据库
-
配置环境变量 安装路径/bin 配置到path下
-
gb2312、gbk、unicode(国际兼容各种格式)、utf8
-
create database <库名> character set <字符集> collate <校对集>
create database test character set="utf8" ; (创建一个test库编码格式为utf8)
show create database test; 查看text 库的字符集
create database ujiuye character set="utf8" collate="utf8_general_ci"; 设置字符集、校对集
[外链图片转存中…(img-LkmoFHhM-1595321676960)]
-
查看当前字符集命令
- show variables like ‘%char%’ ;
-
查看字符集默认的排序方式
- show variables like ‘%collation_%’;
-
-
排序方式的命名规则
- 1._ci,区分大小写的排序方式
2._cs,不区分大小写的排序方式
3._bin,二进制排序方式,大小比较将根据字符编码,不涉及人类语言 - 开启日志信息
- set global general_log = “on”; 开启日志
- show variable like ‘%general%’; 查看日志是否开启
- 1._ci,区分大小写的排序方式
create database if not exists test ;
[if not exists] 如果test库不存在就建立存在就省略
drop database if not exists test ;
如果test存在就删除,不存在不会报错
-
字符类型
- 字符串类型
*类型* *存储空间(字节)* *最小值(理论)* char(n) 固定长度,最多255个字符 n代表字符的个数 varchar(n) 可变长度,最多65535个字符 编码不同字符数不同: Gbk<=32767 Utf8<=21845 tinyText,text,mediumText,longtext 可变长度,最大长度分别为 255, 65535, 2^24-1, 2^32-1个字符 定义时,通常不用指定长度,可以自己计算。 enum 1、2。枚举选项量(65535) 内部存储是整型表示。字段值只能是某一个 Set 1、2、3、4、8。元素数量:64 字段值可以选择多个 Binary,varbinary,blob Binary(char),varbinary(varchar),blob(text) 做类比 二进制数据(字节而非字符) - 数字类型
- 整型
*类型* *字节* *最小值(有符号/无符号)* *最大值(有符号/无符号)* TINYINT 1 -128/0 127/255 SMALLINT 2 -32768/0 32767/65535 MEDIUMINT 3 -8388608/0 8388607/16777215 INT/INTEGE 4 -2147483648/0 2147483647/4294967295 BIGINT 8 -9223372036854775808/0 9223372036854775807/18446744073709551615 -
int (11)zerofill 当不足11位的时候,用0来补齐到十一位
-
tinyint(1) unsigned 非负数,最多到255
-
浮点型
*类型* *存储空间(字节)* *最小值(理论)* *最大值(理论)* FLOAT 4 -3.402823466E+38 3.402823466E+38 DOUBLE 8 -1.7976931348623157E+308 1.7976931348623157E+308 DECIMAL 如果M>D,为M+2否则为D+2 M,最大是65 DECIMAL
-
时间类型
*名称* *格式* *取值范围* *存储空间* *零值* DATE YYYY-MM-DD '1000-01-01’到’9999-12-31 3字节 0000-00-00 TIME HH:MM:SS -838:59:59’到’838:59:59’ 3字节 00:00:00 DATETIME YYYY-MM-DD HH:MM:SS ‘1000-01-01 00:00:00’到’9999-12-31 23:59:59’ 8字节 0000-00-00 00:00:00 TIMESTAMP YYYY-MM-DD HH:MM:SS 是‘1970-01-01 00:00:00’到2038-01-19 03:14:07 4字节 0000-00-00 00:00:00 YEAR YYYY 1901到2155 1字节 0000
Bit B KB MB GB TB
8 bit = 1b
1024 B = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
create table users(
name varchar(20) not null default '' comment '姓名' , #设置姓名为可变长20,不能为空,默认值为空字符,注释为姓名
num_code tinyint(1) , #设置num_code类型为tinyint(1),二进制位(01010101)十进制为255
age tinyint(1) ,
b_date date , #设置出生日期
sex enum('男','女') , #设置性别为枚举
)
engine 'innodb' ; #设置引擎为innodb
-
desc <表名> 查看表字段
-
alter table users add phone varchar(11) not null default '' after sex; 在sex字段后插入一个新的phone字段
alter table users change sex xingbie enum('男','女') not null default '男' ; 修改 sex字段 为 xingbie
alter table users modify phone int(11) not null default '0' comment '手机号'; 修改 phone 字段类型
alter table users drop phone ; 删除 phone 字段
alter table users rename new_user; 将users 表修改表明为new_user
- 单行注释 # –
- 多行注释 /* */
- /*! */只在mysql里面执行,在其他是注释
7.14 增删改查
-
增:
- insert into <表名> values (字段值1,字段值二…) ; #必须写全
- insert into <表名> (字段名1,字段名2…) values (字段值1,字段值二…) ;可以给想要的字段增加值,不写的给默认值或为空
- insert into <表名> set 字段名1=值 , 字段名2=值 , … ;
-
删
- delete from <表名> where [条件]
- delete from users where id=1 ;
- delete from <表名> where [条件]
-
改
- update <表名> set 字段1=值 , 字段2=值 where <条件> ;
-
查
-
select <字段> /* from [表名]
- 可以使用比较运算符 、逻辑运算符
- = != in and or > < <= >= between…and
- 可以使用比较运算符 、逻辑运算符
-
select * from users where uid in (1,2,3) ; 把uid 值为1,2,3的都打出来,不存在就忽视
select * from users where uid not in (1,2,3) ; 把uid不等于1,2,3的都打印出来
select * from users where uname like 'li%' ; 把uname里面开头是li的都打印出来 like 模糊查询
![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB1BE.tmp.jpg)
select * from users where uid >=1 and uid <=3 ; 查询uid大于等于1和uid小于等于3同时成立的
select * from users where uid between 2 and 3 ; 查询uid 等于2-3的,包含2和3
select * from users where uid != 1 ; select * from users where not (uid=1); select * from users where !(uid=1); 查询uid不等于1的,以上三种方式都可以
-
like 模糊查询,助逐行匹配,比较慢最好别用,占用大量的cpu。
like '%li%' ; 只要里面包含li 就会匹配出来
-
()可以调整逻辑运算符的优先级,否则默认优先级为先and后or
-
-
show full columns from users ; 查看字段的注释
-
show create table <表名> ; 查看表注释
-
-
group by 分
select * from users group by sex;
对性别进行分组,每一组只显示第一个或最后一个
聚合函数
select max(score) from users group by sex;
将性别(sex)每一组里的最高分(max(score))显示出来
-
聚合函数
-
max、min、avg(平均数)、sum(求和)、count(数量)
select sex,max(score),min(score),avg(score),sum(score),count(scroe) from users group by sex;
-
[外链图片转存中…(img-mgUEA5Ly-1595321676961)]
select uid as id,uname as u, score as s, score*10 as ss from users;
as: 后面跟别名,可以省略; score*10 单独扩列出一列,对score列内容进行乘法运算别名为ss
-
去重
select distinct sex from users; 对users表的sex项去重
[外链图片转存中…(img-SZIymiQF-1595321676962)][外链图片转存中…(img-ZKb3h5SV-1595321676964)]
-
select score,name from student order by score limit 10 ; 1、查询全校成绩倒数10名的学员都有谁。
select count(class_name),class_name from student where score < 60 group by class_name; 2、查询各个班级分数小于60的人数;
select count(class_name),class_name from student where class_name in ('1班','3班','4班','7班') and score > 90 group by class_name ; 3、查询1,3,4,7班中分数大于90的人数分别有多少。
select count(class_name),class_name,sex from student where class_name in ('1班','3班','4班','7班') and score > 90 and sex = '女' group by class_name ; 4、查询1,3,4,7班中分数大于90的女生分别有多少。
select count(sex),sex from (select sex from student order by score desc limit 100) a group by a.sex ; 5、查询成绩前100名中的学生的男女生各多少人
select class_name,count(class_name),max(score),min(score),avg(score) from student group by class_name ; 6、统计每个班级有多少人,最高分,最低分,平均分;
select class_name,count(sex),sex,max(score),min(score),avg(score) from student group by class_name,sex ; 7、统计各班男女生分别有多少人,其中最高分,最低分,平均分分别是多少;
select * from student where class_name="8班" order by score desc limit 10; 8、查询8班成绩的前10名;
select class_name,avg(score) from student group by class_name having avg(score) > 40; 9、查询所有班级中平均分大于40的班级。
select class_name,count(*) from student where score > 80 group by class_name having count(*) > 30 ; 10、查询分数大于80的人超过30个人的班级。
select score,name,add_time from student where add_time between '2020-07-01' and '2020-08-01'; 11、查询入学日期在2020-7-1至2020-8-1的学员成绩。
select class_name,avg(score) from student group by class_name order by avg(score) desc limit 1; 12、查询所有班级中,平均分最高的班级是哪个班。
7.15 join联合查询
-
联合查询 join
-
外联查询
- 左联接 <表1> left join <表2> on [拼接条件]
select * from student left join class_info on student.class_name=class_info.class_name limit 10;
[外链图片转存中…(img-ZgNYZriN-1595321676968)]
- 右联接 <表1> right join <表2> on [拼接条件]
- 左联接以左表为主,右表内容不存在时用null补齐,右联接也相似
-
内联查询
- 内联查询 <表1> inner join <表2> [连接条件]
select * from student inner join class_info on student.class_name=class_info.class_name limit 10;
[外链图片转存中…(img-15KoDbHl-1595321676969)]
- 交叉链接 cross,不需要写联接条件
select * from users cross join class_info ;
[外链图片转存中…(img-kRbY5FD7-1595321676970)]
-
[外链图片转存中…(img-GZpWTMtN-1595321676971)]
-
子查询
-
select *,(select ) from <表名> (select ) where [条件] (select ) 三种形式
-
select 子查询
select * , (select user()) from student;
select *(select count(*) from student as c where c.class_name =s.class_name )as total from student as s;
select class_name,count(*) as total,(select count(*) from student as s1 where score < 60 and s1.class_name=s.class_name) as '不及格' from student as s group by s.class_name ;
-
from 子查询
select * from (select * from users where uid > 10 ) as s where s.uid > 15 ;
select * from where score in (select score from student where class_name='1班' and score > 90 ) and class_name != '1班' ; 查询student表所有成绩和一班成绩大于九十分的学生信息,不包含一班
select * from student where score > any (select score from student where class_name='1班' and score > 90 ); 查询所有成绩大于任意 一班成绩 大于九十分 的学员信息
select * from users where exists (select * from class_info where users.class_name=class_info.class_name); 查询class_info表和users表 class_name都一样的数据打印出来
select name , id from student where exists (select * from good where student.id = good.id and num> 5) ; 查询 student表 ,当student表里的id 在 good表里的uid存在的时候,打印出来num>5符合条件的结果
- where 子查询
-
-
-
union 合并查询
- union all 不去重复合并查询
[外链图片转存中…(img-EvxWDTgu-1595321676972)][外链图片转存中…(img-BXoKlXz7-1595321676972)]
-
函数
- concat 拼接字段
select concat(uname, '-' , sex) as full_name from users ; 字符串拼接
select class_name , group_concat(uname) from users group by class_name ;
[外链图片转存中…(img-wibuNFEi-1595321676973)]
-
trim 首尾去空格
select trim ('' , from ' abcded ') ;
首尾去空格
- repeat(字段,n) 重复 括号里写几就重复多少次
select repeat (uname,3) from users;
将users表里面的uname字段重复三次显示
- substring(字段,n , m)截取字段的长度
select substring(umane,1,1)from users;
将users表里uname字段从第一个字段取一个字段
-
curdate() 获取当前日期
-
curtiam() 获取当前时分秒
-
surrent_timestamp() 获取当前日期时分秒
-
sysdate () 获取当前年月日时分秒
-
select date_format(now(),'%Y:%m:%d:%H%i:%s') Y 年 m 月 d 日 H 时 i 分 s 秒
-
select uname , (if (score)>=60,'及格', '重修') from users ; 如果users表内的 score 大于等于六十,执行及格,否则重修
-
select database() 查询当前所在库
-
select user() 返回当前用户名
-
select collation() 查看当前字符集排序方式
-
select md5(‘aaaaa’); md5算法
-
select password(‘123455’); 密码加密
[外链图片转存中…(img-ZuF2q44B-1595321676975)]
7.16
6.17 触发器
-
触发器 不能操作自己的表
- (1)触发器的建立
- CREATE TRIGGER trigger_name
{BEFORE | AFTER} /表示是某个事件之前还是之后触发/
{INSERT | UPDATE |DELETE} /表示一个表上什么事件发生时会触发/
ON table_name
FOR EACH ROW /监听它的每一行/
triggered sql statement; /要执行的一条或多条语句,不能有select语句,类似写存储过程的语句,可以用begin和end写多条语句/
基本格式如下:
SHOW TRIGGERS;
查看单独某个触发器:
SHOW CREATE TRIGGER trigger_name;
MySQL中,所有的触发器都定义在information_schema数据库中的trigger表中,查看trigger表,可以查看到数据库中所有触发器的详细信息。查询语句如下:
SELECT * FROM information_schema.triggers;
- (3)触发器的删除
- DROP TRIGGER trigger_name;
- (1)触发器的建立
[外链图片转存中…(img-QHnNhCMC-1595321676975)]
-
mysql 用户管理
- 用户登录或退出 MySQL 服务器
cmd 打开命令行 msyql -h hostname|hostIP -P port -u username -p
- 创建和删除普通用户
(1)创建用户的三种方法
- (1)用 create user 来新建普通用户
CREATE USER user_name [IDENTIFIED BY‘PASSWORD’][,user_name [IDENTIFIED BY ‘PASSWORD’]]. ;
CREATE USER ‘username’@’host’ IDENTIFIED BY ‘password’;
create user ‘person1’@’localhost’ identified by ‘test’; // 本地访问
create user ‘person2’@’%’ identified by ‘test’; // 远程访问create user‘person3’@’192.168.22.%’ identified by ‘test’; //当前网段可以访问
user_name 由用户名和主机名组成,identified by 关键字用来设置用户的密码2)
- (2)用 insert 语句向 mysql.user 表中插入数据
insert into mysql.user(Host
,User
,Password
,ssl_cipher
,`x509_
issuer,
x509_subject,
authentication_string`)values(‘www.ttang.com’,’ttang’,PASSWORD(‘ttang’),’’,’’,’’,’’);
一定注意字段如果要求 不能为空。请插入数据。 user表 是mysql 用户的重要表。字段基本要求都是不能为空的。
- (3)用户 grant 语句来新建普通用户
GRANT priv_type ON database_name.table_name TO ‘username’@’host’;
priv_type 用户的操作权限,比如select、update、delete 等,如果赋予所有权限用
all
(2)删除普通用户
- (1)用drop user删除普通用户
DROP USER 用户名 @ 来源地址 ;
- 2)用 delete 语句去 mysql.user 表中删除用户
DELETE FROM mysql.user WHERE User=’ttang’ AND Host=’www.ttang. com’;
FLUSH PRIVILEGES ;
3.普通用户和 root 用户的密码管理
-
(1)root 修改密码方法:
- 1)使用 mysqladmin 命令来修改 root 用户的密码
mysqladmin -u 用户名 -p 旧密码 password 新密码
- 2)修改 mysql.user 表
update mysql.user set password=password(‘123456’) where User=’ttang’ [and Host=’www.ttang.com’;](http://www.ttang.com/)
- 3)使用 set 语句修改 root 用户的密码
SET PASSWORD=PASSWORD(“ROOTPWD”)
(2)修改普通用户密码
SET PASSWORD FOR‘USERNAME’@’HOST’=PASSWORD(‘NEW_PASSWORD’);
-
mysql备份以及还原
-
mysql备份
- mysqldump [库名] [表名] - u [用户名] -p > [备份位置及文件名]
-
mysql还原
-
source [文件位置及文件名]
-
mysql -u [用户名] -p [库名] < [备份位置及文件名]
-
-