主题:shell中通常用的基础命令
一、引言:
- 对shell的理解有助于Ansible的学习;
- shell脚本:脚本语言是计算机编程代码的一种,和其他代码语言一样,达到用来代替人工手工操作,进行计算机自动执行程序的功能;
- shell脚本(shell script)是属于脚本语言,用在linux系统上;
- shell script(shell 脚本)是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面,然后用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的。
- shell和shell脚本有什么区别?
shell脚本:打开文本编辑器(可以使用vi/vim命令来创建文件),新建一个文件test.sh,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。相当于对命令进行文本记录;
Shell:就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它为用户提供了一个向Linux发送请求以便运行程序的接口系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。 Shell是用户使用Linux的桥,是保护内核的壳 - shell脚本内容需具有灵活性和变通性,因此会使用到选择等语句。
- 程序是由哪些部分组成的?数据+结构
二、知识扩展
1.学着用man命令,相当于鱼竿!
2.查看硬件的命令
三、常用的命令
(一)diff
diff作用:区分不同
输出信息: [num1,num2][a|c|d][num3,num4]
num1,num2 | 第一个文件中的行 |
---|---|
a | 添加 |
c | 更改 |
d | 删除 |
< | 第一个文件中的内容 |
> | 第二个文件中的内容 |
num3,num4 | 第二个文件中的行 |
常用参数
默认不加参数的情况下,计算空格、空行、大小写。
-b | 忽略空格,不检测空格(没有-b参数时,默认计算空格符号) |
---|---|
-B | 忽略空行(默认情况下,diff将空行比较在内!) |
-c | 显示文件所有内容并标示不同 |
-i | 忽略大小写 |
-r | 对比目录 |
-u | 合并输出,生成文件,用于打补丁 |
输出信息实验过程:
1.进入/mnt目录,新建两个文件(两文件不同,第二个文件比第一个多一行)
cd /mnt
echo hostname
>westos 其中 ``表示的是去执行这个命令
cp westos westos.new
vim westos.new 并追加写入内容jiajia
2.vimdiff westos westos.new 不同的地方显示高亮
3.diff westos westos.new
4.man diff
一些实验结果。
第2行内容不同,第1个文件4,5两行删除,就和第二个文件相同
第3行内容不同,第1个文件5两行删除,就和第二个文件相同
第3行内容不同,第1个文件增加第二个文件中、65两行删除,就和第二个文件相同
如果第一和第二个文件最后一行相同,改变第二个文件中的3-6行可以和第一个文件相同!
实验总结:
不管怎么样,显示的内容都是提醒用户如何才能让两个文件内容相同!
第二个文件相当于模板,diff对比说的是 把第一个文件怎么样,就会和第二个文件一样啦~
(1)如果第一个文件内容和第二个文件内容在前面相同的情况下,多出一行或者几行,diff显示为d 删除的意思
(2)如果第一个文件内容和第二个文件内容在前面相同的情况下,少一行或者几行,diff显示为a 增加的意思
(3)如果说两个文件从某一行开始出现不同,则显示的是c 改变的意思
(4)[num1,num2]表示的是文件1中从num1行到num2行
(5)同理,[num3,num4]表示的是文件1中从num3行到num4行
(6)单单一个num表示文件中仅有一行是不同的!
(7)c 改变的时候,会显示两个文件行的内容!
(8)一和num 表示第几行,两个num表示从第几行到第几行
常用参数实验过程:
-b 不区分空格
-i 忽略大小写
-r 比较目录
(1)新建两个目录
(2)两个目录中文件个数不用
(3)-r参数可对比
-u 合并输出
(1)diff -u westos westos.new > westos.path 生成补丁
生成补丁的含义是:当文件需要更新或者说文件中有一些漏洞错误,不需要把所有的文件重新下载,而是只要更新有错误或者不足得内容,提升了效率!
(2)配置yum 源,下载补丁软件 yum install patch -y (-y表示自动安装)
查看patch 的用法, patch --help
用法:Usage: patch [OPTION]… [ORIGFILE [PATCHFILE]]
打补丁:删除多余的目录文件
patch westos westos.path (原文件不见了)
patch -b westos westos.path (保留原文件)
注意:当.orig已经存在的时候,就不要再打补丁了,保持实验环境的纯净!当.orig已经存在的时候,再打补丁会生成.rej文件。
生成westos(源文件)和westosnew(模板文件)的补丁文件
给westos文件打补丁
生成westos.new(原文件)和westos(模板文件)的补丁文件westosnew.patch
给westos.new文件打补丁
(二)patch 打补丁
patch 原文件 补丁文件
-b 备份原文件,多出文件westos.orig
总结
yum install patch -y 下载打补丁软件
diff -u jiajia jiajia.new >jiajia.patch 合并输出补丁文件
patch -b jiajia jiajia.patch 打补丁
(三)cut 截取数据
cat 和 head这两个命令是看行的
cut可实现看列!
实验过程
(1)删除/mnt文件和目录
(2)cp /etc/passwd . 将/etc/passwd拷贝到当前
(3)cat passwd显示所有行
(4)head passwd -n 3 | tali -n 1 看到第三行
(5)passwd文件中内容均是以冒号:分隔开的,每一行都有7列
如:第一行是用户名称,目标:现在需要把第一列用户名称显示出来
cut -d : -f 1 passwd
-d : 表示以:分隔开,即指定:为分隔符
-f 1 表示查看第一列内容
cut -d : -f 1,7 passwd 看第一和第七列(共2列)
cut -d : -f 2-4 passwd 查看第2到4列 (共3列)
cut -d : -f 5- passwd 查看第5列之后
cut -d : -f -3 passwd 查看第3列之前
下图为显示不同的列数:
cut -c 1,4 passwd 查看第1和第4个字符
cut -c 1-4 passwd 查看第1到第4个字符
cut -c -4 passwd 查看第1和第4个字符
下图为显示的不同的字符数:
-d | 指定:为分隔符 |
---|---|
-c | 指定截取的字符 |
-b | 指定截取的字节 |
-f | ;3,5 三和五列;2-7 二到七列;5-五到之后的列;-5开始到第五列 |
–output-delimiter=@ | |
指定输出的分隔符 | |
–complement | 反选 |
==反选
cut -d : -f 1-3 passwd --complement ==
指定显示字符是@符号。
cut -d : -f 2-5 passwd --output-delimiter=@
指定显示字符是空格。
cut -d : -f 2-5 passwd --output-delimiter=" "
cut -b 2-5 passwd
cut -c 2-5 passwd
练习01:
(1)ifconfig ens33 可以显示网卡的信息
(2)查看网卡时,输出内容只显示ip地址
(3)使用命令ifconfig ens33 | XXXXX
(四)sort 排序
-n | 纯数字排序 |
---|---|
-r | 倒叙 |
-u | 去掉重复的数字(uniq),只显示为唯一的行 |
-d | 只显示重复的行 |
-o | 输出到指定文件,类似于追加或者重定向 |
-t | 指定分隔符 |
-k | 指定排序的列 |
注意:
(1)-t -k 一般连用
实验环境:
(1)cd /mnt 并删除原有的文件 rm -fr *
(2)ps ax -o pid --sort = -%cpu 没有顺序的排列
(3)ps ax -o pid --sort = -%cpu | head -n 10|tail -n 9 > westos 没有顺序的文件内容
(4)c语言对数资进行排序 冒泡:两个数字比较,大的放后面,小的放前面
实验过程:
(一)
sort -r math 倒序
sort -n math 正序
(二)
(1)sort -rnu westos
(2)sort -rnu westos -o westos1 不再输出到终端
(3)cat westos1
(4)如果文件中有多列,在没有指定的情况下,默认排序第一列
(5)sort -t : -k 2 westos -n 数字排序第二列
(6)sort -t : -k 2 westos -nu
(7)sort -t : -k 2 westos -n | uniq -c 重复的内容删除但是数字体现出来了
(8)sort -n westos | uniq -c 显示重复的有几个
(9)sort -n westos | uniq -d 显示重复的行
(五)uniq
uniq 一般和sort连用!
-c | 合并重复,并统计重复个数 |
---|---|
-d | 显示重复的行 |
参数r和n连用
合并重复的行
指定列的排序:
注意:
(1)指定列的排序时,是按照指定的列数字进行排序;
(2)比较是否重复,比较的是此行内容是否完全相同,也就是比较各列的内容;
练习2.1:
ls -l 目录 可以显示目录中的所有文件的属性
请按照文件大小进行排序并找出最大的2个文件并显示其名称
ls -l /mnt/westosdir/ | sort -n -t ’ ’ -k 5|tail -n 2| cut -d ’ ’ -f 9
ls -l /mnt/westosdir/ | grep total -v | sort -n -t ’ ’ -k 5|tail -n 2| cut -d ’ ’ -f 9
ls -S | head -n 3写脚本解放思想,能简单不给自己找麻烦~ 效果是一样的!哈哈哈。
awk 做法
你知道的参数越多命令学的越好。
练习2.2:web 流量分析
检测apache服务器被谁访问的次数最多,显示访问者ip并显示访问次数。
注意问题,当存在多个最多次数的ip地址,需要过滤字符串。
(六)tr 转换字符的大小写
实验过程
(1)tr --help
(2)vim westos 写入westos WESTOS
(3)cat westos | tr ‘a-z’ ‘A-Z’ 小写转为大写
(4)cat westos | tr ‘A-Z’ 'a-z’大写转为小写
(八)&&是 ||或
- && 符合条件做动作
- || 不符合条件做动作
实验过程:
(一)
(1)ping -c1 -w1 172.25.254.111 &> /dev/null不想看到ping 之后的信息,扔到垃圾箱
(2)ping -c1 -w1 172.25.254.111 别人并不知道通不通,这个时候没有办法判断是否ping 通,想清晰明了的告诉外行通不通
(3)如果通显示yes 不同显示no
(4)ping -c1 -w1 192.168.43.33 &> /dev/null && echo yes || echo no
如果显示yes,表示ping的通
总结:如果有报错或者条件不成立,就会去做 || 之后的内容;如果条件成立,会做&&之后的动作!(得通就是条件成立,报错或者不通就是不成立)
(二)
(七)test 对比
实验过程:
(1)a=1 b=1
(2)echo $ a 显示a的值
(3)test "$a" = "$b" && echo yes || echo no
注意$与a之间没有空格
(4)为了书写方便,test 命令等价于[ ] 中括号
[ " $a" = " $b" ] && echo yes || echo no
注意:a的值需要用英文双引号引起来
test 数字对比
= | 等于 |
---|---|
!= | 不等于 |
-eq | 等于 |
-ne | 不等于 |
-le | 小于等于 |
-lt | 小于 |
-ge | 大于等于 |
-gt | 大于 |
-a | 并且 |
---|---|
-o | 或者 |
实验过程:
(1)a=1 b=2 c=1
(2)["$ a" -eq “$ c”] && echo yes || echo no
(3)[! “$ a” -eq “$ c”] && echo yes || echo no
(4)["$ a" -le “$ c”] && echo yes || echo no
a b是临时变量 关闭终端后,值消失!
注意:中括号两边有空格,引号是英文格式下的!
test 的条件关系
- -a 并且and
- -o 或者or
实验:判断8是不是在10以内
(1)a=8
(2)["$ a" -gt “0” -a “$ a” -le “10” ] && echo yes || echo no
(3)vim test.sh 写一个脚本
内容:
#!/bin/bash
["$ a" -gt “0” -a “$ a” -le “10” ] && echo yes || echo no
(5)设置执行权限 chmod +x test.sh
(6)传入值 export a=1
(6)watch -n 1 ./test.sh
(7)a=20
(8)["$ a" -gt “0” -a “$ a” -le “10” ] && echo yes || echo no 输出为no
(9)a=-1
(10)["$ a" -gt “0” -o “$ a” -le “10” ] && echo no || echo yes 输出为no
习题3.1 磁盘监控的脚本
**题目:**当/根的使用量超过百分之八十 ,发送警告邮件到root用户的邮箱中。
答案:
(1)显示百分号之前的数字
df -h / | tail -n 1 | awk ‘{print $5}’| cut -d “%” -f 1
test对于空的判定
- -n 判定内容不为空
- -o 判定内容为空
[-n “$a”] && echo yes || echo no 若a有值,则显示yes
[-n “$d”] && echo yes || echo no 若d没有值,则显示no
注意:单引号是将引号内的内容强制转化为字符的形式
双引号不转化 $ 符号,$ 符号这里是变量的意思!
但是又必须使用双引号 因为不使用 shell默认为空格后是命令
一般使用双引号,形式也美观,当需要转义$时,加上反斜杠
test对于文件的判定
-ef | 文件节点号是否一致(是否是同一个文件,这两个是不是硬链接) |
---|---|
-nt | 文件1是否比文件2新(哪个新建立) |
-ot | 文件1是否比文件2老(哪个后建立) |
-d | 目录 |
-S | 套接字 |
-L | 软连接 |
-e | 存在 |
-f | 普通文件(是不是一个文件) |
-b | 块设备 |
-c | 字符设备 |
知识补充与拓展:
1.什么是软连接&硬链接区别:
ln -s 创建软连接
ln 创建硬链接
软连接特点:
①占用资源少
②不会增加链接数目。
③经常使用这种
硬链接特点
①占用资源倍增,相当于复制了一份文件
②相同文件的硬链接id是相同的
Linux中I/O设备分为两类:字符设备和块设备。两种设备本身没有严格限制,但是,基于不同的功能进行了分类。
2.什么是块设备
应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘、软盘、CD-ROM驱动器和闪存都是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。
3.什么是字符设备
字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,键盘、串口、调制解调器都是典型的字符设备。
4.什么是套接字
一种独立于协议的网络编程接口,完成两个应用程序之间的数据传输。应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。
实验过程:
(1)-nt -ot
比的是文件创建时间
(1)cd /mnt
(2)touch file1
(3)touch file2
(4)["/mnt/file1" -nt “/mnt/file2”] && echo yes || echo no
(5)["/mnt/file1" -ot “/mnt/file2”] && echo yes || echo no
(2)-ef比较文件id (硬链接)
(1)touch westos
(2)ln /mnt/westos /mnt/westos1
(3)ls -li 可以看到两个文件id是相同的
(4)["/mnt/westos" -ef “/mnt/westos1”] && echo yes || echo no
(3)-d目录 -f普通文件 -e存在
(1)[ -d “/mnt”] && echo yes || echo no
(2)[ -e “/mnt”] && echo yes || echo no
(3)[ -f “/mnt”] && echo yes || echo no
(4)-L 软连接
(1)ln -s /etc/passwd /mnt/
(2)ls -l /mnt/ 可以看到有passwd的链接
(3)[ -L “/mnt/passwd”] && echo yes || echo no 判断/mnt/passwd是否是链接
(4)[ -L “/etc/passwd”] && echo yes || echo no 判断/mnt/passwd是否是链接
(5)-S 套接字
(1)yum install mariadb-server -y
(2)systemctl start mariadb
(3)ls -l /var/lib/mysql/mysql.sock
(4)[ -S “/var/lib/mysql/mysql.sock”] && echo yes || echo no
(6)-b 块设备
(1)[ -b “/dev/nvme0n1”] && echo yes || echo no
(7)-c 字符设备
(1)[ -c “/dev/pts/0”] && echo yes || echo no
测试题:
编写 check_flie.sh 在执行时
如果脚本后未指定检测文件报错“未指定检测文件,请指定”
如果脚本后指定文件不存在报错“此文件不存在”
当文件存在是请检测文件类型并显示在输出中,检测文件时文件、目录还是块设备什么的!
(1)vim check_flie.sh
(2)写入内容
#!/bin/bash
(3)sh check_flie.sh 解析:$1 没有值 应该是报错
(4)sh check_flie.sh /mnt/hahahaha
此方式的写法是从上到下都会执行!
存在的问题:
(1)能检测出 $1 是否真实存在,但是不能检测到sh 后有没有写这个值
(2)软连接 既能检测到是不是软连接 又显示是不是文件 显示两个是咋回事