Linux10 压缩命令,read,while、until循环,逻辑卷压缩、扩展及快照卷

压缩、解压缩命令

压缩格式:gz,bz2,xz,zip,Z
压缩算法:压缩算法不同,压缩比也会不同;
compress:FILENAME.Z
uncompress

gzip:.gz  #只能压缩文件,不能压缩文件夹
	gzip /PATH/TO/SOMEFILE:压缩完成后会删除原文件
	-d:指定-d就是解压缩,与gunzip效果一样
	-#: 1-9,指定压缩比,默认是6
gunzip:
	gunzip /PATH/TO/SOMEFILE.gz:解压完成后会删除原文件
zcat /PATH/TO/SOMEFILE.gz: 不解压的情况,查看文本文件的内容

bzip2:.bz2
比gzip有着更大压缩比的压缩工具,使用格式近似,也只能压缩文件,不能压缩文件夹
	bzip2 /PATH/TO/SOMEFILE  # 也会删除原文件
		-d   # 也会删除原文件
		-#:1-9指定压缩比,默认是6
		-k:压缩时保留原文件
	bunzip2 /PATH/TO/SOMEFILE.bz2
	bzcat  /PATH/TO/SOMEFILE.bz2: 不解压的情况,查看文本文件的内容

xz:.xz  # 压缩比比gzip和bzip2更大
	xz /PATH/TO/SOMEFILE  # 也会删除原文件
		-d   # 也会删除原文件
		-#:1-9指定压缩比,默认是6
		-k:压缩时保留原文件
	unxz /PATH/TO/SOMEFILE.xz
	xzcat

archive:归档,归档本身并不意味着压缩

zip:#压缩比不大,但是可以压缩目录(既能归档又压缩的工具)
	zip FILENAME.zip FILE1  FILE2...  # 压缩后不删除原文件
	unzip FILEANME.zip
	
tar: 归档工具
	-c:创建归档文件
	-f FILE.tar: 操作的归档文件
	tar -cf test.tar test*
	-x: 展开归档  展开后,原归档文件不动
	tar -xf test.tar
	--xattrs: 归档时,保留文件的扩展属性信息

	-t: 不用展开归档,就能看到归档了哪些文件
	tar -tf test.tar 
	
	-zcf:归档并调用gzip进行压缩(-c选项 压缩)
	-zxf:调用gzip解压缩并展开归档(-x选项,进行解压缩),-z选项可以省略

	-jcf: 归档并调用bzip2进行压缩(-c选项 压缩)
	-jxf:调用bzip2解压缩并展开归档(-x选项,进行解压缩),-j选项可以省略

	-Jcf: 归档并调用xz进行压缩(-c选项 压缩)
	-Jxf:调用xz解压缩并展开归档(-x选项,进行解压缩),-J选项可以省略

cpio: 归档工具

read与用户交互并获取用户输入

read 变量1 变量2.....
等待用户输入:。。。。。。
当用户输入的值的数量大于变量的数量时,前面的变量与值是一一对应关系,多出来的值会全部被最后一个变量接收;
read NAME AGE
输入:
zhang 18 read
echo $NAME # zhang
echo $AGE # 18 read 

read 
	-p # 该选项后可以加提示信息 read -p "input your information:" NAME AGE
	-t # 指定获取用户输入的超时时间

与用户交互求两数之和

#!/bin/bash
#
# echo -n "Input two intergers:"
read -t 5 -p "Input two intergers:" A B
[ -z $A ] && A=100
[ -z $B ] && B=200
ehco "$A plus $B is $[$A+$B]"

写一个脚本归档并压缩文件,要求:用户可以选择要压缩的文件,以及要压缩的格式,并能指定归档并压缩后,要存放的位置;

#!/bin/bash
#
read -p "Tree files:" FILE1 FILE2 FILE3
read -p "Destination:" DEST
read -p "Compress[gzip|bzip2|xz]:" COMP

case $COMP in
gzip)
  tar -zcf ${DEST}.tar.gz $FILE1 $FILE2 $FILE3 ;;
bzip2)
  tar -jcf ${DEST}.tar.bz2 $FILE1 $FILE2 $FILE3 ;;
xz)
  #tar -cf ${DEST}.tar.xz $FILE1 $FILE2 $FILE3
  #xz ${DEST}.tar
  tar -Jcf ${DEST}.tar.xz $FILE1 $FILE2 $FILE3
  ;;
*)
echo "Uknown."
exit 9
;;
esac	

while 循环

while循环:适用于循环次数未知的场景
语法:
	while CONDITON;do
		

用while求100内数字的和

#!/bin/bash
declare -i I=1
declare -i SUM=0
while [ $I -le 100 ];do
  let SUM+=$I
  let I++
done
echo $SUM

获取用户输入的小写字符串转换成大写,如果用户输入quit,退出。

#!/bin/bash
#
read -p "Input something:" STRING 
while [ $STRING != 'quit' ];do
  echo $STRING | tr 'a-z' 'A-Z'
  read -p "Input something:" STRING 
done

写一个脚本,判断用户是否登录,如果未登录,睡眠5s,之后继续判断,如果用户登录了给出提示信息。

#!/bin/bash
#
who | grep "hadoop" &> /dev/null
RETVAL=$?

while [ $RETVAL -ne 0 ];do
  echo "`date`, hadoop is not logged in."
  sleep 5
  who | grep "hadoop" &> /dev/null
  RETVAL=$?
done
echo "hadoop is loggined in."  

  
#!/bin/bash
#
cat << EOF
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
*) quit.
EOF

read -p "your choice:" CHOICE
while [ $CHOICE != 'quit' ];do
case $CHOICE in
d|D)
  echo "DISK usage:"
  df -Ph ;;
m|M)
  echo "Memory usage:"
  free -m | grep "Mem" ;;
s|S)
  echo "Swap usage:"
  free -m | grep "Swap" ;;
*)
  echo "Unknown." ;;
esac
read -p "Again,your choice:" CHOICE
done
 

echo -e:控制字体的样式,前景色,背景色等:

until 循环

进入循环:条件满足
退出循环:条件不满足
while CONDITION;do
  statment
done
进入循环:条件不满足
退出循环:条件满足


until CONDITION;do
  statment
  ...
done

#!/bin/bash
# 
read -p "Input something:" STRING
until [ $STRING == 'quit' ];do
  echo $STRING | tr 'a-z' 'A-Z'
  read -p "Input something:" STRING
done
# 方法一:

#!/bin/bash
#
who | grep "hadoop" &> /dev/null
RETVAL=$?
until [ $RETVAL -eq 0 ];do
  echo "hadoop is not logged in."
  sleep 5
  who | grep "hadoop" &> /dev/null
  RETVAL=$?
done
echo "hadoop is logged in."  

# 方法二:
#!/bin/bash
#
until  who | grep "hadoop" &> /dev/null;do
while  ! who | grep "hadoop" &> /dev/null;do
  echo "hadoop is not logged in."
  sleep 5
done
echo "hadoop is logged in."  

写一个脚本:
1.通过ping 命令测试192.168.1.151到192.168.1.254之间的所有主机是否在线;
如果在线,就显示"ip is up.",其中的IP要换为真正的IP地址,且以绿色显示;
如果不在线,就显示"ip is down.",其中的IP要换为真正的IP地址,且以红色显示;
要求:分别使用while,until和for循环实现。

ping -c 2 -t 2 IP

写一个脚本(前提:轻微虚拟新增一块硬盘,假设它为/dev/sdb),为指定的硬盘创建分区:
1.列出当前系统上所有的磁盘,让用户选择,如果选择q则退出脚本,如果用户选择错误,就让用户重新选择;
2.当用户选择后,提醒用户确认接下来的操作可能会损坏数据,并请用户确认;如果用户选择y就继续,n就退出;否则,让用户重新选择;
3.抹除那块硬盘上的所有分区(提示,抹除所有分区后执行sync命令,并让脚本睡眠3秒钟后再分区);并为其创建三个主分区,第一个为20M,第二个为512M,第三个为128M,且第三个为swap分区类型;(提示:将分区命令通过echo传送给fdisk即可实现)

fdisk -l 2> /dev/null | grep "Disk /dev/[sh]d[a-z]" | awk -F: '{print $1}'

#!/bin/bash
#
echo "
n
p
l

+20M
n
p
2

+512M
n
p
3

+128M
t
3
82
w" | fdisk /dev/hda

dd if=/dev/zero of=/dev/sdb bs=512 count=1  # 抹除分区
sync  # 同步到磁盘
sleep


# 脚本
#!/bin/bash
echo "Initial a disk..."
echo -e "\033[31mWarning: \033[0m"
fdisk -l 2> /dev/null | grep -o "^Disk /dev/[sh]d[a-z]"
read -p "Your choice:" PARTDISK
if [ $PARTDISK == 'quit' ];then
  echo "quit..."
  exit 7
fi

until fdisk -l 2> /dev/null | grep -o "^Disk /dev/[sh]d[a-z]" | grep "^Disk $PARTDISK$" &> /dev/null;do
  read -p "Wrong option.Your choice again:" PARTDISK
done

read -p "WIll destory all data in disk,continue?(y/n)" CHOICE
until [ $CHOICE == 'y' ] -a [ $CHOICE == 'n' ];do
  read -p "Wrong option.Input(y/n):" CHOICE
done
if [ $CHOICE == 'n' ];then
  echo "Quit."
  exit 9
else
  dd if=/dev/zero of=$PARTDISK bs=512 count=1 &> /dev/null
  sync
  sleep 3
  echo "n
p
l

+20M
n
p
2

+512M
n
p
3

+128M
t
3
82
w" | fdisk $PARTDISK &> /dev/null
  
  partprobe $PARTDISK
  sleep 2 # 防止内容无法刷到硬盘
  mke2fs -j ${PARTDISK}1 &> /dev/null
  mke2fs -j ${PARTDISK}2 &> /dev/null
  mkswap ${PARTDISK}3 &> /dev/null
fi
#!/bin/bash
#
for i in {`mount | grep "/dev/sdb" | awk '{print $1}'`};do
  fuser -km $1
  umount $1
  echo "$i unmount ok."
done

安装RHEL6.3 x86_64的方法(前提:请确保你的CPU支持硬件虚拟化技术):

1.创建虚拟机;
2.下载isos目录中的rhci-rhel-6.3-1.iso,并导入虚拟机的虚拟光驱;
3.在boot提示符输入:linux ip=172.16.x.1 netmask=255.255.255.0 gateway=172.116.0.1 dns=172.16.0.1 ks=http://172.16.0.1/rhel16.cfg


IDE:并行口, 133Mbps
SATA:串行口,300bps(SATA1),600Mbps(SATA2),6Gbps(SATA3);总线快,而硬盘本身传输数据慢,整体传输效率也低。
USB:串行口,USB1.1、USB2.0、480Mbps(USB3.0)
SCSI:并行口,Small Computer System Interface
SAS: additional storage

lsmod # 列出模块

练习:创建一个由物理卷组成的大小为20G的卷组myvg,要求其PE大小为16M;而后在此卷组中创建一个大小为5G的逻辑卷lv1,此逻辑卷要能在开机后自动挂载至/users目录,且支持ACL功能;


while循环和until循环的特殊用法

while 循环的特殊用法(遍历文件的行);
	
	while read VARIABLE;do
		循环体;
	done < /PATH/FROM/SOMEFILE
	
	一次读取/PATH/FROM/SOMEFILE文件中的每一行,且将其复制给VARIBLE变量;
	
	示例:找出ID好为偶数的用户,显示其用户名、ID及默认shell;
	
	#!/bin/bash
	#
	while read line;do
		userid=$(echo $line | cut -d: -f3)
		usernmae=$(echo $line | cut -d: -f1)
		usershell=$(echo $line | cut -d: -f7)
		
		if [ $[$userid%2] -eq 0 ];then
			echo "$username,$userid,$usershell."
		fi
	done</etc/passwd 
	
	for循环的特殊用法:
		for((控制变量初始化;条件判断表达式;控制变量的修正语句));do
			循环体
		done
		
		控制变量初始化:仅在循环代码开始运行时执行一次;
		控制变量的修正语句:每轮循环结束会先进行控制变量修正运算,而后再做条件判断;
		
	打印9x9乘法口诀表:
	#!/bin/bash
	#
	for ((j=1;j<=9;j++));do
		for ((i=1;i<=j;i++));do
			echo -e -n "${i}x${j}=$[${i}*${j}]\t"
		done
		echo 
	done

扩展逻辑卷

lvextend  # 扩展物理边界
	-L [+] #  /PATH/TO/LV
	
	2G, +3G
	5G
resize2fs  # 调整ext2/ext3/ext4文件系统参数,扩展逻辑边界
resize2fs /PATH/TO/LV 5G  # 扩展逻辑卷的边界为5G
resize2fs -p /PATH/TO/LV # 有多大,扩展多大

'''
mkdir /users
vim /etc/fstab
mount -a 
mount
ls /users
cp /etc/inittab .
cat inittab
df -lh
lvextend -L 5G /dev/myvg/testlv
df -lh  # 逻辑空间并未增加到5G
vgs
resize2fs -p /dev/myvg/testlv 
df -lh
cd /users && ls  && cat inittab
'''

缩减逻辑卷

注意:

1.不能在线缩减,得先卸载;
2.确保缩减后的空间大小依然能存储原有的所有数据;
3.在缩减之前应该先强行检查文件,以确保文件系统处于一致性状态;

# 首先逻辑逻辑卷
resize2fs   
	resize2fs /PATH/TO/PV 3G  # 表示缩减到3G 
# 缩减物理边界
lvreduce -L [-]\#  /PATH/TO/LV  

# 重新挂载 
mount -a


'''
df -lh  # 第一步,检查要缩减的逻辑卷已用了多少空间了,并确保缩减之后的空间大于已用的空间大小
umount /users # 第二步,卸载文件系统
e2fsck -f /dev/myvg/testlv  # 强行进行文件系统检测
resize2fs /dev/myvg/testlv 3G  # 缩减逻辑边界至3G
lvreduce -L 3G /dev/myvg/testlv  # 缩减物理边界
mount -a # 重新挂载
df -lh  # 查看逻辑卷大小缩减到3G
'''

快照卷

创建的快照卷不能让别人修改,所以创建快照卷应该以只读的方式;快照卷必须跟原卷在一个卷组之内,所以在创建快照卷的时候不需要指定在那个卷组中创建,但需要指定为哪个逻辑卷创建。

1.生命周期为整个数据时长,在这段时长内,数据的增长量不能超出快照卷大小;如果超出,快照卷就基本上挂掉了。

2.快照卷应该是只读的;

3.跟原卷在同一卷组内;

lvcreate 
	-s  # 表示创建快照卷
	-p  r|w  # r,只读,w,只写

lvcreate -L \# -n SLV_NAME -P r /PATH/TO/LV    # -L 指定创建多大的快照卷

'''
lvcreate -L 50M -n testlv-swap -s -p r /dev/myvg/testlv
lvs   # 可以看到testlv-swap快照卷,是myvg的
mount /dev/myvg/testlv-swap /mnt
cd /mnt && ls && cat inittab && wc -l
cd /users
vim inittab  # 在此文件中删除两行,再次统计/mntinittab的行数,发现没变化,所以在原卷中做的增减是不会影响到快照卷数据的。
tar -jcf /tmp/users.tar.bz2 /mnt/inittab  # 将快照卷的数据备份
umount /mnt  # 自此,快照卷生命周期已经结束,卸载这个卷并删除
lvremove /dev/myvg/testlv-swap

以后在没有备份的卷users不小心操作错了,可以用此快照卷的备份还原回来,但是在users制作快照卷以后,users的操作是没在快照卷的,需要增量备份。
tar -xf /tmp/uers.tar.bz2 -C ./  # -C 表示解压到哪个位置,不指定,默认是当前路径
'''
posted on 2021-04-29 15:55  jueyuanfengsheng  阅读(279)  评论(0编辑  收藏  举报