shell中常用的基础命令(diff/patch/cut/tr/test)

主题: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)软连接 既能检测到是不是软连接 又显示是不是文件 显示两个是咋回事

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值