一、 Vim续写

 1、命令扩展模式的位置定界

  起始位置 cmd 终止位置
   Cmd:
    y复制
    d删除
    Gu变大写
    gu变小写
  例如:0y$命令意味着:
    0 先到行头
    Y 从这里开始拷贝
    $ 拷贝到本行行尾最后一个字符
    Ye 从当前位置拷贝到本单词的最后一个字符

 2、扩展命令模式:地址定界

   # 具体第#行,
   #1,#2 从开头数第#1行到第#2行
   #1,+#2 从开头数的第#1行到从第#1行开始数的第#2行
     例:2,+3 表示第2行到第五行
   . 当前行
   $ 最后一行
   . ,$-1 当前行到倒数第二行
   % 全文,相当于1,$
   /pat1/,/pat2/ 从第一次被pat1 模式匹配的行开始,一直到第一次被pat2匹配的行结束
    #,/pat/ 从第#行到第一次匹配到pat结束
    /pat/,$ 从第一次匹配到pat到最后一行
   使 用方式:后跟一个编辑命令
     d 剪切
     y 复制
     w file 将范围内的行另存至指定文件中
     r file 在指定位置插入指定文件中的所有内容

 3、查找并替换

   s: 在扩展模式下完成替换操作
     地址定界s/要查找的内容/替换为的内容/修饰符
       要查找的内容:可以使用正则表达式
       替换为的内容:不可以使用正则,但可以使用\1,\2调用前面表达式里的分组,还可以使用&引用前面查找时查找到的整个内容
       修饰符:
          i:忽略大小写
         g:全局替换,(默认情况下,每一行只替换第一次出现)
         gc :全局替换,每次替换前询问
        查找替换中的分隔符/可替换为其它字符,例如:
         %s@dog@cat@g 把全文中的dog都替换成cat
         %s#dog#cat#i 把每行第一次出现的dog替换成cat,忽略大小写

 4、Vim的寄存器

       有26个命名寄存器和1个无命名寄存器,常存放不同的剪贴版 内容,可以不同会话间共享
       寄存器名称a,b,…,z,格式:“寄存器 放在数字和命令之间
         如:3"tyy 表示复制3行到t寄存器中
       "tp 表示将t寄存器内容粘贴
       未指定,将使用无命名寄存器
       有10个数字寄存器,用0,1,…,9表示,0存放最近复制内容
       ,1存放最近删除内容。当新的文本变更和删除时,1转存到2
       ,2转存到3,以此类推。数字寄存器不能在不同会话间共享

 5、编辑二进制文件

   1.以二进制方式打开文件
      Vim -b 文件路径
   2.扩展命令模式下,利用xxd命令转换为可读的十六进制
     :%!xxd
     编辑二进制文件
   3.扩展命令模式下,利用xxd命令转换回二进制
        :%!xxd -r
     保存退出

 6、可视化模式

   允许选择的文本块
     v :面向字符
     V :面向行
     Ctrl-v 面向块
   可视化键可用于与移动键结合使用:
     w 选中一个单词
     ) } 选中从当前到文本尾部
     箭头键
   突出显示的文字可被删除,复制,变更,过滤,搜索,替换等

 7、多文件模式

   Vim file1 file2 file3
     :next 下一个
     :prev 前一个
     :first 第一个
     :last 最后一个
     :wall 保存所有
     :qall 退出所有
     :wqall 保存所有并退出

 8、使用多个“窗口”

   1.多文件分隔
     Vim -o|-O file1 file2
        -o:水平分割
        -O:垂直分割
在窗口间切换:Ctrl+w
续写vim,shell脚本基础编辑,read命令,if与case判断语句,文件查找方式,压缩与解压,_第1张图片
   2.单文件窗口分割
     Ctrl+w,s:水平分割
     Ctrl+w,v:垂直分割
     Ctrl+w,q:取消相邻窗口
     Ctrl+w,o:取消全部窗口
     :wqall 保存退出
续写vim,shell脚本基础编辑,read命令,if与case判断语句,文件查找方式,压缩与解压,_第2张图片

 9、定制vim的工作特性

   配置文件:永久有效
    全局:/etc/vimrc
    个人: ~/.vimrc
    扩展模式:当前你vim进程有效

  1. 行号

   Set number 显示行号,简写 set nu
   Set nonumber 取消显示行号 简写 set nonu

  2. 括号成对匹配

   Set showmatch 匹配 简写 set sm
   Set nosm 取消

  3. 自动缩进

   启用:set ai
   禁用:set noai

  4. 高亮搜索

   启用:set hlsearch
   禁用:set nohlsearch

  5. 语法高亮

   启用:syntax on
   禁用:syntax off

  6. 忽略字符的大小写

   启用:set ic
   不忽略:set noic

  7. 文件格式

   启用windows格式:set fileformat=dos
   启用unix格式:set fileformat=unix

  8. 设置文本宽度

   :set textwidth=65 (vim only)
   :set wrapmargin=15

  9.Vim内置帮助

   :help

二、 Shell脚本编程基础

 1、 编程基础

  程序:指令+数据
  程序编程风格:
  过程式:以指令为中心,数据服务于指令
  对象式:以数据为中心,指令服务于数据
  shell程序:提供了编程能力,解释执行

 2、 程序的执行方式

  计算机:运行二进制指令
  编程语言:
   低级:汇编
    高级:
      编译:高级语言-->编译器-->目标代码
         Java,c#
      解释:高级语言-->解释器-->机器代码
          Shell,perl,python

 3、 编程基本概念

  1.编程逻辑处理方式:

    顺序执行
    循环执行
    选择执行

  2.shell编程:过程式、解释执行

  3.编程语言的基本结构:

          各种系统命令的组合
          数据存储:变量、数组
          表达式: a + b
          语句:if

 4、 Shell脚本基础

  shell脚本:
   包含一些命令或声明,并符合一定格式的文本文件
  格式要求:
   首行shebang机制(就是首行要写执行的shell,否则就会使用默认shell来运行该脚本,容易出错,导致脚本执行错误执行)
    #!/bin/bash
    #!/usr/bin/python
    #!/usr/bin/perl
  shell脚本的用途有:
   自动化常用命令
   执行系统管理和故障排除
   创建简单的应用程序
   处理文本或文件

 5、 创建shell脚本

  第一步:使用文本编辑器来创建文本文件
   第一行必须包括shell声明序列:#! #!/bin/bash
   添加注释 注释以#开头
  第二步:运行脚本
   给予执行权限,在命令行上指定脚本的绝对或相对路径
   直接运行解释器,将脚本作为解释器程序的参数运行

 6、 脚本规范

  脚本代码开头约定
   1.第一行一般为调用使用的语言
   2.程序名,避免更改文件名为无法找到正确的文件
   3.版本号
   4.更改后的时间
   5.作者相关信息
   6.该程序的作用,及注意事项
   7.最后是各版本的更新简要说明

 7、 脚本的基本结构

  #!SHEBANG
  CONFIGURATION_VARIABLES
  FUNCTION_DEFINITIONS
  MAIN_CODE

 8、 脚本调试

  检测脚本中的语法错误
   bash -n /path/to/some_script
   调试执行
    bash -x /path/to/some_script

 9、 变量

  1.变量:命名的内存空间

   数据存储方式:
    字符:
    数值:整型,浮点型

  2.变量:变量类型

   作用:
    1、 数据存储格式
    2、 参与的运算
    3、 表示的数据范围
   类型:
    字符
    数值:整数、浮点型

  3. 强类型:变量不经过强制转换,它永远是这个数据类型,不

   允许隐式的类型转换。一般定义变量时必须指定类型、参与
   运算必须符合类型要求;调用未声明变量会产生错误
   如Java,c# 弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;
   变量无须事先定义可直接调用
   如bash 不支持浮点数,php

  4. 变量命名法则

   1、不能使程序中的保留字:例如if, for
   2、只能使用数字、字母及下划线,且不能以数字开头
   3、见名知义
   4、统一命名规则:驼峰命名法

  5.bash中变量的种类

   本地变量:生效范围为当前shell进程;对当前shell之外 的其它shell进程,包括当前shell的子shell进程均无效
   环境变量:生效范围为当前shell进程及其子进程
   局部变量:生效范围为当前shell进程中某代码片断(通常 指函数)
   位置变量:$1, $2, ...来表示,用于让脚本在脚本代码 中调用通过命令行传递给它的参数
   特殊变量:$?, $0, $*, $@, $#,$$

  6.本地变量

   变量赋值:name=‘value‘
   可以直接引用value:
    1、 可以是直接字符串。Name=“root”
    2、 变量引用:name=“$user”
    3、 命令引用:name=·cmd· 或name=$(cmd)
   变量引用:${name} $name
   “”:弱引用,其中的变量引用会被替换为变量值
   ‘’:强引用其中的变量引用不会被替换为变量值,而保持原字符串
   显示已定义的所有变量:set
    删除变量:unset name

  7.环境变量

   变量声明、赋值:
    export name=VALUE
    declare -x name=VALUE
   变量引用:$name,${name}
   显示所有环境变量:
    Env
    Printenv
    Export
    Declare
   删除变量
    Unset name
    bash内建的环境变量
    PATH
    SHELL
    USER
    UID
    HOME
    PWD
    SHLVL
    LANG
    MAIL
    HOSTNAME
    HISTSIZE

  8.只读变量

   只读变量:只能声明,但不能修改和删除
    声明只读变量:
     readonly name
     declare -r name
   查看只读变量:
     readonly –p
   位置变量:在脚本代码中调用通过命令行传递给脚本的参数
    $1, $2, ...:对应第1、第2等参数,shift [n]换位置
    $0: 命令本身
    $: 传递给脚本的所有参数,全部参数合为一个字符串
    $@: 传递给脚本的所有参数,每个参数为独立字符串
    $#: 传递给脚本的参数的个数
    $@ $
只在被双引号包起来的时候才会有差异
    set -- 清空所有位置变量

 10、 退出状态

  进程使用退出状态来报告成功或失败
    0 代表成功,1-255代表失败
  $? 变量保存最近的命令退出状态
  例如:
    Ping 172.28.250.1
    Echo $?

 11、 退出状态码

  Bash自定义退出状态码
  exit [n]:自定义退出状态码
  注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出 状态取决于exit命令后面的数字
  注意:如果未给脚本指定退出状态码,整个脚本的退出状态码 取决于脚本中执行的最后一条命令的状态码

 12、 算术运算

  Bash中的算术运算:help let
   + ,-,*,/,%取模(取余),**(乘方)
  实现算术运算:
   (1) let var=算术表达式
   (2) var=$[算术表达式]
   (3) var=$((算术表达式))
   (4) var=$(expr arg1 arg2 arg3 ...)
   (5) declare –i var = 数值
   (6) echo ‘算术表达式’ | bc
      乘法符号有些场景中需要转义,如*
   Bash有内建的随机数生成器:$RSNDOM(0-32767)
     echo $[$RANDOM%50] :0-49之间随机数

 13、 赋值

  增强型赋值
   +=, -=, *=, /=, %=
  let varOPERvalue
   例如:let count+=3
   自加 3后自赋值
  自增,自减:
    let var+=1
    let var++
    let var -=1
    et var--

 14、逻辑运算

  true, false
   1 ,0
   与:
    1 与 1 = 1
    1 与 0 = 0
    0 与 1 = 0
    0 与 0 = 0
   或:
   1 或 1 = 1
   1 或 0 = 1
   0 或 1 = 1
   0 或 0 = 0
  非:!
    ! 1 = 0
    ! 0 = 1
  短路运算:
   短路与
     第一个为0,结果必定为0
     第一个为1,第二个必须要参与运算
   短路或
     第一个为1,结果必定为1
     第一个为0,第二个必须要参与运算
   异或:^
    异或的两个值,相同为假,不同为真

 15、条件测试

  判断某需求是否满足,需要由测试机制来实现
  专用的测试表达式需要由测试命令辅助完成测试过程
  评估布尔声明,以便用在条件性执行中
   若真,则返回0
   若假,则返回1
  测试命令:
   test EXPRESSION
   [ EXPRESSION ]
   [[ EXPRESSION ]]
注意:表达式前后与中括号之间一定要有一个空格expression的意思是表达式

 16、条件性的执行操作符

  根据退出状态而定,命令可以有条件地运行
   && 代表条件性的AND THEN(与)
    || 代表条件性的OR ELSE(或)
  例如:
    Grep -q dog /app/cc && echo 成功
    Ping -c1 -W2 172.18.0.1 &> /dev/null && echo ping通了

 17、test命令

  长格式的例子:
   test "$A" == "$B" && echo "Strings are equal"
    若A=B ,则输出strings are equal
    test “$A” -eq “$B” && echo "Integers are equal"
     若A不等于B,则输出integers are equal
   简写格式的例子:
    [ "$A" == "$B" ] && echo "Strings are equal"
    [ "$A" -eq "$B" ] && echo "Integers are equal"

 18、bash的数值测试

  -v VAR
   变量VAR 是否存在
  数值测试:
   -gt 是否大于
   -ge 是否大于等于
   -eq 是否等于
   -ne 是否不等于
   -lt 是否小于
   -le 是否小于等于
  字符串测试:
   == 是否等于
   > ascii码是否大于ascii码
   < 是否小于
   != 是否不等于
    =~ 左侧字符串是否能够被右侧的PATTERN所匹配
     注意: 此表达式一般用于[[ ]]中;扩展的正则表达式
   -z "STRING“ 字符串是否为空,空为真,不空为假
   -n "STRING“ 字符串是否不空,不空为真,空为假
    (注意:用于字符串比较时的用到的操作数都应该使用引号)

 19、bash的文件测试(下列FILE均代表文件路径)

  存在性测试
    -a FILE:同-e
    -e FILE: 文件存在性测试,存在为真,否则为假
  存在性及类别测试
   -b FILE:是否存在且为块设备文件
   -c FILE:是否存在且为字符设备文件
   -d FILE:是否存在且为目录文件
   -f FILE:是否存在且为普通文件
   -h FILE 或 -L FILE:存在且为符号链接文件
   -p FILE:是否存在且为命名管道文件
   -S FILE:是否存在且为套接字文件
  文件权限测试
    -r FILE:是否存在且可读
   -w FILE: 是否存在且可写
   -x FILE: 是否存在且可执行
  文件特殊权限测试:
   -u FILE:是否存在且拥有suid权限
   -g FILE:是否存在且拥有sgid权限
   -k FILE:是否存在且拥有sticky权限
  文件大小测试:
    -s FILE:是否存在且非空
  文件是否打开:
   -t fd: fd表示文件描述符是否已经打开且与某终端相关
   -N FILE:文件自动上一次被读取之后是否被修改过
   -O FILE:当前有效用户是否为文件属主
   -G FILE:当前有效用户是否为文件属组
  双目测试:
   FILE1 -ef FILE2: FILE1与FILE2是否指向同一个设 备上的相同inode
   FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
   FILE1 -ot FILE2: FILE1是否旧于FILE2

 20、bash的组合测试条件

  第一种方式:
   COMMAND1 && COMMAND2 并且
   COMMAND1 || COMMAND2 或者
   ! COMMAND 非
    如:[[ -r FILE ]] && [[ -w FILE ]]
   第二种方式:
   EXPRESSION1 -a EXPRESSION2 并且
   EXPRESSION1 -o EXPRESSION2 或者
   ! EXPRESSION
    必须使用测试命令进行
   示例:
    [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

三、使用read命令来接受输入

 使用read来把输入值分配给一个或多个shell变量
  -p 指定要显示的提示
  -s 静默输入,一般用于密码
  -n N 指定输入的字符长度N
  -d ‘字符’ 输入结束符
  -t N TIMEOUT为N秒
  read 从标准输入中读取值,给每个单词分配一个变量
  所有剩余单词都被分配给最后一个变量
  read -p “Enter a filename: “ FILE

四、BASH

 1、bash如何展开命令行

  把命令行分成单个命令词
  展开别名
  展开大括号的声明({})
  展开波浪符声明(~)
  命令替换$() 和 ``)
  再次把命令行分成命令词
  展开文件通配(* 、?、[abc]等等)
  准备I/0重导向()
  运行命令

 2、bash防止扩展

  1.反斜线(\)会使后面的特殊符号字符依然以字符串的形式输出,而不是输出特殊的含义,例如$可以用来调用变量的值,在前面加\则只输出$,而不会调用后面字符的变量值,但是一个\只能转义一个字符
    $ echo Your cost: \$5.00
   Your cost: $5.00
  2.加引号来防止扩展
   单引号(’’)防止单引号内的所有字符的扩展
   双引号(””)也防止所有扩展,但以下情况例外:
     $(美元符号) - 变量扩展
     `(反引号) - 命令替换
     \(反斜线) - 禁止单个字符扩展
     !(叹号) - 历史命令替换

 3、bash的配置文件

   Bash的配置文件会在每次用户登录时被系统读取,全局配置下的文件,所有用户通用,个人家目录下的配置文件则是用户自己的一些个性化配置
  按生效范围划分,存在两类:
   全局配置:
     /etc/profile
     /etc/profile.d/*.sh
     /etc/bashrc
   个人配置:
     ~/.bash_profile
    ~/.bashrc

 4、shell登录两种方式

  1.交互式登录:

   (1) 直接通过终端输入账号密码登录
   (2) 使用“su - UserName” 切换的用户
    交互式登录读取配置文件的顺序:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

  2.非交互式登录:

   (1)su UserName
   (2)图形界面下打开的终端
   (3)执行脚本
   (4)任何其它的bash实例
    执行顺序:~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

 5、登录时配置文件的分类与作用

  1.按功能划分,存在两类

   Profile类和bashrc类
    Profile类:为交互式登录的shell提供配置
     全局:/etc/profile, /etc/profile.d/*.sh
      个人:~/.bash_profile
     功用:
      (1) 用于定义环境变量
      (2) 运行命令或脚本
     Bashrc类:为非交互式和交互式登录的shell提供配置
     全局:/etc/bashrc
     个人:~/.bashrc
     功用:
      (1) 定义命令别名和函数
      (2) 定义本地变量

 6、编辑配置文件生效

  修改profile和bashrc文件后需生效
  两种方法:
   1.重新启动shell进程
   2 . 或source
     Source与 . 在当前shell下执行脚本,用来设置环境变量及别名,函数等
     /bin/bash或路径方式执行脚本使子shell在执行,子shell可以继承父shell的环境变量,但在脚本中设置的变量,均不会影响父shell

 7、bash退出任务

  保存在~/.bash_logout文件中(用户)
  在退出登录shell时运行
  用于
   创建自动备份
   清除临时文件

 8、$-变量

  h:hashall,打开这个选项后,Shell 会将命令所在的路径 hash下来,避免每次都要查询。通过set +h将h选项关闭
  i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,在脚本中,i选项 是关闭的。
  m:monitor,打开监控模式,就可以通过Job control来控制 进程的停止、继续,后台或者前台执行等。
  B:braceexpand,大括号扩展
  H:history,H选项打开,可以展开历史列表中的命令,可以 通过!感叹号来完成,例如“!!”返回上最近的一个历史命令, “!n”返回第 n 个历史命令

五、判断语句

 1、单if语句

  语法格式:
    if 条件 ;then
     命令块1(可以是多个命令)
    else
    命令块2(可以是多个命令)
    Fi
如果符合该条件,则执行命令块1处的命令不执行命令块2处的命令,如果条件不符合,则跳过命令块1处的命令不执行,直接执行命令块2处的命令,条件多为一个判断命令,返回值为0(true)执行命令块1,返回值为1(false)执行命令块2
  例如:
    if $(id $1 &> /dev/null);then
     echo "$1 alread exist"
     exit 1
   else
    useradd $1
   fi

 2、多if语句

  语法格式:
    If 条件1 ;then
     命令块1
    Elif 条件2 ;then
     命令块2
    Elif 条件3;then
     命令块3
   ……
    Elif 条件n;then
     命令块n
    Else
     命令块n+1
    If
执行顺序是,先判断条件1,返回值为true则执行命令块1,然后退出if语句
如果条件1,返回值为false,则继续判断条件2,返回值为true,则执行命令块2,然后退出if语句,若条件2 返回值为false,则继续判断条件3……,如果所有条件返回 值都为false,则执行else后面的命令块n+1,然后退出if语句
   例如:
    #!/bin/bash
    if [ $1 -lt 3 ];then
     echo redhat
   elif [ $1 -eq 3 ];then
    echo green
   elif [ $1 -gt 3 -a $1 -lt 5 ];then
     echo yellow
   else
     echo white
   fi

 3、case语句

   Case 变量 in
    变量值1)命令块1;;
    变量值2)命令块2;;
    变量值4)命令块3;;
    变量值n)命令块n;;
   Esac
执行顺序是,先调用一个变量,然后判断变量值是否符合变量值1,如果相等,则执行命令块1,如果不符合则判断变量值2,……一直到变量值n,如果都不符合则 一条命令都不执行
  例如:
   case $1 in
    1)echo redhat;;
    2)echo yellow;;
    3)echo green;;
     *)echo blue;;
    Esac

六、 文件查找

  在文件系统上查找符合条件的文件
  文件查找:locate 和find
  非实时查找(数据库查找):locate
  实时查找:find

 1、 locate查找

  1.查询系统上预建的文件索引数据库

   /var/lib/mlocate/mlocate.db

  2. 依赖于事先构建的索引

   索引的构建是在系统较为空闲时自动进行(周期性任务),管理 员手动更新数据库(updatedb)

  3. 索引构建过程需要遍历整个根文件系统,极消耗资源

  4.工作特点:

   查找速度快
   模糊查找
   非实时查找
   搜索的是文件的全路径,不仅仅是文件名
   可能只搜索用户具备读取和执行权限的目录

  5.locate命令的使用方法

    Locate 选项word
    -i 不区分大小写的搜索
    -n N 只列举前N个匹配项目
    -r 正则 使用正则表达式来进行模糊查找
    例:
    Locate conf:搜索名称或路径中带有conf的文件
    Locate -r ‘\.conf$’ :使用正则表达式来搜索以“.conf”结尾的文件

 2、 find实时查找工具

  1. 实时查找工具,通过遍历指定路径完成文件查找

  2. 工作特点:

   查找速度略慢
   精确查找
   实时查找
   可能只搜索用户具备读取和执行权限的目录

  3. 语法

   Find [选项] 参数 [查找路径] [查找条件] [处理动作]
    查找路径:指定具体目标路径;默认为当前目录
    查找条件:指定的查找标准,可以文件名、大小、类型、 权限等标准进行;默认为找出指定路径下的所有文件
    处理动作:对符合条件的文件做操作,默认输出至屏幕

  4. 查找条件

   1、指搜索层级

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

   2、 根据文件名和inode查找:

     -name “文件名称”:支持使用glob
      *, ?, [], [^]
     -iname "文件名称":不区分字母大小写
     -inum n 按inode号查找
     -samefile name 相同inode号的文件
     -links n 链接数为n的文件
     -regex "PATTERN":以PATTERN匹配整个文件路径字 符串,而不仅仅是文件名称
    例:
     find -name snow.png 搜索名为snow.png的文件
     find -iname snow.png 不分大小写地搜索名为snow.png、Snow.png、 SNOW.PNG等等的文件
     find / -name “.txt” 搜索/下文件名以.txt结尾的文件
     find /var –name “
log*” 在/var目录下搜索名字里包含log的文件

   3、 根据属主、属组查找:

     -user USERNAME:查找属主为指定用户(UID)的文件
     -group GRPNAME: 查找属组为指定组(GID)的文件
     -uid UserID:查找属主为指定的UID号的文件
     -gid GroupID:查找属组为指定的GID号的文件
     -nouser:查找没有属主的文件
     -nogroup:查找没有属组的文件
     例:
      find -user joe -group joe 搜索被用户joe 以及组群joe所拥有的文件
      find / -user joe -o -uid 500 在/目录下搜索属主为joe或属主的uid为500的文件

   4、根据文件类型查找

     -type type(对应以下类型):
      f: 普通文件
      d: 目录文件
      l: 符号链接文件
      s:套接字文件
      b: 块设备文件
      c: 字符设备文件
      p: 管道文件
      例:
       find / -name shell -type f 搜索/目录下所有文件名为shell的普通文件

   5、组合条件:

    与:-a
    或:-o
    非:-not, !
    德·摩根定律:
     (非 A) 或 (非 B) = 非(A 且 B)
     (非 A) 且 (非 B) = 非(A 或 B)
    例:
     !A -a !B = !(A -o B)
     !A -o !B = !(A -a B)
    示例:
      find -user joe -not -group joe 在当前目录下搜索属主是Joe但属组不是joe的所有文件及目录
      find -user joe -o -user jane 在当前目录下搜索属主是joe或jane的所有文件及目录
      find -not \( -user joe -o -user jane \) 搜索当前目录下属主既不是joe也不是Jane的所有文件及目录
      找出/tmp目录下,属主不是root,且文件名不以f开头的文件
       find /tmp \( -not -user root -a -not -name 'f*' \) -ls
       find /tmp -not \( -user root -o -name 'f*' \) –ls

   6、排除目录

    示例:查找/etc/下,除/etc/sane.d目录的其它所有.conf后 缀的文件
     find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf”
     find /etc (–path ‘/etc/sane.d’ –o –path ’/etc/fonts’ \) -a prune –o name “*.conf”

   7、根据文件大小来查找

    -size [+|-]#UNIT
     常用单位:K,M,G c(byte)
    #UNIT: (#-1, #] (#:数字;unit:单位)
     如:6k 表示(5k,6k]
    -#UNIT:[0,#-1]
     如:-6k 表示[0,5k]
    +#UNIT:(#,∞)
     如:+6k 表示(6k,∞)

   8、根据时间戳:

    以“天”为单位
      -atime e [+|-]#,
     #: [#,#+1)
     +#: [#+1, ∞ ]
     -#: [0,#)
     -mtime
     -ctime
     以“分钟”为单位
     -amin
     -mmin
     -cmin

   8、根据权限查找:

    -perm [/|-]MODE
     MODE: 精确权限匹配
     /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配 即可,或关系,+ 从centos7开始淘汰
     -MODE:每一类对象都必须同时拥有指定权限,与关系
     0 表示不关注
     find -perm 755 会匹配权限模式恰好是755的文件
     只要当任意人有写权限时,find -perm +222就会匹配
     只有当每个人都有写权限时,find -perm -222才会匹配
     只有当其它人(other)有写权限时,find -perm -002才 会匹配

  5.处理动作

    -print:默认的处理动作,显示至屏幕
    -ls:类似于对查找到的文件执行“ls -l”命令
    -delete:删除查找到的文件
    -fls file:查找到的所有文件的长格式信息保存至指定文件中
    -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND 指定的命令,对于每个文件执行命令之前,都会交互式要求 用户确认
    -exec COMMAND {} \; 对查找到的每个文件执行由 COMMAND指定的命令
      {}: 用于引用查找到的文件名称自身。{}与\之间必须有一个空格
   find传递查找到的文件至后面指定的命令时,查找到所有符合 条件的文件一次性传递给后面的命令
    例:find -type f -name ".sh" -exec chmod a+x {} \
       在当前文件下查找出以.sh结尾的所有文件,并给她们加上执行权限
      find -name "
.conf" -exec cp -i {} {}.bak \;
       备份所有以conf结尾的所有文件并改名添加.bak这个扩展名

  6.参数替换xargs

    由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所有就有了xargs命令,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为arguments
    注意:文件名或者是其他意义的名词内含有空格符的情况
    有些命令不能接受过多参数,命令执行可能会失败,xargs可 以解决
    示例:
     ls f\* |xargs rm
     find /sbin -perm +700 |ls -l 这个命令是错误的
     find /sbin -perm +7000 | xargs ls –l
     find和xargs格式:find | xargs COMMAND

  7.find示例:

     find -name “\.conf” -exec cp {} {}.orig \;
     备份配置文件,添加.orig这个扩展名
     find /tmp -ctime +3 -user joe -ok rm {} \;
     提示删除存在时间超过3天以上的joe的临时文件
     find ~ -perm -002 -exec chmod o-w {} \;
     在你的主目录中寻找可被其它用户写入的文件
    find /data –type f -perm 644 -name “\
.sh” –exec chmod 755 {} \;
    find /home –type d -ls

七、 压缩、解压缩及归档工具

   compress/uncompress: .Z
   gzip/gunzip: .gz
   bzip2/bunzip2: .bz2
   xz/unxz: .xz
   zip/unzip
   tar
   cpio

 1、 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 将压缩包解压成源文件,压缩包保留

 2、 Gzip压缩工具

  gzip srcfile 将源文件压缩成压缩包,源文件消失
  gzip -c srcfile > dstfile.gz 将源文件压缩成压缩包,源文件保留
  gzip -d dstfile.gz 或gunzip dstfile.gz 将压缩包解压成源文件,压缩包消失
  gzip -d -c dstfile.gz > srcfile 或 zcat dstfile.gz > srcfile 将压缩包解压成源文件,压缩包保留
  gzip -# srcfile (#即1-9,表示压缩比,数字越大压缩比越高,默认为6)

 3、 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值而改变

 4、 Xz压缩工具

  Xz [option] ……file ……
   -k: keep, 保留原文件
   -d:解压缩
   -#:1-9,压缩比,默认为6
   xzcat: 不显式解压缩的前提下查看文本文件内容

 5、 Zip打包压缩工具

  zip -r dstfile.zip srcfile 打包srcfile并压缩成dstfile
  zip scrfile 压缩srcfile文件,源文件不存在
  zip -r config.zip /etc/passwd /etc/group /etc/shadow /etc/gshadow 打包压缩多个源文件,源文件以空格相隔
  cat /var/log/messages | zip messages – 把/var/log/messages里面的内容压缩给当前目录下的messages,源文件依旧存在
  unzip config.zip 解包解压缩 压缩包不存在
  unzip -p conf.zip > config1 解压config.zip里的内容到config1,压缩文件依旧存在

 6、 Tar工具

  tar -tf mage.tar.xz 预览压缩包的文件列表
  tar -rf mage.tar /path/newfile 往tar包中增强文件(注意只能对tar包增加文件,而不能对压缩包增加)
  tar -cf mage.tar filename1 filename2 [filenameN] 将多个文件打包至mage.tar
  tar -zcf mage.tar.gz filename1 filename2 [filenameN] 将多个文件打包并用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 -xf mage.tar 解压tar包的所有文件到当前目录
  tar -xf mage.tar.xz filename 仅将压缩包中的其中一个文件filename解压到当前目录
  tar -zxf mage.tar.gz 解压gz的压缩包到当前目录
  tar -jxf mage.tar.bz2 解压bzip2的压缩包到当前目录
  tar -Jxf mage.tar.xz 解压xz的压缩包到当前目录
  tar -zxf mage.tar.gz -C /tmp 解压gz的压缩包到/tmp目录
  tar -zvxf mage.tar.gz 解压gz的压缩包到当前目录并显示详细过程
  tar zcvf mage.tar.gz -T yasuolist.txt -X paichu.txt
   -T 指定需要打包并压缩的文件列表,每个文件路径一行
   -X 指定要排除的文件列表,每个文件一行

 7、 分割合并压缩包

  split -b 2K -d etc.tgz 4 将压缩包以2K为单位分割为4份
  cat 40* > mage.tgz 将以40开头命名的多个分割包合并为mage.tgz

 8、 Cpio

  复制 从或到文件
  cpio命令是通过重定向的方式将文件进行打包备份,还原恢复 的工具,它可以解压以“.cpio”或者“.tar”结尾的文件。
  cpio [选项] > 文件名或者设备名 :
  cpio [选项] < 文件名或者设备名
选项
  -o 将文件拷贝打包成文件或者将文件输出到设备上
  -i 解包,将打包文件解压或将设备上的备份还原到系统
  -t 预览,查看文件内容或者输出到设备上的文件内容
  -v 显示打包过程中的文件名称。
  -d 解包生成目录,在cpio还原时,自动的建立目录
  -c 一种较新的存储方式
   例:
    将etc目录备份:
    find ./etc -print |cpio -ov >etc.cpio
   内容预览
    cpio –tv < etc.cpio
   要解包文件
    cpio –idv < etc.cpio

七、 文本处理sed

  Stream EDitor, 行编辑器
  sed是一种流编辑器,它一次处理一行内容。处理时,把当前 处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后 ,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循 环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间 清空模式空间,但不会清空保留空间。这样不断重复,直到 文件末尾。文件内容并没有改变,除非你使用重定向存储输 出。

 1、功能:

  主要用来自动编辑一个或多个文件,简化对文件的反复 操作,编写转换程序等

 2、用法

  sed [option]... 'script' inputfile...
   常用选项
    -n:不输出模式空间内容到屏幕,即不自动打印
    -e: 多点编辑
    -f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
    -r: 支持使用扩展正则表达式
    -i.bak: 备份文件并原处编辑
    Script:
    Script ‘地址 编辑命令’,与vim的扩展命令行里面的一些格式有些相似
    地址定界:
     (1) 不给地址:对全文进行处理
     (2) 单地址:
      #: 指定的行
      /pattern/:被此处模式所能够匹配到的每一行
     (3) 地址范围:
      #1,#2 从第#1行到第#2行
      #1,+#2 从第#1行开始,到从第#1行数#2行结束
      /pat1/,/pat2/ 从第一次匹配到pat1至第一次匹配到pat2
      #,/pat1/ 从第#行开始至第一次匹配到path1为止
     (4) ~:步进 1~2 奇数行 2~2 偶数行
    编辑命令:
      d: 删除模式空间匹配的行,并立即启用下一轮循环
     p:打印当前模式空间内容,追加到默认输出之后
     a [\]text:在指定行后面追加文本 支持使用\n实现多行追加
     i [\]text:在行前面插入文本
     c [\]text:替换行为单行或多行文本
     w /path/somefile: 保存模式匹配的行至指定文件
     r /path/somefile:读取指定文件的文本至模式空间中 匹配到的行后
     =: 为模式空间中的行打印行号
     !:模式空间中匹配行取反处理
     s///:查找替换,支持使用其它分隔符 s@@@,s###
     替换标记
      g: 行内全局替换
      p: 显示替换成功的行
      w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

 3、 示例:

  Sed -n ‘2p’ cc 只显示第2行
  sed -n '1,4p' cc 显示1到4行
  sed -n '1,+2p' cc 显示1至3行
  sed -n '/root/p' cc 显示匹配到root的行
  sed -n '2,/root/p' cc 显示从第二行,至第一个次匹配到root的行
  sed -n '/^$/=' cc 显示空行的行号
  sed -n -e '/root/p' -e '/cat/=' cc 显示匹配到root的行以及匹配到cat的行号
  sed ‘/root/i\superman’ /etc/passwd 在所有匹配到root的行前插入superman
  sed ‘/root/c\superman’ /etc/passwd 代替行
  sed ‘/root/a\superman’ /etc/passwd行后