马哥M28-第8-10天的学习总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了马哥M28-第8-10天的学习总结相关的知识,希望对你有一定的参考价值。

马哥M28-第八天、

vim :

   u撤销最近的更改,一次一个;

   #u撤销之前多次更改;

   U 撤销光标落在这行后所有此行的更改

   按ctrl - r重做最后的“撤销”更改

   . 重复前一个操作

   n. 重复前一个操作n次

   退出模式下 e! 直接还原到文件最初打开状态


在不完全保存退出或者故障导致异常关闭vim后当再打开时,会提示filename.swp缓冲交换文件,此为保存用户执行修改操作时的所有操作,在修改过程中并未

对源文件进行改动,所以此处可以利用其还原操作,当然另外在此补充知识:watch 命令,可以实时刷新一条命令的执行输出结果,用来对比查看在打开vim时以及之后

所做的的所有操作,比较生成.swp文件以及之后的变化!


watch :watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行。在Linux下,watch是周期性的执行下个程序,并全屏显示执行结果。你可以拿他来监测你想要的一切命令的结果变化,比如 tail 一个 log 文件,ls 监测某个文件的大小变化,看你的想象力了!

   -n或--interval  watch缺省每2秒运行一下程序,可以用-n或-interval来指定间隔的时间。

   -d或--differences  用-d或--differences 选项watch 会高亮显示变化的区域。 而-d=cumulative选项会把变动过的地方(不管最近的那次有没有变动)都高亮显示出来。

   -t 或-no-title  会关闭watch命令在顶部的时间间隔,命令,当前时间的输出。

   -h, --help 查看帮助文档

 -n 1 -d  ->指间隔一秒高亮显示变化区域信息;  -n .1 -d ->指间隔0.1秒高亮显示变化区域信息

示例:命令:每隔一秒高亮显示网络链接数的变化情况

watch -n 1 -d netstat -ant


ping命令:

示例:ping -c10 -w1 127.0.0.1   最终距离最开始ping之后1秒结束ping动作

 ping -c10 -W1 127.0.0.1   最终会每次间隔一秒ping完十次后结束命令   小写w表示多少多长时间结束Ping; 大写W表示每次Ping间隔时间 秒为单位


作业:

   1.在vim中设置tab缩进为4个字符

       vim /etc/vimrc

           set tabstop=4

   2.复制/etc/rc.d/init.d/functions文件至/tmp目录,替换/tmp/functions文件中的/etc/sysconfig/init为/var/log

         cp /etc/rc.d/init.d/functions /tmp 

         :%[email protected]/etc/sysconfig/[email protected]/var/[email protected]

   3、删除/tmp/functions文件中所有以#开头,且#后面至少有一个空白字符的行的行首的#号

        :%[email protected]^#\([[:space:]]\+.*\)@\[email protected]  后向引用:以每个小括号开始为分组,


  1. 编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小

    主机名 hostname

    IP  ifconfig    ifconfig eth0  具体查看某张网卡的网络信息

    系统版本  cat /etc/redhat-release

    内核版本  uname -r

    CPU型号   cat /proc/cpuinfo

    内存大小  cat /proc/meminfo   或 free -m

    硬盘大小  fdisk -l


#!bin/bash

echo 主机名"$(hostname)"

ipaddr=$(ifconfig ens33 |grep broad |tr -s " "|cut -d" " -f3)

echo ip地址"$ipaddr"

version1=$(cat /etc/redhat-release)

echo 系统版本"${version1}"

version2=$(uname -r)

echo "内核版本"${version2}

cpu=$(cat /proc/cpuinfo |egrep "model name" |uniq |cut -d: -f2)

echo  cpu型号"${cpu}"

mem=$(echo $[$(cat /proc/meminfo |egrep MemTotal |tr -s " " :|cut -d: -f2)/1024])

echo 内存大小"$mem"

sda=$(fdisk -l |egrep "Disk /" |cut -d, -f1|cut -d: -f2|cut -d" " -f2,3)

echo 硬盘大小"$sda"


2、编写脚本/root/bin/backup.sh,可实现将/etc/目录备份到/root/etcYYYY-mm-dd中

  练习题2优化版v1:

#date:2018-01-22

echo "准备复制/etc/下的所有目录以及文件到当前目录中:\n"

DATE_NOW=$(date +%F)

backup="etc${DATE_NOW}"

if [ -f "$backup" ] ;then

  echo "当前目录存在同备份同名目录,现进行删除并备份操作:"

  rm -f ${backup} 

  cp -rp /etc ./${backup}

fi

check=$(echo $?)

if [ "0" -eq "$check" ] ;then

  echo "备份完成,请检查备份文件!"

else

  echo "备份失败,请重新检查进行备份!"

fi


***检索复制后内容与复制对象之间的完全正确:通常使用比对文件字节数大小、文件和目录个数(、md5等加密)完全一直应该可以确定


作业:

3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值

df     (fdisk -l 不能查看使用率)

4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

主要命令:netstat -tan  -> 查看网络Ip连接信息

  

练习:

1、编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和

#!/bin/bash

A=$(cat /etc/passwd |head -n 10 |tail -1 |cut -d: -f3)

B=$(cat /etc/passwd |head -n 20 |tail -1 |cut -d: -f3)

echo "$[$A+$B]"


作业:

2、编写脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和


3、编写脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件


作业:写一个生成脚本的脚本,/root/bin/createsh.sh当执行如/root/bin/createsh.sh  test.sh时,会自动在/root/bin下新建一个名为test.sh的新文件,该文件会自动给上执行权限,同时自动在文件头加上shabang及注释信息,注释信息如下:

#!/bin/bash

# ------------------------------------------

# Filename:    test.sh(此处会根据文件名自动更换)

# Revision:    1.0

# Date:        2017-01-22(此处会自动变换为当前日期)

# Author:      Nanyibo

# Email:       [email protected]

# ------------------------------------------

# Copyright:   2017 nanyibo

# License:     GPL

之后,自动使用vim打开,等待用户开始编写脚本正文。

                                                                                           7,1           Top

#!/bin/bash

#V1~之后考虑完善脚本,使其更加具有交互性


#Problem:如何在自动开启vim后,光标落在新的空行行首???

datenow=$(date +%F)

if [ -z "$1" ];then

  echo "您要准备创建的脚本名称是被您吃了吗?!"

  #此处可以替用户创建以当前日期等组合字符串命名的默认脚本文件~本人懒,请南一博boss看着写吧,嘿嘿嘿!

  exit 1

else

  if [ -f "$1" ];then

    echo "脚本已存在,请创建正确的脚本名称"

    exit 1  #可以自定义error错误返回值,默认使用错误返回1

  else

    #dircurrent=$(pwd)  判断用户当前所在目录,后续判断完善替用户在默认创建指定目录后创建脚本  mkdir -p /app/test ; 

    newname=$(echo "$1" |cut -d'.' -f1)

    touch /app/test_sh/${newname}.sh  #touch本身执行完成是没有返回结果

    autoCrefile=/app/test_sh/${newname}.sh

    chmod 755 ${autoCrefile}

    access=$(echo $?)

    if [ "0" -eq "${access}" ];then

      echo "系统已自动为您生成相应的文件名的脚本,现在将自动生成标准内容"

      echo -e "#!/bin/bash\n#----------------------------------\n#Filename:     ${newname}\n#Revision:  1.0\n#Date:     ${datenow}\n#

Author:    sunxuefeng\n#Email:     [email protected]\n#---------------------------------\n#Copyright:    2018-01-22 sunxuefeng\n#Li

cense:        GPL" > ${autoCrefile}

      echo "脚本以及对应默认格式内容已经填充,请继续编辑脚本文件"

      sleep 1   #为了更好的实现交互,灵活使用睡眠指令,可以将瞬时延缓,

      vim ${autoCrefile}

    else

      echo "脚本创建失败,请检查故障"

    fi

  fi

fi




马哥M28第九天、

根据退出状态而定,命令可以有条件的进行选择执行:

&&  代表条件性的AND  THEN

||  代表条件性的OR   ELSE     比如: 为真0 && echo "成功";exit 0 || (echo "失败";exit 1


test []

-v VAR

    变量VAR是否设置
数值测试:

    -gt 是否大于

    -ge 是否大于等于

   -eq 是否等于

    -ne 是否不等于

    -lt 是否小于

    -le 是否小于等于


练习:

1.编写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数不等于1,则提示用户“应该给一个参数”,并立即退出;如果参数个数等于1,则显示所指向的文件中的空白行数

  #!/bin/bash

    [ $# -ne 1 ] && ( echo "应该给一个参数";exit 1 )

    echo "$(cat $1 |egrep -c "^[[:space:]]*$")"

2.编写脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,如果未给定一个合法的IP地址,则提示 “给一个合法的IPV4地址” ,并立即退出。如果给出IPV4地址,则测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

        echo $1 |egrep -q "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>" && ( ping -c1 -w1 $1 >/dev/null && echo "主机网络畅通" || echo "主机网络不通" ) || echo "输入IP有误,格式:xxx.xxx.xxx.xxx,xxx小于255"


转义:

    '' 和 \ 完全转义 ; 

    ""在以下四种情况不转议:!  \  `  $


a交互式与非交互式登录:

    交互式:访问顺序 /etc/profile --> /etc/profile.d/*.sh -->~/.bash_profile --> ~/.bashrc

    非交互式:访问顺序 ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*sh


srouce 与 . 在当前shell下执行脚本,用来设置环境变量以及别名、函数等

/bin/bash 或路径方式执行脚本,是子shell用执行,可以继承shell的环境变量,但在脚本中设置的任何变量,均不会影响父shell.


if then else fi

    #!/bin/bash

    if [ $# -eq 0 ];then

        echo "请输入用户名"

        exit 1

     fi

     if $(id $1 &>/dev/null);then

        echo "${1} alread exist"

        exit 1

     else

        useradd $1

      fi 

-----------------------------------------

    #!/bin/bash

    if [ $1 -lt 3];then

        echo redhat

    elif [ $1 -eq 3 ];then

        echo "green" 

    elif [ $1 -gt 3 -a $1 -lt 5 ]

        echo yellow

    else

        echo white

    fi 

--------------------------------------------------

    case $1 in

            1)echo redhat;;

            2)echo yellow;;

            3)echo green;;

            *)echo blue;;

     esac     #   case .. in 中的每个分支里都可以使用模式,即可以有多个选项  1 |2 |3 |4)echo ..;;


作业:

  1. 编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满

    #!/bin/bash

    cipan=`df |grep /dev/sd |tr -s " " % |cut -d % -f5 |sort -nr |head -n1`

    inode=`df -i |grep /dev/sd | tr -s " " % |cut -d% -f5 |sort -nr |head -n1`

    #这里暂不使用if进行分情况判断了

    [ ${cipan} -gt 80 -o ${inode} -gt 80 ] && wall "磁盘或INode号超过80%"


2.编写脚本/bin/per.sh ,判断当前用户对指定的参数文件,是否不可读并且不可写

    if [ ! -r $1 ] && [ ! -w $1 ];then

        echo "用户对该文件不可读不可写"

     fi


3.编写脚本/root/bin/excute.sh,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件

    #!/bin/bash

    if [ -f $1 ];then

        if $(echo $1 |grep -qo \.sh$);then

            chmod a+x $1

            echo "成功"

            exit 0

         else

            echo "非脚本文件"

            exit 1

         fi

      else

          echo "文件不存在"    

      fi


4.编写脚本/root/bin/nologin.sh和login.sh,实现禁止和允许普通用户登录系统

    #!/bin/bash

    a=$(id -u $1)

     if [ $a -ge 1000 ];then  #CentOS7中系统用户uid<1000

            usermod -s /bin/bash $1

     else

            echo "系统用户,不可更改"

      fi

#------------------------------------------------------

     #!/bin/bash

     a=$(id -u $1)

     if [ $a -ge 1000 ];then

            usermod -s /sbin/nologin $1

     else

            echo "系统用户,不可禁用"

      fi


5.让所有用户的PATH环境变量的值多出一个路径,例如: /usr/local/apache/bin

    echo "PATH=$PATH:/usr/local/apache/bin" >>/etc/profile.d/path.sh


6.用户root登录时,将命令提示符变成红色,并自动启用如下别名:rm='rm -i'

    PS1="\[\e[31m\][\[email protected]\h \W]\\$\[\e[0m\]"

    alias cdnet='cd /etc/sysconfig/network-scripts/'

    alias editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0'

    alias editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0'


7、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等

   一旦执行reset.sh,会设置以下内容

   创建一个别名为ipconfig功能是显示第一个网卡的IP

   设置提示符为绿色

   设置vim自动显示行号

   设置登录后的欢迎界面(内容自定义)


echo 'alias ipconfig="ifconfig |head -2 |tail -1|tr -s [:blank:] :|cut -d: -f4"' >> ~/.bash_profile

echo 'PS1="\[\e[32m[\[email protected]\h \W]\\$\e[0m\] "' >> ~/.bash_profile

echo "set number" >> /etc/vimrc

echo 自定义欢迎界面 > /etc/motd


重点题目:

8、编写一个创建用户的脚本,要求以下功能 :脚本路径 /app/shell2/

a.提示用户输入希望创建的用户名(当用户超时8秒不输入,提示超时并退出)

b.检测用户名是否已存在,若存在则提示用户名已存在,并退出。

c.用户创建完成后提示用户是否要继续设置密码,若用户输入yes、YES、y、Y时则继续下一步,如输入其他,或超时8秒均退出。

d.接上一步,为用户设置密码,首先提示用户输入要设置的密码,密码的输入过程不可见。

e.对用户上一步所输入的密码进行长度检测,若少于5位(包含5位),则提示用户密码太短,并退出。

f.对用户在第d步所输入的密码进行复杂度检测,若所输入的内容与/usr/share/dict/words 字典中的某一行条目完全一致,则提示密码是一个常见单词,并退出。

g.再一次让用户输入密码,若第二次输入的密码与在第d步输入的不一致,则提示用户两次密码不一致并退出。

h.d至g步骤全部通过后,为用户设置密码后,并提示密码已成功设置。最后正确退出。

以上的所有退出情况应给出不同的返回值。

小记录:过多的设置变量会占用内存,尽可能的减少不必要的变量!
     #!/bin/bash

     #author :    sunxuefeng_magedu

     #date   :    2018-1-25

     for i in {1..3}  #for i in {n..m}  do .. done       for ((i=0;i<=2;i++));do .. done       for i in $(seq 1 3)  do .. done 

      do

            echo 

            read -t 12 -p "请输入您要创建的用户名:" username

            if [ 142 -eq $(echo $?) ];then

                echo -e "输入超时,请重新输入用户名\n"

                continue

            elif [ -z "${username}" ];then

                echo "输入的用户名不能为空!"

                continue

            elif [ 0 -eq $(echo $?) ];then      

                 id ${username} &>/dev/null            

                 if [ 0 -eq $(echo $?) ];then

                     echo -e "用户名已存在,请重新输入其他用户名\n"

                     continue

                 fi

            else

                useradd ${username}

                echo "用户合法,创建成功"

                echo "----------------------------------------------"

                #exit 105 此处可以继续判断一下自定义异常代码字典,创建异常导致失败时抛出

            fi

            break

      done

      read -t 15 -p "是否为新用户设置密码?(y/yes/YES/Yes/yEs,or input other anything to No SET)" a

      case ${a} in 

                y|yes|YES|Yes|yEs) echo "准备为新用户设置密码" ;;

                                *) echo "未设置密码,退出"

                                    exit

                                    ;;

      esac

      for i in $(seq 1 3)

      do

         echo 

         read -t 15 -s -p "请开始设置您的密码并牢记:" pawd

         if [ 142 -eq $(echo $?)];then

            echo "输入密码超时,请重新输入"

            continue

         echo ${pawd} |egrep [[:blamk:]] &>/dev/null

         elif [ 0 -eq $(echo $?)];then

            echo "密码还有空白字符等非法字符,请以数字字母或下划线正确设置"

            contine #自定义

         else

            pwdsize=$(echo ${pawd} |wc -c)

            let pwdsizz=${pwdsizz}-1

            if [ 5 -gt ${pwdsizz} ];then

                echo "密码长度不能少于5位,请重新设置安全密码"

                continue

            else

                read -s -p "Retry agine input your passwd:" rpawd

                if [ "${rpawd}" == "${pawd}" ];then

                    echo "${rpawd}" |passwd --stdin ${username} #同一个脚本下变量是可以引用的,不存在不同循环不可引用的情况

                    if [ 0 -eq $(echo $?) ];then

                        echo "密码设置成功"

                        exit 0

                    else

                        echo "Unknown ERROR,please check it,or retry to set the password agine"

                        exit 105

                    fi

                else

                    echo "前后两次输入的密码不一致,请重新输入正确的密码"

                    continue


                fi    

            fi

         fi

         break

      done


locate  KeyWord  :基于数据库模式的查找  速度快、缺乏实时性

有用的选项

-i 不区分大小写的搜索

-n N  只列举前N个匹配项目

-r(regex)  使用正则表达式


示例

搜索名称或路径中带有"conf"的文件

    locate  conf    搜索时会基于根路径搜索

使用Regex来搜索以".conf"结尾的文件

    locate -r "\.conf$"

数据文件的位置

    /var/lib/mlocate/mlocate.db

更新数据文件方法

    updatedb



马哥教育M28-第十天、


find

指搜索层级

    -maxdepth level 最大搜索深度,指定目录为第一级

    -mindepth level 最小搜索目录深度


根据文件名和Inode查找:

    -name "文件名称" : 支持使用glob(通配)
        find /etc/ -name "*pas?wd*"     *,?,[],[^]

    -iname "文件名称" :不区分字母大小写

        find /etc/ -iname *pas?wd*

    -inum n  按inode号查找

        find -inum 69

    -samefile name 相同inode号的文件

        find -samefile a123

    -links n  链接数为n的文件

        find -links 2

    -regex "PATTERN"  :以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

        find /etc/ -regextype posix-egrep -regex ".*/pa[sa]{2}wd"


根据属主、属组查找:

    -user  USERNAME : 查找属主为指定用户(UID)的文件
    -group GROUPNAME: 查找属组为指定组(GID)的文件

    -uid    UserID :查找属主为指定的UID的文件

    -gid    GroupID :查找数组为指定的GID号的文件

    -nouser  :查找没有属主的文件

    -nogroup : 查找没有属组的文件

        find -user guanyunchang   NO user


根据文件类型查找:

    -type TYPE:

        f:普通文件类型

        d:目录文件

        l:符号链接文件

        s:套接字文件

        b:块设备文件

        c:字符设备文件

        p:管道文件

            find /dev/ -type c


根据文件大小来查找;

    -size [+|-]#unit

        常用单位: k, M,G, c(byte)

    #unit : (#-1,#]

        如:6k,表示 (5k,6k]

    -#unit :[0,#-1]

        如 :-6k, 表示[0,5k]

    +#unit :(#,oo)

        如:+6k, 表示(6k,oo)


根据时间戳

     以天为单位:

        -atime [+|-]#

        # : [#,#+1)

        +# :[#+1,oo]

        -# :[0,#)

        -mtime

        -ctime

      以分钟为单位:

         -amin

         -mmin

         -cmin

    find  /etc/ -mtime -1


根据权限查找:

    -perm [/|-]MODE

    mode : 精确权限匹配

    /mode :任何一类(u,g,o)对象的权限中只要能有一位匹配即可,或关系, +从CentOS7开始淘汰

    -MODE :每一类对象都必须同时拥有指定权限,与关系

        0  表示不关注

find -perm 755   会匹配权限模式恰好是755的文件

只要当任意人有写权限时,find -perm /222就会匹配,当权限描述为组合权限时,各权限之间为或关系

只有当每个人都有写权限时,find -perm -222才会匹配,当权限描述为组和权限时,各权限之间为与关系

只有当各自位置对象满足包含或等于655时,即u至少有读写,g至少有读和可执行,o其他人有读和可执行才会匹配


处理动作:

    -print :默认的处理动作,显示至屏幕

    -ls : 类似于对查找到的文件执行 ls -l

    -delete: 删除查找到的文件

        find -size +6k -delete

    -fls file :查找到的所有文件的长格式信息保存至指定文件中

    -ok -exec   ok是交互式, exec直接运行后面所接的命令

    find -name "*.tmp" -ok rm -f {} \;

    find -type f -name "*.sh" -exec chmod a+x {} \;

    find -name "*.conf" -exec cp -i {} {}.bak \;

    find \( pattern \) 必须注意:小括号里面的表达式必须与小括号有空格才行,特殊符需要加反斜杠


由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令,xargs用于产生某个命令的参数,xargs可以读入stdin的数据,并且以空格符或者回车符将stdin的数据分隔成arguments; 注意:文件名或者是其他意义的名词内含有空格符的情况;有些命令不能接受过多参数,命令执行可能会失败,xargs可以解决

示例:

    ls |xargs  rm

    find /sbin -perm -700 |ls -l 错误,find本身不支持管道符

    find /sbin -perm -700 |xargs ls -1

find和xargs格式:find |xargs COMMAND


练习:

  1. 查找/var目录下属主为root,且属组为Mail的所有文件

    find /var -user root -group mail

  2. 查找 /var 目录下不属于root lp gdm的所有文件

    find /var -not \( -user root -o -user lp -o -user gdm \)

  3. 查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件

    find /var -mtime -7 -not \( -user root -o -user postfix \)

  4. 查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件

    find / -type f -atime -7


压缩

compress

    compress srcfile 将源文件压缩成压缩包,源文件消失

    compress -v srcfile 或compress -v -d dstfile.Z 压缩或解压缩时显示详细信息
    compress -c srcfile > dstfile.Z 将源文件压缩成压缩包,源文件保留

    compress -d dstfile.Z 或uncompress dstfile.Z 将压缩包解压成源文件,压缩包消失

    compress -d -c dstfile.Z > srcfile 或 zcat dstfile.Z > srcfile 将压缩包解压成源文件,压缩包保留


gzip

    gzip srcfile 将源文件压缩成压缩包,源文件消失

    gzip -c srcfile > dstfile.gz 将源文件压缩成压缩包,源文件保留

    gzip -d dstfile.gz 或gunzip dstfile.gz 将压缩包解压成源文件,压缩包消失

    gizp -d -c dstfile.gz > srcfile 或zcat dstfile.gz > srcfile 将压缩包解压成源文件,压缩包保留

    gzip -# srcfile (#即1-9,表示压缩比,数字越大压缩比越高,默认为6)


bzip2

    bzip2 srcfile 将源文件压缩成压缩包,源文件消失

    bzip2 -k srcfile 将源文件压缩成压缩包,源文件保留且权限不变

    bzip2 -c srcfile > dstfile.bz2 将源文件压缩成压缩包,源文件保留但权限根据umask值而改变

    bzip2 -d dstfile.bz2 或bunzip dstfile.bz2 将压缩包解压成源文件,压缩包消失

    bzip2 -k -d dstfile.bz2或bunzip -k dstfile.bz2 将压缩包解压成源文件,压缩包保留且权限不变

    bzip2 -d -c dstfile.bz2 > srcfile 或bunzip -c dstfile.bz2 > srcfile 解压压缩包,压缩包保留但是解压后文件权限根据umask而定

    bzip2 -# srcfile (即1-9,表示压缩比,数字越大压缩比越高,默认为9)

    bzcat dstfile.bz2 可以预览解压后的内容,配合>也能解压,但权限会根据umask值而改变


xz [OPTION]...FILE...

    -k keep,保留源文件

    -d 解压缩

    -# 1-9,压缩比,默认为6

xzcat :不显示解压缩的前提下查看文本文件内容


zip

    zip -r 生成后路径(或压缩包名) 被压缩文件..    可以多个源文件一起 -->打包,可以跨平台

    zip -r config.zip /etc/passwd /etc/group /etc/shadow /etc/gshadow

    unzip config.zip


tar 归档、解档

    tar -tf mage.tar.gz(tgz) 预览压缩包的文件列表

    tar -rf mage.tar /path/newfile 往tar包中增加文件(注意只能对tar包增加文件,而不能对压缩包增加)

    tar -cf mage.tar filename1 filename2 .. 将多个文件打包至mage.tar

    tar -zcf mage.tar.gz mage.tar.gz filename1 filename2 .. 将多个文件打包并用gzip压缩为mage.tar.gz

    tar -jcf mage.tar.bz2 filename1 filename2 filenameN 将多个文件打包并用bzip2压缩为mage.tar.bz2

    tar -Jcf mage.tar.xz filename1 filename2 filenameN 将多个文件打包并用xz压缩为mage.tar.xz

    tar -zxvf mage.tar.gz -C /tmp 解压gz的压缩包到/tmp目录

    tar -zxvf mage.tar.gz 解压gz的压缩包到当前目录并显示详细过程

    tar zcvf mage.tar.gz -T yasuolist.txt -X paichu.txt

        -T 指定需要打包并压缩的文件列表,每个文件路径一行

        -X 指定要排除的文件列表,每个文件一行


split -b 2k -d etc.tgz 4

    将压缩包以2k为单位分割为4份 split -b (size)k -d dst n

cat 40* > mage.tgz 将以40开头命名的多个分割包合并为mage.tgz,如果是文件,则是将多个文件内容追加方式到mage.tgz


cpio

    功能:复制文件从或到归档

    cpio命令是通过重定向的方式将文件进行打包备份、还原恢复的工具,它可以解压以".cpio"或".tar"结尾的文件

    cpio [选项] > 文件名或者设备名

    cpio [选项] < 文件名或者设备名

    选项

        -o 将文件拷贝打包成文件或者将文件输出到设备上

        -i 解包,将打包文件解压或将设备上的备份还原到系统 

        -t 预览,查看文件内容或者输出到设备上的文件内容

        -v 显示打包过程中的文件名称

        -d 解包生成目录,在cpio还原时,自动的建立目录

        -c 一种较新的存储方式



sed  :针对行数据处理,一行一行的顺序读取处理,但默认不对源文件进行更改,输出到终端

    sed -n '1p' passwd 只打印第一行  -n不打印,  1p  打印第一行

    ifconfig eth1 |sed -n '2p'

    seq 100 |sed -n '1~2p' 步进(默认1),只显示奇数行  偶数+1是奇数

    seq 100 |sed -n '2~2p' 步进 ,只显示偶数行  偶数+偶数  偶数

    sed -i.orig 's/dog/cat/gi' pets  备份后再替换  备份文件为xx.orig

    sed '2a\dog cat dog cat cat' pets 在第二行后增加指定内容的新行

    sed '2i\dog cat dog cat cat' pets 在第二行前插入指定内容的新行

    sed '2c\dog cat gog cat cat' pets 替换第二行

    sed '2w /path/filename' pets 将第二行保存到指定文件

    sed '2r /path/filename' pets 将指定文件读取并加到第二行后

    sed '=' pets 在显示的结果前显示行号


echo {1,2,3}[ab]  ->  1[ab]  2[ab]  3[ab]  中括号单独在命令行 或者普通的出现在echo中,不作为任何特殊含义

echo {1,2,3}{a,b}  ->  1a 1b 2a 2b 3a 3b

echo {1,2,3}ab    ->  1ab  2ab  3ab 

















以上是关于马哥M28-第8-10天的学习总结的主要内容,如果未能解决你的问题,请参考以下文章

马哥教育M28-孙雪峰-前四节课学习总结

马哥教育第二十四至二十六天学习总结

马哥教育第20天至23天学习总结

马哥教育M28第十三天到第十五天学习总结

马哥教育第十一天十二天学习总结

马哥教育第三十一天至三十四天学习总结