39.运维2-文件与三剑客基础

20.文件权限--文件权限:

1.文件属性信息详细说明--文件权限
1) 文件数据权限有什么:
       r read  		--- 读权限   4
       w write 		--- 写权限   2
       x execute 	--- 执行权限 1
	   -            --- 没有权限 0
2) 权限赋予到指定人
       属主信息  文件所有者(监护人)  	权限 
       属组信息  文件所有者(亲人)    	 权限 
       其他用户  隔壁老王               权限	   
 
    这个文件权限是644权限:
	属主            属组     其他用户 
	r(4)w(2)-(0)=6  r(4)--=4 r(4)--=4
	
	练习:
	rwx -- 7 
	rw--w---x  621
	rwx-wx---  730
	432        r---wx-w-
2.文件属性信息详细说明---用户信息(属主 属组)
	1) 系统中用户信息有什么用
       a 利用用户登录系统
       b 利用用户管理数据  # 比如复制移动修改删除
       c 利用用户管理进程	# 杀死进程  
	2) 系统如何识别不同的用户
	   利用用户的数值编号进行识别: uid
	   [root@oldboyedu ~]# id root
       uid=0(root) gid=0(root) groups=0(root)
       [root@oldboyedu ~]# id oldboy
       uid=1000(oldboy) gid=1000(oldboy) groups=1000(oldboy)
	3) 用户组的概念:  # 通过一个组来为多个用户赋予同样的权限
	   oldboy oldgirl olddog(一个组)  -sa(system admin)    /sa  --rwx 
	   boy gril dog(一个组)           -dev(Development)    /dev --rwx  
       alex old (一个组)              -dba(database admin) /dba --rwx
	   
	   用户和用户组的关系:
	   用户    		-- 用户组 		1v1
	   多个用户 	-- 用户组 		多v1
	   用户         -- 多个用户组 	1v多
	   系统识别用户组也是根据编号识别: gid
	   
	   [root@oldboyedu ~]# id root
       uid=0(root) gid=0(root) groups=0(root)
	      01          02           03
	   01. 显示用户名和uid对应关系
	   02. 显示属于的用户组,以及组名和gid对应关系
	   03. 用户可能属于哪些组
   
    4) 用户进行分类
	   a 超级管理员用户 	皇帝   root
         uid信息进行区分: 0	  
         从权限上区分:    至高无上		 
	   b 虚拟用户   		傀儡   xxx     nobody
	     uid信息进行区分: 1-999  centos7
		 从权限上区分:    管理进程  不能登录系统/没有家目录
	   c 普通用户       	平民   oldboy oldgirl
	     uid信息进行区分: 1000+  centos7
		 从权限上区分:    管理指定数据 可以管理指定进程 可以登录系统/有家目录
		
        centos6: 虚拟用户1-499 普通用户从500-65535 root 0
        centos7: 虚拟用户1-999 普通用户从1000-65535  root 0
            
	   如何保护好皇帝:
       01. 修改远程连接端口-52113 	--- 修改/etc/ssh/sshd_config
       02. 禁止root用户远程登录   	--- 修改/etc/ssh/sshd_config	
       
	   root --- 密码破解
	   1. 系统中有什么普通用户?
	   2. 普通用户密码?
	   3. su - root root用户密码
 	   
	   满足什么条件可以以root身份登录系统:
	   01. 服务器地址信息  14.215.177.38
	   02. 服务器端口信息  22      # 只能改端口  /etc/ssh/sshd_config port值
	   03. 登录用户信息    root 
	   04. 登录用户的密码  rsdasd  暴力破解 
	
	   理工大学: 
	   01. 这个网站还没有被攻击下来
	   02. 网站已经被攻击了,但没被发现
        
3. 文件属性信息详细说明---inode 
    inode: 索引节点
	文件或数据在磁盘中保存位置  # 地址,以及关于文件属性信息
	
    block: 索引节点指向的位置   # 地址对应的内容
    文件或数据的具体内容

    读取数据的原理
    01. 找到指定数据
    02. 读取数据内容,先获取文件数据inode信息
    03. 根据inode信息在磁盘上找到对应block
    04. 根据block信息获取文件真正内容
    
4.文件属性信息详细说明--时间信息(改变时间)
	[root@lala ~]# stat a.txt 
    File: 'a.txt'
    Device: fd00h/64768d	Inode: 11465360    Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2020-05-05 15:54:46.434422719 +0800
    Modify: 2020-05-04 22:21:34.905060738 +0800
    Change: 2020-05-04 22:21:34.908060738 +0800
    文件数据时间类型:
    01. 访问时间  Access time == atime 
    02. 修改时间  Modify time == mtime 
    03. 改变时间  Change time == ctime  --- 数据属性信息(大小权限)发生改变了
    
5.内容回顾
	1) find命令使用方法
	   a 根据文件名称类型进行查找
	   b 根据文件大小进行查找     -size +1M/-1M/1M
	   c 根据目录层级查找文件     -maxdepth 1 -mindepth
       d 根据文件权限查找数据     -perm
	     [root@oldboyedu oldboy]# find /oldboy -maxdepth 1 -type f -perm 644
     2) tar命令压缩数据
	   如何压缩数据:
	   tar zcvf /tmp/oldboy.tar.gz  /etc/ /oldboy/ /oldboy/oldboy.txt 
	   如何解压数据:
	   tar xf /tmp/oldboy.tar.gz -C /oldboy  # -C 指定解压目录
	   如何查看压缩包:
	   tar tf /tmp/oldboy.tar.gz  # t=list
       排除文件方法:
	   --exclude  一个,路径类型必须相同(绝对/相对)
	   --exclude-from 多个,从文件读取
	   
	3) 文件属性信息 -- 权限信息
	4) 文件属性信息 -- 用户信息 (超级用户 虚拟用户 普通用户)
	5) 文件属性信息 -- 时间信息 (atime mtime ctime)
    
     补充:
        ctrl + r:
        快读搜索历史命令
        xargs:
        [root@lala ~/dockerfile/n1]# xargs -n 3 < a.txt
        ./text1.txt ./text2.txt ./text3.txt
        ./text4.txt ./text5.txt ./text6.txt
        ./a.txt
     作业:
        1.如何将一个目录所有.txt查找出来并压缩?
        find /temp -type f -name "*.txt" | xargs tar -zcvf  /temp/txt.tar.gz \;
        tar -zcvf  /temp/txt.tar.gz `find /temp -type f -name "*.txt"`
        2.如何将一个目录所有.txt查找出来并删除?
        find /temp -type f -name "*.txt" -delete
        find /temp -type -f -name "*.txt" -exec rm -rf {} \; # \代表转义 ;代表多个命令分隔
        find /temp -type f -name "*.txt" | xargs rm -rf  # xrags将多行变成一行
        rm -rf `find /temp -type f -name '*.txt'`
        3.如何将一个目录所有.txt查找出来并移动到/temp目录?
		find /temp -type f -name "*.txt" -exec cp {} /temp \;
        4.centos6中如何使用uid区分不同的用户类型?
        root 0  虚拟用户 1-499 普通用户 500-65535

21.文件属性信息--inode:

1.inode
	找索引节点
	 一份努力 一份收获 
	 
	 inode -- 索引节点
     概述:
     相当于书目录	
     用于存储文件属性信息
     诞生出来:
     创建文件系统之后就有了相应的inode
	 
	 磁盘操作处理过程:     地皮
	 磁盘       		   地皮
	 raid       		 将多块地连接起来
	 分区       		   将地皮进行规划
	 格式化     		  地皮进行打扫整理
     创建文件系统    	     建房风格	        inode和block
	 挂载                 安装门
        
	 特点说明:
   	 inode用于存放的是文件属性
     inode用于存放块的指针位置 ???
     创建一个文件至少占用一个inode和一个block
     在同一分区中,两个文件的inode号码相同,两个文件互为硬链接 ???
	 查看方法:
	 [root@oldboyedu oldboy]# df -i
     Filesystem       Inodes IUsed    IFree IUse% Mounted on
     /dev/sda3      25587200 61342 25525858    1% /	 
    
2.block
	 block -- 数据块
     概述:
     目录指向的内容
	 用于存储文件具体内容
     诞生出来:
     创建文件系统之后
    
     特点说明:
     block用于存放的是数据信息
     block默认大小为4k,可以进行调整
	 比较大的文件,会占用多个block
	 比较小的文件,剩余空间无法使用, 浪费磁盘空间
     创建一个文件至少占用一个inode和一个block(非空文件)
     磁盘读取数据按block为单位读取的
     读取一个block会消耗一次磁盘I/O(input/output 磁盘读写)	 
	 
	 # 企业中面试: 你都做过哪些系统优化操作?
     问题: block默认大小可以调整 是大点好 小点好(block越多io消耗越大)
     设置大点: 10k 视频公司 图片公司
     文件大的时候: 20K 4k -- 2个block 2s(处理一个block2s) 4s(block变大之后还是2s)   --- 节省IO消耗
        
     设置小点: 2k 互联网公司
     小文件的时候: 1k 2k  -- 1个block         --- 提高磁盘利用率 
	 查看方法:
     [root@oldboyedu oldboy]# df
     Filesystem     1K-blocks    Used Available Use% Mounted on
     /dev/sda3       51149416 1752080  49397336   4% /

     补充:
	 01. 文件属性信息存储在inode中
	 02. 文件的名称信息存储在上一级目录的block中
        
     作业:
        1.如何查看系统的block?
        [root@lala ~/dockerfile/n1]# stat /boot/ |grep 'IO Block'
  		Size: 4096      	Blocks: 8          IO Block: 4096   directory
        2.如何修改系统的block?
        https://blog.csdn.net/Freshair_x/article/details/80169121
        3. 如何修改磁盘中block大小 如何进行查看默认的block大小?
        4. 总结数据存储与读取原理	 ?
        5. 磁盘满无法存储数据的原因	?
        6. linux系统中读取数据的原理(数据无法读取-权限阻止)  权限章节?
            /oldboy/oldboy01/oldboy.txt
        7. 总结英文月份信息 星期信息?
        8. 如何将文件彻底删除?
        	1.硬链接数为零
            2.确保没有进程占用文件

22.文件属性--连接:

1.硬链接
	硬链接:
    概念说明: 超市的多个门 ???  在一个分区中,inode号码相同的文件,互为硬链接
	诞生过程:
    ln	链接的源文件    硬链接的文件信息
	[root@oldboyedu oldboy]# ln /oldboy/oldboy.txt /oldboy/oldboy_hard_link.txt 
    [root@oldboyedu oldboy]# ll
    total 8
    -rw-r--r--. 2 root root 13 Apr 16 10:49 oldboy_hard_link.txt
    -rw-r--r--. 2 root root 13 Apr 16 10:49 oldboy.txt
	
	利用find命令找到有多硬链接文件
	[root@oldboyedu oldboy]# find / -type f -inum 33584339 
    /etc/hosts
    /tmp/hosts
    # 系统中的目录不能创建硬链接
	
    统计目录下子目录数
	[root@oldboyedu ~]# ll /etc/|grep -c "^d"   
    78
    [root@oldboyedu ~]# ll /etc/|grep  "^d"|wc -l
    78

2.软连接
	概念说明: 文件的快捷方式
    诞生过程: 建议使用绝对路径创建
    ln -s 链接的源文件  软链接的文件信息
	
	[root@oldboyedu oldboy]# ln -s /oldboy/oldboy.txt /oldboy/oldboy_soft_link.txt 
    [root@oldboyedu oldboy]# ll
    total 8
    lrwxrwxrwx. 1 root root 18 Apr 16 10:50 oldboy_soft_link.txt -> /oldboy/oldboy.txt
    -rw-r--r--. 2 root root 13 Apr 16 10:49 oldboy.txt
	
	软硬链接的区别:
	01. 链接后的文件大小不一致
	02. 链接后的文件类型和权限不一致(颜色不一致)
	03. 链接后的文件和源文件 inode信息有出入
	    硬链接inode号码一致
		软链接inode号码不一样
    04. 源文件被删除之后
	    硬链接文件依然有效
		软链接文件失效
	05. 软硬链接创建过程不一致
3.时间相关命令
    时间相关的命令 date
    01. 查看时间信息:	
	[root@oldboyedu ~]# date
    Tue Apr 16 11:49:51 CST 2019
    02. 调整时间显示格式
	[root@oldboyedu ~]# date +%F
    2019-04-16
    [root@oldboyedu ~]# date "+%F %T"
    2019-04-16 11:52:54
    [root@oldboyedu ~]# date "+%y-%m-%d %H:%M:%S"
    19-04-16 11:53:58
    cp oldboy.log oldboy.log-$(date "+%F_%T")  # 创建时间备份文件
	cp oldboy.log oldboy.log-`date "+%F-%T"`
    
	显示历史时间信息:
	# date +%F -d "-2day"
    # date +%F -d "1 day ago"
	
	显示未来时间信息:
	# date  -d "+2day"
	# date  -d "2day"
	
	系统自动的备份数据 00:00  4月16日 -- 4月17日 00:00
	cp /oldboy/oldboy.log /log/oldboy.log.$(date +%F)
	调整: 
	cp /oldboy/oldboy.log /log/oldboy.log.$(date +%F -d "-1day")
	
	03. 如何实际修改系统时间
	[root@oldboyedu oldboy]# date -s "2020-04-17"
    Fri Apr 17 00:00:00 CST 2020
    [root@oldboyedu oldboy]# date
    Fri Apr 17 00:00:17 CST 2020
    [root@oldboyedu oldboy]# date -s "2020/04/17 14:00"
    Fri Apr 17 14:00:00 CST 2020

	04. 时间同步方法
	yum install -y ntpdate
	ntpdate
    [root@oldboyedu oldboy]# ntpdate ntp1.aliyun.com
    16 Apr 12:22:33 ntpdate[25718]: step time server 120.25.115.20 offset 268748517.381960 sec
    [root@oldboyedu oldboy]# date
    Tue Apr 16 12:22:48 CST 2019
    
备注:
    01防止文件误删除做法?
    	1.创建硬链接(可以解决误删除,不能防止误修改)
    	2.创建备份文件(可以解决误修改)
        
回顾:
    文件属性章节:
	ll -i /etc/hosts
	33584339 -rw-r--r--. 2 root root 192 Apr 15  2019 /etc/hosts
    1) inode信息:
	   inode是什么?
	   作用概述: 索引节点/存储文件属性信息
	   诞生过程: 磁盘格式化=创建文件系统
	   特点说明: inode号码相同,互为硬链接
	   
	   block是什么?
       作用概述: 数据块/存储文件具体内容     
       诞生过程: 磁盘格式化=创建文件系统
	   特点说明: 根据企业情况,调整block大小
	    
       企业面试题: 系统中文件读取原理??

    2) 文件类型和文件权限
       文件类型: 普通文件 - 目录文件 d 链接文件 l  -- file
                  find tar which
	   文件权限: r=4 读  w=2 写 x=1 执行 - 没有权限 0
	             属主 属组 其他用户
				 
	3) 硬链接数
	   硬链接:
       作用概述: 读取文件的多个入口	   
	   诞生过程: ln 源文件 链接文件
	   特点说明:
	   01. inode号码相同
	   02. 源文件删除,链接文件依旧有效
	   03. 目录无法创建硬链接
	   04. 创建出的新的目录硬链接数默认为2 
	   
	   软链接:
	   作用概述: 文件数据的快捷方式
	   诞生过程: ln -s 源文件 链接文件
	   特点说明:
	   01. 源文件删除,链接文件失效
	   02. 普通文件和目录都可以创建软链接
	   
	   企业面试题: 如何将数据真正的删除?
	   01. 确保文件的硬链接数为0   i_link
	   02. 确保文件没有被进程占用  i_count
	   
	4) 属组和属主
	   用户的类型:
	   超级管理员   root    皇帝
	   虚拟用户     nobody  傀儡
	   普通用户     oldboy  平民
	   
	5) 文件时间信息
	   修改时间信息  mtime
	   访问时间信息  atime
	   改变时间信息  ctime
	   find /oldboy -type f -mtime +7  --- 7天以前
	   find /oldboy -type f -mtime -7  --- 最近7天
	   find /oldboy -type f -mtime 7   --- 正好前面第7天
	   date命令如何使用 
	   ntpdate命令进行时间同步

23.系统符号:

1.作用
	a 简化操作 .. ~ ; &&
    b 进行匹配
2.特殊符号
	1) 基础符号系列	
	   美元符号:$
	   叹号符号: !  取反
	   竖线符号: | 管道符号 前一个命令执行结果交给后面命令处理
	                xargs  命令|xargs 命令
                    xargs: 将信息进行分组显示
  
       补充: 如何忽略别名功能:
       01. 使用命令的绝对路径
       02. 在命令执行前加撬棍
       03. 在xargs信息后面命令自动忽略别名	   
       
	   查找指定数据信息进行复制  查找出*.txt文件,批量复制到/tmp目录
	   01. 将找到的信息放到cp 和 最终目录中间
           find /oldboy -type f -name "*.txt"|xargs -i cp {} /oldgirl   
	   02. 利用cp指明谁是数据最终保存的目录信息
           find /oldboy -type f -name "*.txt"|xargs  cp -t /oldgirl	   
		   
	   查找指定数据信息进行移动  查找出*.txt文件,批量移动到/tmp目录
	   01. 将找到的信息放到cp 和 最终目录中间
           find /oldboy -type f -name "*.txt"|xargs -i mv {} /oldgirl   
	   02. 利用cp指明谁是数据最终保存的目录信息
           find /oldboy -type f -name "*.txt"|xargs mv -t /oldgirl
   
       井号符号: #

    2) 引号符号系列
       ''  输出的信息,所见即所得
	   [root@oldboyedu oldboy]# echo 'oldboy $LANG $oldgirl'
       oldboy $LANG $oldgirl
	   ""  和单引号功能类似 但对特殊信息会做解析
	   [root@oldboyedu oldboy]# echo "oldboy $LANG $oldgirl"
       oldboy en_US.UTF-8 123
	   ``($())   将引号中的命令先执行,将执行结果交给引号外面的命令进行处理
	   没有引号 和双引号功能类似 但是可以直接识别通配符信息

	3) 重定向符号:
	   >/1>    标准输出重定向符号
	   2>      错误输出重定向符号
	   >>/1>   标准输出追加重定向符号
	   2>>     错误输出追加重定向符号
	   
	   如何将正确信息和错误信息都输出到文件中:(日志文件)
	   [root@oldboyedu oldboy]# cho oldboy >/oldboy/ok.txt 2>/oldboy/error.txt
       [root@oldboyedu oldboy]# cat /oldboy/error.txt
       -bash: cho: command not found
       [root@oldboyedu oldboy]# echo oldboy >/oldboy/ok.txt 2>/oldboy/error.txt
       [root@oldboyedu oldboy]# cat /oldboy/ok.txt 
       oldboy
	   
	   方法一: 将正确和错误信息同时保留到一个文件
	   [root@oldboyedu oldboy]# echo oldboy >>/oldboy/info.log 2>>/oldboy/info.log 
       [root@oldboyedu oldboy]# cho oldboy >>/oldboy/info.log 2>>/oldboy/info.log 
       [root@oldboyedu oldboy]# cat /oldboy/info.log
       oldboy
       -bash: cho: command not found
	   
	   方法二: 将正确和错误信息同时保留到一个文件
       [root@oldboyedu oldboy]# echo oldboy &>/oldboy/info.log  
       [root@oldboyedu oldboy]# cat /oldboy/info.log
       oldboy
       [root@oldboyedu oldboy]# cho oldboy &>/oldboy/info.log  
       [root@oldboyedu oldboy]# cat /oldboy/info.log
       -bash: cho: command not found

       方法三: 将正确和错误信息同时保留到一个文件
	   [root@oldboyedu oldboy]# echo oldboy >/oldboy/info.log 2>&1 
       [root@oldboyedu oldboy]# cat /oldboy/info.log
       oldboy
       [root@oldboyedu oldboy]# cho oldboy >/oldboy/info.log 2>&1 
       [root@oldboyedu oldboy]# cat /oldboy/info.log
       -bash: cho: command not found

       <    标准输入重定向符号
	   tr <  xargs <
	   <<   标准输入追加重定向符号
	   cat >>/oldboy.txt<<EOF
	   XXX
	   XXX
	   EOF
	   
3.路径信息系列
	   ../  上一级目录
	   ./   当前路径
	   ~    返回到家目录
	   -    两个目录之间进行快速切换
	        An argument of - is equivalent to $OLDPWD(环境变量)
	   补充说明:
	   [root@oldboyedu tmp]# cd $OLDPWD
       [root@oldboyedu oldboy]# cd $OLDPWD
       [root@oldboyedu tmp]# cd $OLDPWD
       [root@oldboyedu oldboy]# echo $OLDPWD
       /tmp
       [root@oldboyedu oldboy]# cd /tmp/
       [root@oldboyedu tmp]# echo $OLDPWD
       /oldboy

4.逻辑符号系列
	   &&  与逻辑符号  前一个命令执行成功, 再执行后面的命令
	   ||  或逻辑符号  前一个命令执行失败, 再执行后面的命令
	   
	   &&符号实践操作:
	   [root@oldboyedu tmp]# # 需求: 想创建一个/alex目录, 在目录中创建一个oldboy.txt 一条命令搞定
       [root@oldboyedu tmp]# mkdi /alex ; touch /alex/oldboy.txt
       -bash: mkdi: command not found
       touch: cannot touch ‘/alex/oldboy.txt’: No such file or directory
       [root@oldboyedu tmp]# 
       [root@oldboyedu tmp]# mkdi /alex && touch /alex/oldboy.txt
       -bash: mkdi: command not found
       [root@oldboyedu tmp]# mkdir /alex && touch /alex/oldboy.txt
       [root@oldboyedu tmp]# ll /alex/oldboy.txt 
       -rw-r--r--. 1 root root 0 Oct 10 03:00 /alex/oldboy.txt
       [root@oldboyedu tmp]# 
	   
	   ||符号实践操作
       [root@oldboyedu tmp]# # 需求: /alex/oldboy.txt删除失败了,在/alex/error.txt文件中生成失败信息
       [root@oldboyedu tmp]# rmx /alex/oldboy.txt || echo "failed" >>/alex/error.txt
       -bash: rmx: command not found
       [root@oldboyedu tmp]# cat /alex/error.txt
       failed
       [root@oldboyedu tmp]# rm /alex/oldboy.txt || echo "failed" >>/alex/error.txt
       [root@oldboyedu tmp]# cat /alex/error.txt
       failed
    
5.通配符
	利用通配符号匹配文件名称信息
	*  模糊匹配所有内容  oldboy old ol o*
	   find -name "*.txt"
	   ll /oldboy/*.txt 
	
	{} 生成序列信息 (生成一行序列)
	   生成连续序列
	   echo {1..10}
	   echo {01..100}
	   echo {a..z}
	   echo {A..Z}
	   生成不连续序列
	   echo {1..10..2}  奇数序列
	   echo {2..10..2}  奇数序列
	   echo {www,bbs,blog}
	   
	   生成组合序列
	   [root@oldboyedu tmp]# echo {A,B}{01,02}
       A01 A02 B01 B02
       [root@oldboyedu tmp]# echo A{01,02}
       A01 A02
       [root@oldboyedu tmp]# echo A{,02}
       A A02

       快速备份文件数据方法
	   [root@oldboyedu tmp]# # cp /oldboy/oldboy.txt /oldboy/oldboy.txt.bak
       [root@oldboyedu tmp]# echo oldboy.txt{,bak}
       oldboy.txt oldboy.txtbak
       [root@oldboyedu tmp]# echo oldboy.txt{,.bak}
       oldboy.txt oldboy.txt.bak
       [root@oldboyedu tmp]# echo /oldboy/oldboy.txt{,.bak}
       /oldboy/oldboy.txt /oldboy/oldboy.txt.bak
       [root@oldboyedu tmp]# cp /oldboy/oldboy.txt{,.bak}   --最终命令
	   
	   # 测试题:
	   01. 在/oldboy目录中创建alex.txt文件,并在/oldboy目录中生成alex.txt.ori备份文件?
	   mkdir /oldboy 
	   touch alex.txt 
	   cp /oldboy/alex.txt{,.ori}
	   
	   02. 如何将备份文件快速还原?
	   rm /oldboy/alex.txt -f 
	   mv /oldboy/alex.txt{.ori,}
	   快速还原
	   mv /oldboy/alex.txt.ori /oldboy/alex.txt

 回顾:
    1) 系统符号:
	   基础系列: # $ ! |  
	   引号系列: '' "" ``=$() 没引号
	   定向符号: > >> 2> 2>> < <<
	   路径符号: . .. ~ -=$OLDPWD
	   逻辑符号: && ||  mkdir /oldboy && touch /oldboy/oldboy.txt || echo "目录已经存在,无须创建"
	2) 通配符号: 用于匹配文件名称信息
	   * 模糊匹配信息:
	   {}生成序列信息: 有序序列 无序序列 组合序列(快速备份和恢复文件)
	3) 正则符号 
	   基础正则符号: grep sed awk
	   ^ 以什么开头的信息进行匹配:
	   [root@oldboyedu ~]# grep "^old" /oldboy/oldboy.txt
       oldboy-linux
       oldboy-python-linux
       oldboy-linux oldboy01
       oldboy-python-linux
       oldboy-linux
       [root@oldboyedu ~]# sed -n '/^old/p' /oldboy/oldboy.txt
       oldboy-linux
       oldboy-python-linux
       oldboy-linux oldboy01
       oldboy-python-linux
       oldboy-linux
       [root@oldboyedu ~]# awk '/^old/' /oldboy/oldboy.txt
       oldboy-linux
       oldboy-python-linux
       oldboy-linux oldboy01
       oldboy-python-linux
       oldboy-linux  
	   
	   $ 以什么结尾的信息进行匹配
	   ^$取出文件中的空行内容
	     grep -v "^$" /oldboy/oldboy.txt

24.正则符号:

1.正则符号
	1. 利用正则符号匹配文件内容信息
	2. 正则符号经常出现在各种开发语言中, python java php 
	3. 正则符号经常被三剑客命令使用
	 
	基础正则符号: basic    regular expression BRE
	1. 尖角符号:^ 
	   以什么开头的信息 ll /oldboy|grep "^d" 
	2. 美元符号:$
	   以什么结尾的信息 ll -F /etc/|grep /$
	
	创建测试环境:
    cat >>/oldboy/oldboy.txt<<EOF
    # oldboyedu-sz-01
    oldboy-linux
    oldboy-python-linux
    
    # oldboyedu-sh
    oldboy-linux
    oldboy-python-linux
    
    # oldboyedu-bj
    oldboy-linux
    java
    mysql
    go
    python
    EOF
    [root@oldboyedu tmp]# cat /oldboy/oldboy.txt
    # oldboyedu-sz-01
    oldboy-linux
    oldboy-python-linux
    
    # oldboyedu-sh
    oldboy-linux
    oldboy-python-linux
    
    # oldboyedu-bj
    oldboy-linux
    java
    mysql
    go
    python
	
	01. 将以oldboy开头的行找出来?
	grep "^oldboy" 文件中过滤
	
	grep "^oldboy" 文件中过滤  
	发屁
	cat 文件|grep  "^oldboy"
	脱裤子    发屁
	
	02. 将以linux结尾的行找出来?
	grep "linux$"  文件中过滤 
	
	03. 将全部内容显示,但不要显示空行
    ^oldboy     linux$
	^$  -- 空行
	grep -v "^$" 文件中过滤 
	
	3. 尖号美元:^$
       空行符号	

	扩展正则符号: extended regular expression ERE 
        	
2.基础正则符号
	基础正则符号: 
    1) 点符号 .  ???
       匹配任意一个字符,且只有一个字符 
	   命令执行结果:
	   [root@oldboyedu ~]# grep "." ~/oldboy_test.txt 
       I am oldboy teacher!
       I teach linux.
       I like badminton ball ,billiard ball and chinese chess!
       my blog is http://oldboy.blog.51cto.com
       our site is http://www.etiantian.org
       my qq num is 49000448.
       not 4900000448.
       my god ,i am not oldbey,but OLDBOY!
  
	   显示匹配过程:
       [root@oldboyedu ~]# grep "." ~/oldboy_test.txt  -o
       I
        
       a
       m
        
       o
       l
       d
 
	2) 星符号 *  ???
       匹配前一个字符连续出现了0次或者多次
	   [root@oldboyedu ~]# grep "0*" ~/oldboy_test.txt
       I am oldboy teacher!
       I teach linux.
       
       I like badminton ball ,billiard ball and chinese chess!
       my blog is http://oldboy.blog.51cto.com
       our site is http://www.etiantian.org
       my qq num is 49000448.
       
       not 4900000448.
       my god ,i am not oldbey,but OLDBOY!
	   
	3) 点和星结合: .* 匹配任意所有信息  .* == *
	   [root@oldboyedu ~]# grep "^m.*m$" ~/oldboy_test.txt
       my blog is http://oldboy.blog.51cto.com
	   
	   问题: 贪婪匹配问题:
	   [root@oldboyedu ~]# grep "^m.*o" ~/oldboy_test.txt
       my blog is http://oldboy.blog.51cto.com
       my god ,i am not oldbey,but OLDBOY!
       指定具体信息阻止贪婪匹配
       [root@oldboyedu ~]# grep "^m.*to" ~/oldboy_test.txt
       my blog is http://oldboy.blog.51cto.com
            
3.转义符号: \
	   将文件中的以 . 结尾的信息进行过滤??
	   \作用:
	   01. 将有特殊意义符号,转义成普通信息进行识别
	   02. 将没有意义的信息转义为有特殊意义的信息
	       \n   换行符号
		   \t   制表符号
	       换行符号作用:
	       [root@oldboyedu ~]# echo "oldboy01oldboy02"
           oldboy01oldboy02
           [root@oldboyedu ~]# echo "oldboy01\noldboy02\noldboy03"
           oldboy01\noldboy02\noldboy03
           [root@oldboyedu ~]# echo -e "oldboy01\noldboy02\noldboy03"
           oldboy01
           oldboy02
           oldboy03
           [root@oldboyedu ~]# echo -e "oldboy01\noldboy02\noldboy03" >oldboy.txt
           [root@oldboyedu ~]# cat oldboy.txt
           oldboy01
           oldboy02
           oldboy03
		   
	   [root@oldboyedu ~]# grep ".$" oldboy_test.txt 
       I am oldboy teacher!
       I teach linux.
       I like badminton ball ,billiard ball and chinese chess!
       my blog is http://oldboy.blog.51cto.com
       our site is http://www.etiantian.org
       my qq num is 49000448.
       not 4900000448.
       0101010101
       11111
       my god ,i am not oldbey,but OLDBOY!
       [root@oldboyedu ~]# grep "\.$" oldboy_test.txt 
       I teach linux.
       my qq num is 49000448.
       not 4900000448.
4.括号符号:[ ]
       集合:匹配多个字符信息
       [root@oldboyedu ~]# grep "oldb[oe]y" oldboy_test.txt
       I am oldboy teacher!
       my blog is http://oldboy.blog.51cto.com
       my god ,i am not oldbey,but OLDBOY!	  

       问题: 将以I开头和m开头的行都找出来?
       [root@oldboyedu ~]# grep "^[Im]" oldboy_test.txt 
       I am oldboy teacher!
       I teach linux.
       I like badminton ball ,billiard ball and chinese chess!
       my blog is http://oldboy.blog.51cto.com
       my qq num is 49000448.
       my god ,i am not oldbey,but OLDBOY!	   
	 
	   [root@oldboyedu ~]# grep "^[a-Z]" /etc/selinux/config 
       SELINUX=enforcing
       SELINUXTYPE=targeted 

5.括号和尖号组合 [^]
	   排除符号
	   [root@oldboyedu ~]# grep "[abc]" oldboy_test.txt
       I am oldboy teacher!
       I teach linux.
       I like badminton ball ,billiard ball and chinese chess!
       my blog is http://oldboy.blog.51cto.com
       our site is http://www.etiantian.org
       my god ,i am not oldbey,but OLDBOY!
       [root@oldboyedu ~]# grep "[^abc]" oldboy_test.txt
       I am oldboy teacher!
       I teach linux.
       I like badminton ball ,billiard ball and chinese chess!
       my blog is http://oldboy.blog.51cto.com
       our site is http://www.etiantian.org
       my qq num is 49000448.
       not 4900000448.
       0101010101
       11111
       my god ,i am not oldbey,but OLDBOY!

25.扩展正则:

6.扩展正则符号
	默认 grep sed不能直接识别
	grep 提升自己  -- egrep/grep -E 
	sed  提升自己  -- sed -r 
    1) +号符号:
    匹配前一个字符连续出现了1次或者多次    
    [root@oldboyedu ~]# grep "0*" oldboy_test.txt 
    I am oldboy teacher!
    I teach linux.
    
    I like badminton ball ,billiard ball and chinese chess!
    my blog is http://oldboy.blog.51cto.com
    our site is http://www.etiantian.org
    my qq num is 49000448.
    
    not 4900000448.
    my god ,i am not oldbey,but OLDBOY!
    [root@oldboyedu ~]# grep "0+" oldboy_test.txt   
    [root@oldboyedu ~]# egrep "0+" oldboy_test.txt  # 匹配1次或者多次,0次不匹配
    my qq num is 49000448.
    not 4900000448.
    [root@oldboyedu ~]# egrep "0+" oldboy_test.txt -o
    000
    00000
	
	张三   110105199004067631
	李四   104105199004067631
	赵六   oldboy
	王五   104105199004067631

    找出身份证信息输入错误的内容
	[root@oldboyedu ~]# grep [0-9] oldboy_test02.txt 
    张三   110105199004067631
    李四   104105199004067631
    王五   104105199004067631
    [root@oldboyedu ~]# grep -E "[0-9]+" oldboy_test02.txt 
    张三   110105199004067631
    李四   104105199004067631
    王五   104105199004067631
    [root@oldboyedu ~]# grep -E "[0-9]+" oldboy_test02.txt -o
    110105199004067631
    104105199004067631
    104105199004067631
    [root@oldboyedu ~]# grep -Ev "[0-9]+" oldboy_test02.txt
    赵六   oldboy
    
     2) 竖线符号:|  
	并且符号,用于匹配多个信息
	[root@oldboyedu ~]# grep -E "oldboy|oldbey" oldboy_test.txt 
    I am oldboy teacher!
    my blog is http://oldboy.blog.51cto.com
    my god ,i am not oldbey,but OLDBOY!
    [root@oldboyedu ~]# grep -E "oldb[oe]y" oldboy_test.txt 
    I am oldboy teacher!
    my blog is http://oldboy.blog.51cto.com
    my god ,i am not oldbey,but OLDBOY!
    
    3) 括号符号: ()
	作用:
	1. 指定信息进行整体匹配
	[root@oldboyedu ~]# grep  "oldb[oe]y" oldboy_test.txt 
    I am oldboy teacher!
    my blog is http://oldboy.blog.51cto.com
    my god ,i am not oldbey,but OLDBOY!
    [root@oldboyedu ~]# grep  "oldboey" oldboy_test.txt 
    my god ,i am not oldboey,but OLDBOY!
    [root@oldboyedu ~]# grep  "oldb(oe)y" oldboy_test.txt 
    [root@oldboyedu ~]# grep -E "oldb(oe)y" oldboy_test.txt 
    my god ,i am not oldboey,but OLDBOY!
    [root@oldboyedu ~]# grep -E "oldb(o|e)y" oldboy_test.txt 
    I am oldboy teacher!
    my blog is http://oldboy.blog.51cto.com
    my god ,i am not oldbey,but OLDBOY!
    
    2. 进行后项引用前项使用: sed命令替换功能
	批量创建用户 oldboy01..oldboy10
	[root@oldboyedu ~]# echo oldboy{01..10}
    oldboy01 oldboy02 oldboy03 oldboy04 oldboy05 oldboy06 oldboy07 oldboy08 oldboy09 oldboy10
    [root@oldboyedu ~]# echo oldboy{01..10}|xargs
    oldboy01 oldboy02 oldboy03 oldboy04 oldboy05 oldboy06 oldboy07 oldboy08 oldboy09 oldboy10
    [root@oldboyedu ~]# echo oldboy{01..3}|xargs -n1
    oldboy01
    oldboy02
    oldboy03
    [root@oldboyedu ~]# echo oldboy{01..10}|xargs -n1|sed 's#(.*)#useradd \1#g'
    sed: -e expression #1, char 19: invalid reference \1 on `s' command's RHS
    xargs: echo: terminated by signal 13
    [root@oldboyedu ~]# echo oldboy{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1#g'
    useradd oldboy01
    useradd oldboy02
    useradd oldboy03
    [root@oldboyedu ~]# echo oldboy{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1#g'|bash
    useradd: user 'oldboy02' already exists
    useradd: user 'oldboy03' already exists
    useradd: user 'oldboy04' already exists
   
企业面试题: 批量创建用户 oldboy01..oldboy10,并给每个用户设置密码信息,默认初始化密码(123456)?
	01. 如何创建用户 给用户设置密码
	02. 基础命令 echo {}/seq -w 10
	03. sed命令替换信息方法
	04. 正则符号 .* () 
	05. 基础符号 ; |
	06. bash内置命令
    
    # 答案:
    echo oldboy{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1;echo 123456|passwd --stdin \1#g'|bash
    seq -w 10 | sed -r "s/(.*)/useradd user\1;echo 123456| passwd --stdin user\1/g"v

    将输出的信息
	echo 123456 ==> 转换为 <123456>进行显示
	[root@oldboyedu ~]# # echo 123456 ==> 转换为 <123456>进行显示
    [root@oldboyedu ~]# echo 123456
    123456
    [root@oldboyedu ~]# echo 123456|sed -r 's#([1-6]+)#\1#g'
    123456
    [root@oldboyedu ~]# echo 123456|sed -r 's#([1-6]+)#<\1>#g'
    <123456>
    [root@oldboyedu ~]# echo 123456|sed -r 's#(.*)#<\1>#g'
    <123456>
    
    
	echo 123456 ==> 转换为 <12><34><56>进行显示
	[root@oldboyedu ~]# # echo 123456 ==> 转换为 <12><34><56>进行显示
    [root@oldboyedu ~]# echo 123456
    123456
    [root@oldboyedu ~]# echo 123456|sed -r "s#(12)(34)(56)#<\1><\2><\3>#g"
    <12><34><56>
    [root@oldboyedu ~]# echo 123456|sed -r "s#(12)(34)(56)#<\1><><\3>#g"
    <12><><56>
    [root@oldboyedu ~]# echo 123456|sed -r "s#(12)(34)(56)#<\1><\3><\3>#g"
    <12><56><56>
    [root@oldboyedu ~]# echo 123456|sed -r "s#(..)(..)(..)#<\1><\2><\3>#g"
    <12><34><56>
    [root@lala ~/dockerfile/n1]# echo 123456|sed -r 's/(.{2})/<\1>/g'
	<12><34><56>
    
    echo 123456 ==> 转换为 <12>34<56>进行显示
    [root@lala ~/dockerfile/n1]# echo 123456|sed -r -e 's/(.{2})(.*)(.{2})/<\1>\2<\3>/g'
	<12>34<56>
    
    4) 括号符号:{}
	可以指定字符连续匹配的次数
	第一种情况: x{n,m}  表示前一个字符至少连续出现n次,最多出现m次
	[root@oldboyedu ~]# grep -E "0{2,3}" oldboy_test.txt 
    my qq num is 49000448.
    not 4900000448.
    [root@oldboyedu ~]# grep  "0+" oldboy_test.txt 
    [root@oldboyedu ~]# grep -E "0+" oldboy_test.txt 
    my qq num is 49000448.
    not 4900000448.
    [root@oldboyedu ~]# grep -E  "0+" oldboy_test.txt -o
    000
    00000
    [root@oldboyedu ~]# grep -E "0{2,3}" oldboy_test.txt  -o
    000
    000
    00
    [root@oldboyedu ~]# grep -E "0{2,4}" oldboy_test.txt
    my qq num is 49000448.
    not 4900000448.
    [root@oldboyedu ~]# grep -E "0{2,4}" oldboy_test.txt -o
    000
    0000
	
	第二种情况: x{n} 表示前一个字符正好连续出现了n次
    [root@oldboyedu ~]# grep -E "0{2}" oldboy_test.txt
    my qq num is 49000448.
    not 4900000448.
    [root@oldboyedu ~]# grep -E "0{2}" oldboy_test.txt -o
    00
    00
    00
	
	第三种情况: x{n,} 表示前一个字符至少连续出现n次,最多出现多少次不限
	[root@oldboyedu ~]# grep -E "0{2,}" oldboy_test.txt
    my qq num is 49000448.
    not 4900000448.
    [root@oldboyedu ~]# grep -E "0{2,}" oldboy_test.txt -o
    000
    00000

	第四种情况: x{,m} 表示前一个字符至少连续出现0次,最多出现m次
	[root@oldboyedu ~]# grep -E "0{,2}" oldboy_test.txt
    I am oldboy teacher!
    I teach linux.
    
    I like badminton ball ,billiard ball and chinese chess!
    my blog is http://oldboy.blog.51cto.com
    our site is http://www.etiantian.org
    my qq num is 49000448.
    
    not 4900000448.
    my god ,i am not oldbey,but OLDBOY!
    my god ,i am not oldboey,but OLDBOY!
    [root@oldboyedu ~]# grep -E "0{,2}" oldboy_test.txt -o
    00
    0
    00
    00
    0
    
    5) 问号符号 ?
	   定义匹配前一个字符出现0或者1次
    
    创建一个测试环境:
    cat >>oldboy_test03.txt<<EOF
    gd
    god
    good
    goood
    gooood
    EOF
	
	[root@oldboyedu ~]# grep "o*" oldboy_test03.txt 
    gd
    god
    good
    goood
    gooood
    [root@oldboyedu ~]# egrep "o+" oldboy_test03.txt 
    god
    good
    goood
    gooood
    [root@oldboyedu ~]# egrep "o?" oldboy_test03.txt 
    gd
    god
    good
    goood
    gooood
    [root@oldboyedu ~]# egrep "o?" oldboy_test03.txt -o
    o
    o
    o
    o
    o
    o
    o
    o
    o
    o
    [root@oldboyedu ~]# egrep "o+" oldboy_test03.txt -o
    o
    oo
    ooo
    oooo

	补充: 想让grep sed命令可以直接识别扩展正则
	[root@oldboyedu ~]# grep "o\+" oldboy_test03.txt
    god
    good
    goood
    gooood
    [root@oldboyedu ~]# grep -E "0{,2}" oldboy_test.txt^C
    [root@oldboyedu ~]# echo 123456|sed  "s#\(..\)\(..\)\(..\)#<\1><\2><\3>#g"
    <12><34><56>

	总结:
	*  匹配前一个字符出现0次或者多次
	+  匹配前一个字符出现1次或者多次
	{} 匹配前一个字符指定出现多少次,至少0次
	?  匹配前一个字符出现0次或者1次
	
	作业:利用ip address show eth0只把IP地址信息显示出来?
	[root@oldboyedu ~]# ip a s eth0
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:81:57:66 brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::31af:a93d:2d09:e293/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    [root@oldboyedu ~]# ip a s eth0|grep "[0-9].[0-9].[0-9].[0-9]"
        inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
    [root@oldboyedu ~]# ip a s eth0|grep "[0-9]+.[0-9]+.[0-9]+.[0-9]+"
    [root@oldboyedu ~]# ip a s eth0|egrep "[0-9]+.[0-9]+.[0-9]+.[0-9]+"
        link/ether 00:0c:29:81:57:66 brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
    [root@oldboyedu ~]# ip a s eth0|egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"
        inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
    [root@oldboyedu ~]# ip a s eth0|egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" -o
    10.0.0.200
    10.0.0.255
    [root@oldboyedu ~]# ip a s eth0|egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" -o|head -1
    10.0.0.200

	[root@oldboyedu ~]# ip a s eth0|egrep "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"
    inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
    [root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.)"
        inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
    [root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.)" -o
    10.
    0.
    0.
    10.
    0.
    0.
    [root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.){3}[0-9]+" -o
    10.0.0.200
    10.0.0.255
    [root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.?){4}" -o
    1500
    1000
    10.0.0.200
    10.0.0.255
    [root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.?){4}" 
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
    [root@oldboyedu ~]# 
    [root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.?){4}" -o
    1500
    1000
    10.0.0.200
    10.0.0.255
    [root@oldboyedu ~]# ip a s eth0|egrep "([0-9]+\.?){4}" -o|head -3|tail -1
    10.0.0.200

26.三剑客sed:

0.回顾
	1) 正则符号
	基础正则符号:
	^  以什么开头的信息进行匹配  ^oldboy
    $  以什么结尾的信息进行匹配  oldboy$
    ^$ 表示匹配空行信息
    .  匹配任意一个且只有一个字符 grep "." 
    *  匹配前一个字符连续出现0次或者多次
    .* 匹配所有任意信息 类似于通配符*
    \  将有意义的字符信息,转义成普通字符进行识别  
	   --> 找出文件中以点结尾的信息	
	   将特殊的扩展正则符号,转换成基础正则符号
	   将没有意义的字符信息转成有意义的字符
	   \n \r \t
	[] 匹配多个字符信息,多个字符匹配时,是或者的关系
	   [ok] 在文件中找有O的字符信息 找文件中有k的字符信息
	   PS: 将一个字符串信息,进行拆分成一个一个的字符进行匹配
   [^] 对匹配的字符信息进行排除
       [^ok]  在文件中找有O的字符信息 找文件中有k的字符信息,进行排除不要显示,显示其他信息
       [^o^k] 	   
	
	扩展正则符号:
	+  匹配前一个字符连续出现1次或者多次
	|  利用竖线可以匹配多个字符串信息
	() 将多个字符信息汇总成整体,进行过滤
	   进行后项引用前项  (oldboy) \1--sed  
    {} 指定匹配前一个字符连续出现了多少次  
       {n,m} 至少连续n次,最多连续m次
       {n}	 匹配只连续n次的信息
       {n,}  至少连续n次,最多不限
       {,m}	 至少连续0次,最多m次  
	?  匹配前一个字符连续出现0次或者1次 
	 
    grep命令识别扩展正则: egrep -E
	sed命令识别扩展正则:  sed -r 
	
	学生问题:
	01. 文件中有\撬棍信息,如何进行过滤
	[root@oldboyedu ~]# grep '\\' oldboy_test.txt 
    I \teach \linux.
	02. 文件中有$符号, 是识别变量, 还是识别普通符号
    [root@oldboyedu ~]# grep '$oldgirl' oldboy_test.txt 
    $oldgirl
    [root@oldboyedu ~]# grep "\$oldgirl" oldboy_test.txt 
    $oldgirl

1.概述
	sed命令: 字符流编辑工具(行编辑工具)==按照每行中的字符进行处理操作
	PS: 全屏编辑工具 vi/vim
	应用:主要用于配置文件,以及日志文件的操作
    查找流程:会将所有的行都会进行条件判断(所以文件过大操作很慢),同时只要满足就会添加进入模式空间(类似内容),模式空间中的内容都会输出
    
	sed命令作用说明:
	1). 擅长对行进行操作处理
	2). 擅长将文件的内容信息进行修改调整/删除
    编写脚本: 修改文件内容信息时
    网络服务中的IP地址进行修改:  50台主机迁移机房--新机房
    第一个步骤: vi ifcfg-eth0 
    第二个步骤: 重启网络服务
    第三个步骤: 检查测试	
  
    自动修改网卡地址脚本:
	第一个步骤: 修改地址
	sed -i "s#10.0.0.200#10.0.0.201#g" ifcfg-eth0 
	
	第二个步骤: 重启网络服务 
	systemctl restart network 
	
	第三个步骤: 过滤ip a s eth0 网卡地址信息存储到一个文件中 共享存储
    
    具体功能作用:
	1) 文件中添加信息的能力 (增) ok
	2) 文件中删除信息的能力 (删) ok
	3) 文件中修改信息的能力 (改)
	4) 文件中查询信息的能力 (查) OK
    
2. sed命令的语法信息
    sed [OPTION]... {script-only-if-no-other-script} [input-file]...
    命令 参数        条件+处理= (指令)              处理文件信息

    显示出文件中有oldboy行的信息
    sed  -n          '/oldboy/p'                      oldboy.txt 
    
3. sed命令执行原理
    参见原理图

4.sed命令实践操作:
    创建测试环境:
    cat >person.txt<<EOF
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    EOF	

    01 sed命令查询信息方法
	根据文件内容的行号进行查询:
	测试1: 显示单行信息
	[root@oldboyedu ~]# sed -n '3p' person.txt 
    103,Alex,COO
	测试2: 根据行号信息,输出多行内容(连续)
	[root@oldboyedu ~]# sed -n '1,3p' person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
	测试3: 根据行号信息,输出多行内容(不连续)
    [root@oldboyedu ~]# sed -n '1p;3p' person.txt 
    101,oldboy,CEO
    103,Alex,COO

	根据文件内容的信息进行查询:
	测试1: 根据内容信息,输出单行内容
	#将有oldboy行的信息找出来
    [root@oldboyedu ~]# sed -n '/oldboy/p' person.txt 
    101,oldboy,CEO

    测试2: 根据内容信息,输出多行内容(连续)
	#将有oldboy到alex行的信息都输出出来
	[root@oldboyedu ~]# sed -n '/oldboy/,/Alex/p' person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO

	测试3: 根据内容信息,输出多行内容(不连续)
	#将有oldboy和alex行的信息都输出出来
	[root@oldboyedu ~]# sed -n '/oldboy/p;/Alex/p' person.txt 
    101,oldboy,CEO
    103,Alex,COO
    106,oldboy,CIO

    02 sed命令添加信息方法
    在文件第一行添加信息:
    100,oldgirl,UFO
	[root@oldboyedu ~]# sed  '1i100,oldgirl,UFO' person.txt
    100,oldgirl,UFO
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    106,oldboy,CIO

    在文件最后一行添加信息:
	[root@oldboyedu ~]# sed  '$a108,oldgirl,UFO' person.txt
    100,oldgirl,UFO
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    106,oldboy,CIO
    108,oldgirl,UFO
	
	测试:
	01. 在第三行后面添加oldboy.txt信息
	sed '3aoldboy.txt' person.txt
	02. 在第二行前面添加oldboy.txt信息
	sed '2ioldboy.txt' person.txt
	03. 在有oldboy行的前面添加oldgirl 后面添加olddog信息
	sed -e '/oldboy/ioldgirl' -e  '/oldboy/aolddog' person.txt
	
	[root@oldboyedu ~]# sed -e '/oldboy/ioldgirl' -e  '/oldboy/aolddog' person.txt
    100,oldgirl,UFO
    oldgirl
    101,oldboy,CEO
    olddog
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    oldgirl
    106,oldboy,CIO
    olddog
	
	sed  '$a100\n101' person.txt  添加多行信息
	企业中编写配置文件:
	IPaddress=10.10.10.1
	mask=255.255.255.0
	gateway=10.10.10.254
	
	sed '$aIPaddress=10.10.10.1\nmask=255.255.255.0\ngateway=10.10.10.254' 文件名称

    03 sed命令删除信息方法
	练习:
	01. 删除单行信息
	[root@oldboyedu ~]# #删除文件中第三行信息
    [root@oldboyedu ~]# sed '3d' person.txt 
    100,oldgirl,UFO
    101,oldboy,CEO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    106,oldboy,CIO
	
	02. 删除多行信息
    [root@oldboyedu ~]# #删除文件中第二行到第六行内容
    [root@oldboyedu ~]# sed '2,6d' person.txt 
    100,oldgirl,UFO
    106,oldboy,CIO
	
	测试: 
	01. 删除有oldboy信息的行
	sed '/oldboy/d' person.txt 
	
	02. 删除第三行和第六行
	[root@oldboyedu ~]# #删除文件中第二行到第六行内容
    [root@oldboyedu ~]# sed '2,6d' person.txt 
    100,oldgirl,UFO
    106,oldboy,CIO
    
    [root@oldboyedu ~]# sed '3d;6d' person.txt 
    100,oldgirl,UFO
    101,oldboy,CEO
    103,Alex,COO
    104,yy,CFO
    106,oldboy,CIO
	
	问题: 如何利用sed命令取消空行显示?
	[root@oldboyedu ~]# sed -n '/./p' person.txt 
    100,oldgirl,UFO
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    106,oldboy,CIO
    
    [root@oldboyedu ~]# sed '/^$/d' person.txt 
    100,oldgirl,UFO
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    106,oldboy,CIO
    
    [root@oldboyedu ~]# sed -n '/^$/!p' person.txt 
    100,oldgirl,UFO
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    106,oldboy,CIO

	04 sed命令修改信息方法
	sed '22s#原有内容#修改后内容#g' 修改第22行文件信息

	sed 's#原有内容#修改后内容#g' 文件信息  
	[root@oldboyedu ~]# sed 's##oldgirl#old#g' person.txt 
    sed: -e expression #1, char 12: unknown option to `s'
    [root@oldboyedu ~]# sed 's/#oldgirl/old/g' person.txt 
    100,old,UFO
    
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    
    104,yy,CFO
    105,feixue,CIO
    106,oldboy,CIO
	
	sed 's#()#\n#g' 文件信息 后项引用前项进行替换修改
    利用sed命令取出IP地址信息:
	第一个历程: 取出有IP地址的行
	[root@oldboyedu ~]# ip a s eth0|sed -n '3p'
    inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
	
	第二个历程: 取出IP地址
	[root@oldboyedu ~]# ip a s eth0|sed -n '3p'|sed -r 's#^.*net (.*)#\1#g'
    10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
    [root@oldboyedu ~]# ip a s eth0|sed -n '3p'|sed -r 's#^.*net (.*)#\1#g'|sed -r 's#(.*)/24.*#\1#g'
    10.0.0.200

	sed -r 's#^.*net (.*)#\1#g'|sed -r 's#(.*)/24.*#\1#g'  进行整合
	ip a s eth0|sed -n '3p'|sed -r 's#^.*net (.*)/24.*#\1#g'
	
	sed -n '3p'|sed -r 's#^.*net (.*)/24.*#\1#g'  进行整合 
	
	sed -n '3                        p'
	sed -r 's#^.*net (.*)/24.*#\1#g'
	sed -rn '3s#^.*net (.*)/24.*#\1#gp'  
	最终取IP地址方法
	[root@oldboyedu ~]# ip a s eth0|sed -rn '3s#^.*net (.*)/24.*#\1#gp'
    10.0.0.200
    
    补充01: 修改文件内容直接进行自动备份?
	[root@oldboyedu ~]# sed -i.bak  's#oldboy#oldold#g' person.txt 
    [root@oldboyedu ~]# ll person.txt.bak 
    -rw-r--r--. 1 root root 104 Oct 10 11:40 person.txt.bak
    [root@oldboyedu ~]# cat person.txt.bak 
    100,#oldgirl,UFO
    
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    
    104,yy,CFO
    105,feixue,CIO
    106,oldboy,CIO

    补充02: 在真实替换文件内容时候,一定不能让n和i参数同时出现???
    [root@oldboyedu ~]# sed -ni 's#Alex#aaaa#gp' person.txt
    103,aaaa,COO
	[root@oldboyedu ~]# cat person.txt
    103,aaaa,COO
	说明: ni和参数同时使用,会将文件内容进行清空


	测验替换功能:
	创建测试环境:
	-rw-r--r--. 1 root root      0 Oct 10 02:10 oldboy01.txt
    -rw-r--r--. 1 root root      0 Oct 10 02:10 oldboy02.txt
    -rw-r--r--. 1 root root      0 Oct 10 02:10 oldboy03.txt
	批量修改文件的扩展名称 将oldboyxx.txt扩展名修改为oldboyxx.jpg
	
    # &将前一个命令过滤的结果放入sed中
	[root@oldboyedu oldboy]# ls oldboy*.txt|sed -r 's#(.*)txt#mv & \1jpg#g'
    mv oldboy01.txt oldboy01.jpg
    mv oldboy02.txt oldboy02.jpg
    mv oldboy03.txt oldboy03.jpg
    mv oldboy.txt oldboy.jpg
    [root@oldboyedu oldboy]# ls oldboy*.txt|sed -r 's#(.*)txt#mv & \1jpg#g'|bash
	
	# 批量重命名专业命令: rename?
    rename  .txt                           .jpg                 oldboy*.txt
	命令    文件名称需要修改的部分信息    修改成什么信息      将什么样的文件进行修改
	
	[root@oldboyedu ~]# cat person.txt|sed -i 's#COO#CEO#g'
    sed: no input files
    [root@oldboyedu ~]# sed -i 's#COO#CEO#g' person.txt
    # 去掉后缀名
	[root@lala ~/dockerfile/n1]# rename '.txt' '' file[0-9].txt
	
	文件中添加内容方法:
	01. vim/vi 
	02. cat >>xxx<EOF .. EOF 
	03. echo -e "xxx\nxxx"
	04. sed 'na/i xxxx\nxxxx\nsxxxx'
	
	
	总结: sed命令的指令信息
	p  print        输出信息
	i  insert       插入信息,在指定信息前面插入新的信息
	a  append       附加信息,在指定信息后面附加新的信息
	d  delete       删除指定信息
	s  substitute   替换信息 s###g(全局替换)
	c               替换修改指定的一整行信息
    
	[root@oldboyedu ~]# sed '2coldboyedu-sz-01' person.txt
    103,aaaa,CEO
    oldboyedu-sz-01   # 将一整行内容完全替换

    总结: sed命令的参数信息
    -n  取消默认输出
    -r  识别扩展正则
    -i  真实编辑文件(将内存中的信息覆盖到磁盘中)	
	-e  识别sed命令多个操作指令
    
回顾:
    01. 课程知识回顾
    1) sed流编辑命令
	2) 语法结构  sed 参数 [条件-处理方式:指令] 文件信息
	3) sed命令实际应用过程
	   文件中查询信息  	参数-n	指令p
	   文件中增加信息        	指令i a
	   文件中删除信息	参数-i	指令d
	   文件中替换信息	参数-i.bak  指令 s g c  后项引用前项 &
    

27.三剑客之awk:

1.awk概念
	作用特点:
	1. 排除信息
    2. 查询信息
    3. 统计信息
    4. 替换信息
    语法格式:
    sed [参数] '条件-处理方式' 文件 
    awk [参数] '模式-动作'     文件	
    流程:
        根据模式进行过滤数据,通过可以进行处理或者输出,没有通过进行下一次循环
        
2.awk基础语法操作
	准备测试环境
    [root@oldboyedu ~]# cat awk_test.txt 
    Zhang	Dandan		41117397	:250:100:175
    Zhang	Xiaoyu		390320151	:155:90:201
    Meng	Feixue		80042789	:250:60:50
    Wu	Waiwai		70271111	:250:80:75
    Liu	Bingbing	41117483	:250:100:175
    Wang	Xiaoai		3515064655	:50:95:135
    Zi	Gege		1986787350	:250:168:200
    Li	Youjiu		918391635	:175:75:300
    Lao	Nanhai		918391635	:250:100:175

    命令查询信息方法:
    按照行号查询信息:
	awk 'NR=2' awk_test.txt
	[root@oldboyedu ~]# awk 'NR=2' awk_test.txt   # 显示第二行数据
    Zhang	Dandan		41117397	:250:100:175
    Zhang	Xiaoyu		390320151	:155:90:201
    Meng	Feixue		80042789	:250:60:50
    Wu	Waiwai		70271111	:250:80:75
    Liu	Bingbing	41117483	:250:100:175
    Wang	Xiaoai		3515064655	:50:95:135
    Zi	Gege		1986787350	:250:168:200
    Li	Youjiu		918391635	:175:75:300
    Lao	Nanhai		918391635	:250:100:175
    [root@oldboyedu ~]# awk 'NR==2' awk_test.txt
    Zhang	Xiaoyu		390320151	:155:90:201
    [root@oldboyedu ~]# awk 'NR==2,NR==4' awk_test.txt # 第二到四行
    Zhang	Xiaoyu		390320151	:155:90:201
    Meng	Feixue		80042789	:250:60:50
    Wu	Waiwai		70271111	:250:80:75
    [root@oldboyedu ~]# awk 'NR==2;NR==4' awk_test.txt  # 第二行和第四行
    Zhang	Xiaoyu		390320151	:155:90:201
    Wu	Waiwai		70271111	:250:80:75
	
	ps: 在linux系统中
	oldboy=10  	赋值变量信息
	oldboy==2  	真正oldboy等于数值2
	
    按照字符查询信息:
    [root@oldboyedu ~]# awk '/Xiaoyu/' awk_test.txt
    Zhang	Xiaoyu		390320151	:155:90:201
    [root@oldboyedu ~]# awk '/Xiaoyu/,/Waiwai/' awk_test.txt  # xiaoyu到waiwai
    Zhang	Xiaoyu		390320151	:155:90:201
    Meng	Feixue		80042789	:250:60:50
    Wu	Waiwai		70271111	:250:80:75
    [root@oldboyedu ~]# awk '/Xiaoyu/;/Waiwai/' awk_test.txt   # xiaoyu和waiwai
    Zhang	Xiaoyu		390320151	:155:90:201
    Wu	Waiwai		70271111	:250:80:75
	
	测验:
	01. 显示xiaoyu的姓氏和ID号码(???)
	[root@oldboyedu ~]# awk '/Xiaoyu/{print $1","$3}' awk_test.txt   # 用,隔开
    Zhang,390320151
    [root@oldboyedu ~]# awk '/Xiaoyu/{print $1,$3}' awk_test.txt    # 用空格隔开
    Zhang 390320151
	
	02. 姓氏是zhang的人,显示他的第二次捐款金额及他的名字?
	[root@oldboyedu ~]# awk '/Zhang/{print $4}' awk_test.txt 
    :250:100:175
    :155:90:201
    [root@oldboyedu ~]# awk '/Zhang/{print $NF}' awk_test.txt  # NF表示最后一列,倒数第二列需要用$(NF-1)表示
    :250:100:175
    :155:90:201
    [root@oldboyedu ~]# awk '/Zhang/{print $NF}' awk_test.txt|awk -F ":" '{print $3}'
    100
    90
	
	awk '/Zhang/{print $NF}' 
	awk -F ":" '{print $3}'
    [root@oldboyedu ~]# awk -F ":" '/^Zhang/{print $3}' awk_test.txt 
    100
    90
	
    # -F "[ :]+" -F参数指定分隔符,同时支持正则方式匹配 等价于-v FS="[ :]+"
    [root@oldboyedu ~]# awk -F "[ :]+" '/^Zhang/{print $1,$2,$5}' awk_test.txt 
    Zhang Dandan 100
    Zhang Xiaoyu 90
    [root@oldboyedu ~]# awk -F "[ :]+" '/^Zhang/{print $1,$2,$(NF-1)}' awk_test.txt 
    Zhang Dandan 100
    Zhang Xiaoyu 90

    03. 显示所有以41开头的ID号码的人的全名和ID号码
	[root@oldboyedu ~]# awk '$3~/^41/{print $1,$2,$3}' awk_test.txt  # ~代表匹配的意思
    Zhang Dandan 41117397
    Liu Bingbing 41117483
	
	04. 显示所有ID号码最后一位数字是1或5的人的全名
    方法一:
	awk '$3~/1$|5$/{print $1,$2}' awk_test.txt
	[root@oldboyedu ~]# awk '$3~/1$|5$/{print $1,$2}' awk_test.txt|column -t
    Zhang  Xiaoyu
    Wu     Waiwai
    Wang   Xiaoai
    Li     Youjiu
    Lao    Nanhai
    Lao    Nanhai
	
	方法二:
	[root@oldboyedu ~]# awk '$3~/[15]$/{print $1,$2}' awk_test.txt|column -t
  
    方法三:
	[root@oldboyedu ~]# awk '$3~/(1|5)$/{print $1,$2}' awk_test.txt|column -t
	
	05. 显示Xiaoyu的捐款,每个捐款数值前面都有以$开头, 如$110$220$330
	[root@oldboyedu ~]# awk '$2~/Xiaoyu/{print $NF}' awk_test.txt 
    :155:90:201
                
    [root@oldboyedu ~]# #gsub(/需要替换的信息/,"修改成什么信息",将哪列信息进行修改)
    [root@oldboyedu ~]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt 
    $155$90$201

	文件中空行进行排除/文件中注释信息进行排除?
	grep -Ev "^#|^$"  文件信息 
	sed -n '/^#|^$/!p' 文件信息
	awk '/^#|^$/'
	[root@oldboyedu ~]# awk '$0~/^#|^$/'  awk_test.txt 
    #Liu    Bingbing 41117483    :250:100:175
    
    [root@oldboyedu ~]# awk '$0!~/^#|^$/'  awk_test.txt   # $0表示一整行内容
    Zhang  Dandan   41117397    :250:100:175
    Zhang  Xiaoyu   390320151   :155:90:201
    Meng   Feixue   80042789    :250:60:50
    Wu     Waiwai   70271111    :250:80:75
    Wang   Xiaoai   3515064655  :50:95:135
    Zi     Gege     1986787350  :250:168:200
    Li     Youjiu   918391635   :175:75:300
    Lao    Nanhai   918391635   :250:100:175
    Lao    Nanhai   918394135   :250:100:175

	总结:awk命令中$符号用法
	$1 $2 $3 : 取第几列信息
	$NF      : 取最后一列
	$(NF-n)  : 取倒数第几列
	$0       : 取一整行的信息
	
	如何利用awk取出IP地址信息:
	ip a s eth0|awk -F "[ /]+" 'NR==3{print $5}'
	hostname -i 

3. awk高级功能说明
    a 对日志信息进行统计(计数)             
	b 对日志信息数值进行求和  客户端-下载 服务端-上传  消耗网络流量
	c (数组)进行排序分析  
	  排序
	  01 192.168.2.1  600  192  深圳    10万   
	  02 192.168.1.10 500  18   上海
	  03 192.168.3.10 200  20   广州
	                       30   东北    2千  
      运维总监---运营(推广)总监
	d 可以进行脚本编写(循环语句 判断语句) sh awk_nginx.log
	  
	awk模式概念说明: 匹配的条件信息
	普通的模式: 
	01. 正则表达式作为模式  
	    awk '/^oldboy/{print xx}'
	02. 利用比较匹配信息
	    NR==2
		NR>=2
	    NR<=2
	03. NR==2,NR==10
    
	# 特殊的模式?
    awk 'BEGIN{print "性", "名", "qq", "捐款数"}$0!~/^#|^$/{print $0}END{print "结束"}' 		awk_test.txt |column -t  # 去掉空行同时显示表头和结束
	BEGIN{}  在awk执行命令前做什么事情:
	[root@oldboyedu ~]# awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}' awk_test.txt |column -t
    姓     名        QQ号        捐款记录
    Zhang  Dandan    41117397    :250:100:175
    Zhang  Xiaoyu    390320151   :155:90:201
    Meng   Feixue    80042789    :250:60:50
    Wu     Waiwai    70271111    :250:80:75
    Liu    Bingbing  41117483    :250:100:175
    Wang   Xiaoai    3515064655  :50:95:135
    Zi     Gege      1986787350  :250:168:200
    Li     Youjiu    918391635   :175:75:300
    Lao    Nanhai    918391635   :250:100:175
    Lao    Nanhai    918394135   :250:100:175
	
	修改内置分隔符变量?
	awk -F ":" '{print $2}' awk_test.txt
	[root@oldboyedu ~]# awk  'BEGIN{FS=":"}{print $2}' awk_test.txt 

	
	END{}  在awk执行命令结束之后做的操作
	[root@oldboyedu ~]# awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}END{print "操作结束"}' awk_test.txt |column -t 
    姓        名        QQ号        捐款记录
    Zhang     Dandan    41117397    :250:100:175
    Zhang     Xiaoyu    390320151   :155:90:201
    Meng      Feixue    80042789    :250:60:50
    Wu        Waiwai    70271111    :250:80:75
    Liu       Bingbing  41117483    :250:100:175
    Wang      Xiaoai    3515064655  :50:95:135
    Zi        Gege      1986787350  :250:168:200
    Li        Youjiu    918391635   :175:75:300
    Lao       Nanhai    918391635   :250:100:175
    Lao       Nanhai    918394135   :250:100:175
    操作结束

    统计累加运算测试:?
	01. 统计/etc/services文件中空行数量
	利用awk公式进行累加运算
	[root@oldboyedu ~]# i=0
    [root@oldboyedu ~]# echo $((i=i+1))
    1
    [root@oldboyedu ~]# echo $((i=i+1))
    2
    [root@oldboyedu ~]# echo $((i=i+1))
    3
   
    awk '/^$/' /etc/service
    [root@oldboyedu ~]# awk '/^$/{i=i+1;print i}' /etc/services 
    空行 i=i+1 0+1  i=1
    空行 i=i+1 1+1  i=2
    空行 3
    空行 4
    空行 5
    空行 6
    空行 7
    空行 8
    空行 9
    空行 10
    空行 11
    空行 12
    空行 13
    空行 14
    空行 15
    空行 16
    空行 i=i+1 16+1 i=17 
	[root@oldboyedu ~]# awk '/^$/{i=i+1}END{print i}' /etc/services 
    17

    02. 统计/etc/services文件中有井号开头的行
	awk '/^#/{i++}END{print i}' /etc/services
	
	03. 统计系统中有多少个虚拟用户 普通用户
	第一个历程: 用户信息都保存在什么文件中了
	用户信息保存文件: /etc/passwd
	第二个历程: 从文件中匹配出虚拟用户 普通用户 
	匹配普通用户
	awk '$NF~/bash/' /etc/passwd 
	awk '$NF~/\/bin\/bash/' /etc/passwd 
	第三个历程: 进行统计
	普通用户数量
    [root@oldboyedu ~]# awk '$NF~/bash/{i=i+1}END{print i}' /etc/passwd
    63
	虚拟用户数量
    [root@oldboyedu ~]# awk '$NF!~/bash/{i=i+1}END{print i}' /etc/passwd
    22

	求和运算:?
	sum=sum+$n(需要进行数值求和的列)
	[root@oldboyedu ~]# seq 10|awk '{sum=sum+$1;print sum}'
    1  sum=sum+$1  0+1 sum=1
    2  sum=sum+$1  1+2 sum=3
    3  sum=sum+$1  3+3 sum=6
    4              6+4 sum=10
    5             10+5 sum=15
    6             15+6 sum=21
    7      28
    8      36
    9      45
    10           45+10 sum=55
    
作业: 站着听课
01 求出测试文件中 所有人第一次捐款的总额和第三次捐款总额
   显示表头 
   第一总额  第三次总额 	
   xxx        xxxx	
posted @ 2020-05-07 15:36  楠海  阅读(216)  评论(0编辑  收藏  举报