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 表示解压到哪个位置,不指定,默认是当前路径
'''