zoukankan      html  css  js  c++  java
  • 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 "33[31mWarning: 33[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}]	"
    		done
    		echo 
    	done
    

    扩展逻辑卷

    lvextend  # 扩展物理边界
    	-L [+] #  /PATH/TO/LV
    	
    	2G, +3G
    	5G
    resize2fs  # 扩展逻辑边界
    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 表示解压到哪个位置,不指定,默认是当前路径
    '''
    
  • 相关阅读:
    053-146
    053-659
    053-658
    053-657
    053-656
    053-654
    053-655
    053-652
    053-651
    053-650
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/14718306.html
Copyright © 2011-2022 走看看