第四周总结(文件属性&&正则符号&&三剑客 )

本文总结了Linux中文件属性的七大类别,包括索引、用户、链接、时间、大小、类型和权限信息,并详细介绍了正则表达式的常用符号及Linux三剑客——grep、sed和awk的使用,尤其是awk命令的执行原理。
摘要由CSDN通过智能技术生成

一. 文件属性分类

  文件属性分类:
      索引信息
      属主信息
      属组信息
      软硬链接
      时间信息
      权限信息
      类型信息
      大小信息

[root@shiyi ~ 15:24:28]# ll -i /bonian/
51206131         d      rwxr-xr-x    2       root     root     57      Dec 13 09:18   bonian01  
17391346         d      rwxr-xr-x    2       root     root     24      Dec 17 09:22   bonian02  
索引 inode号   文件类型    文件权限    硬链接数    属主     属组    文件大小    文件时间
1. 文件属性索引信息:
inode 
    概念说明: 数据文件索引信息, 类似目录
    作用说明: 存储文件数据属性信息
                     文件数据指针信息
    诞生过程: 格式化 --> 创建文件系统 --> 创建inode
    查看方法: df -i 

block 
    概念说明: 真正存储数据区域
    作用说明: 存储文件真正数据内容
    诞生过程: 格式化 --> 创建文件系统 --> 创建block
    查看方法: df

    索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。
    一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。
    系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号(也就是inode号)。

    文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
    操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。
    这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
    文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。
    这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。


问题一:
    磁盘空间不够了: 如何处理
    思路一: 磁盘inode是否够用
    用来储存文件信息的inode已经耗尽,而block却未必用完
    思路二: 磁盘block是否够用
    
问题二:
    一个数据会占用一个inode, 占用多个block
    一个block块是大点好 小点好
    说明: 10K文件  --> 1个block 4k --> 3个block  
          磁盘IO(input output)输入输出的次数, 决定磁盘性能 
	      10M 消耗block少 IO次数少  硬盘性能没有影响 
	      10G 消耗block多 IO次数多  硬盘性能会有下降  
	      存储数据大文件数据  视频10G/图片/音频  block更大些 IO消耗减少 
	      存储数据小文件数据  文档 代码          block更小些 节省磁盘空间	  
如何创建文件系统:  如何格式化 	  

数据读取原理: inode block 
2. 文件属性用户信息:
用户分类说明:  
    属主 属组 其他用户  
	oldboy.txt  -- 创造者 oldboy  rwx  
	属组   oldgirl olddog oldbaby  --> oldboy组  rw-
	alex tony kinve  r--
				   
	系统用户分类:
	超级管理员	皇帝		root    user id  uid信息: 0
	虚拟用户		傀儡		nobody  uid: 1-999  centos7 
	                    特点01: 不能登录系统   管理服务进程信息
	                             uid: 1-499  centos6  
	                    特点02: 没有家目录
	普通用户		平民		oldboy   uid: 1000+  centos7  
                                  uid:  500+  centos6
 
用户和用户组关系:
    1	vs 1	关系:  1个用户	属于 1个组
    1	vs 多	关系:  1个用户   	属于 多个组
    多	vs 1	关系:  多个用户	属于 1个组  
    多	vs 多	关系:  多个用于  	属于 多个组
	
oldboy    --> /etc/hosts     -- oldbg 设置权限
oldgirl   --> /etc/hosts

olddog    --> /etc/rc.local
oldbaby   --> /etc/rc.local

3. 文件属性链接信息:
软链接硬链接
文件数据快捷方式查看数据内容的门
软链接会指向源文件硬链接会指向和源文件相同的inode号
如果源文件删除,则软链接失效如果源文件删除,硬链接不受影响
可以给目录创建软链接只能给普通文件创建硬链接
link[ln -s 源文件 软链接]link[ln 源文件 硬链接]
利用软连接进行文件快捷管理 减少开发人员工作量利用硬链接对大文件进行备份 防止误删除

创建的目录------默认有2条硬链接
创建的文件------默认有1条硬链接

4. 文件属性时间信息:
属性分类:
  atime:  access time --- 访问时间
  mtime:  modify time --- 修改时间 
  ctime:  change time --- 改变时间

stat 文件  --- 查看文件详细属性信息(详细时间信息)

# cat oldboy.txt 
# stat oldboy.txt 
Access: 2020-01-23 01:00:09.122458448 +0800   --- 访问时间信息
Modify: 2020-01-23 00:59:32.244456300 +0800
Change: 2020-01-23 00:59:32.244456300 +0800
	
# echo oldboy69 >oldboy.txt 
# stat oldboy.txt 
Access: 2020-01-23 01:00:09.122458448 +0800
Modify: 2020-01-23 01:01:30.050463164 +0800   --- 修改时间信息
Change: 2020-01-23 01:01:30.050463164 +0800   --- 影响文件大小属性

# chmod 700 oldboy.txt 
# stat oldboy.txt 
Access: 2020-01-23 01:00:09.122458448 +0800
Modify: 2020-01-23 01:01:30.050463164 +0800
Change: 2020-01-23 01:03:27.084469984 +0800   --- 文件属性信息发生变化

和时间有关的命令: timedatectl
date  --- 查看时间信息/设置修改时间

查看时间信息: 
指定时间显示格式: # date '+%Y-%m-%d %H:%M:%S 星期%w'
%Y: 年份信息
%m: 月份信息  ---> %F
%d: 日期信息

%H: 小时信息
%M: 分钟信息  ---> %T
%S: 秒信息
cp /etc/hosts /etc/hosts.`date '+%F_%T_星期%w'`

指定查看未来或过去时间:
date -d  "-n day"  --- 显示过去时间
date -d  "+n day"  --- 显示未来时间	

修改时间信息:
date -s  "年份月份日期"
date -s  "小时分钟秒"
5. 文件属性大小信息:
	文件的属性中“大小”指的是,你的文件的容量,它有多大容量,就占多大内存,就像东西有多大体积,就占多大空间一样。 
	“大小”的单位有:EB,PB,TB,GB,MB,KB,B(字节)等
	1EB=1024PB 1PB=1024TB 1TB=1024GB
	1GB=1024MB  1MB=1024KB 1KB=1024B(字节) 1个汉字占两个字节
	1MB如果纯粹储存汉字的话可储存50万汉字.但硬盘标识为80G的话,实际没有这么大的,因为硬盘生产商一般是按1MB=1000KB计算的
6. 文件属性类型信息:
1. 查看文件类型的三种方法:
	ls-l/ls-ld 或者ll [ls-l —查看文件 ls-ld —查看路径 ll —-跟ls -l 一样]
	file 命令
	stat 命令

2. 文件分类介绍(部分):
      普通文件:Linux中最多的一种文件类型, 包括 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);
              各种压缩文件.第一个属性为 [-]
	  文本文件:
	  二进制文件(命令文件)
	  数据文件(压缩文件)
	  file 文件信息  --- 获取文件类型 
	d 目录文件:就是目录, 能用 # cd 命令进入的。第一个属性为 [d],例如 [drwxrwxrwx] 
	l 连接文件(软链接):类似Windows下面的快捷方式。第一个属性为 [l],例如 [lrwxrwxrwx]
	c 字符流文件:字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]
	b block块文件           存储设备文件信息
	 就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是/dev/hda1等文件。第一个属性为 [b]      
	s socket文件(网络编程):这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。
	                      第一个属性为 [s],最常在 /var/run目录中看到这种文件类型 
	p FIFO(管道文件):一种特殊的文件类型,主要是解决多个程序同时存取一个文件所造成的错误。
	                  FIFO是first-in-first-out(先进先出)的缩写。第一个属性为 [p]


3. 特殊扩展名标记文件
	xxx.txt    --- 文本文件 
	xxx.log    --- 日志文件
	xxx.conf   --- 配置文件
	xxx.sh     --- shell脚本文件
	xxx.py     --- python脚本文件
	xxx.zip/xxx.gz/xxx.tar.gz      --- 压缩文件
	xxx.db     --- 数据库文件 database 数据(010203)=== 更加完善 功能更强 excel
	xxx.rpm    --- 表示rpm安装包文件
	xxx.conf   --- 表示系统服务的配置文件
	xxx.html、.htm、.php、.jsp、.do  --- 表示网页语言的文件
	xxx.sh     --- 表示shell脚本文件,通过shell语言开发的程序。 
	xxx.pl     --- 表示perl语言文件,通过perl语言开发的程序。 
	xxx.py     --- 表示python语言文件,通过python语言开发的程序
	
4. 补充: 和文件相关命令
	which    --- 查看命令文件保存路径  
	whereis  --- 查看命令文件保存路径 以及 查看命令相关文件保存路径
	locate   --- 快速检索一个文件保存的路径  == everything
	             yum install -y mlocate
				 updatedb
file命令:
命令作用:
	用来识别文件类型,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的。
命令参数:
	-b        列出文件辨识结果时,不显示文件名称。
	-c        详细显示指令执行过程,便于排错或分析程序执行的情形
	-f        列出文件中文件名的文件类型
	-F        使用指定分隔符号替换输出文件名后的默认的":"分隔符。
	-i        输出mime类型的字符串
	-L        查看对应软链接对应文件的文件类型
	-z        尝试去解读压缩文件的内容
实战演练:	
	查看文件类型:
	 file  文件      显示文件名称
	 file -b  文件   不显示文件名称
	 [root@shiyi bonian02 15:25:10]# file person.txt 
	 person.txt: ASCII text ==> 文本文件
     [root@shiyi bonian02 15:41:27]# file -b person.txt 
	 ASCII text
	显示mime类型的字符串:
	 [root@shiyi bonian02 15:46:36]# file -i person.txt 
	 person.txt: text/plain; charset=us-ascii
	查看文件中的文件名的文件类型:
 	 [root@shiyi bonian02 15:52:28]# file -f person.txt 
	 101,oldboy,CEO:   cannot open (No such file or directory)
	 102,zhaoyao,CTO:  cannot open (No such file or directory)
	 103,Alex,COO:     cannot open (No such file or directory)
 	 104,yy,CFO:       cannot open (No such file or directory)
	 105,feixue,CIO:   cannot open (No such file or directory)
	 106,oldboy,CRO:   cannot open (No such file or directory)
	 107,zhaoyao,CQO:  cannot open (No such file or directory)
	 108,Alex,CPO:     cannot open (No such file or directory)
	 109,zhangsan,CNO: cannot open (No such file or directory)
	解读压缩文件:
	 [root@shiyi ~ 15:54:52]# file -z /bonian/oldboy.tar.gz 
	 /bonian/oldboy.tar.gz: POSIX tar archive (GNU) 
	 (gzip compressed data, from Unix, last modified: Fri Dec 13 18:10:55 2019)
	查看软链接对应的文件的文件类型:
	 [root@shiyi bonian02 15:59:15]# file -L bonian01_link/
	 bonian01_link/: directory

7. 文件属性权限信息:
   rw-  r--  r--        文件权限包含9个权限位  12位权限
	属主 属组 其他用户
	
	属主:     读r 写w 执行x  - 没权限
    属组:     只有读权限 
	其他用户:  只有读权限  
	
	r-xr----    文件权限解释:  属主(读权限和执行权限)  属组(可读权限)    
	540                      其他用户(没有任何权限)
	rwxrw-rw-   文件权限解释:  属主(读写执行)         属组(读写)         
	766                      其他用户(读写)
	-w-r-xr--   文件权限解释:  属主(写权限)           属组(读权限和执行) 
	254                      其他用户(读权限) 
	
    r - 4  每三位权限为一组, 做求和运算 数值进行输出
	w - 2 
	x - 1
	- - 0  

	666  670 776 771 --> 符号表示
	rw-rw-rw-  rw-rwx---  rwxrwxrw-  rwxrwx--x   
	
	0  ---  
	1  --x   
	2  -w- 
	3  -wx
	4  r-- 
	5  r-x
    6  rw- 
    7  rwx 

1. 系统权限信息:
       r(4) 读权限:  
	   · 文件信息: 内容信息可以读取
	   · 目录信息: 查看目录数据信息
	   w(2) 写权限
	   · 文件信息: 内容信息可以编辑
	   · 目录信息: 操作目录数据信息(删除数据/创建数据/移动数据/修改数据名称)
	   x(1) 执行权限:
	   · 文件信息: 文件可以进行执行  /etc/rc.local
	   · 目录信息: 目录可以进行切换
2. 系统权限分配方式:
	   rwx  第一组权限: 分配给属主用户
	   rw-  第二组权限: 分配给属组用户
	   r--  第三组权限: 分配给其他用户
	   PS: 系统常用权限位: 9位权限位  实际是为12位  (面试)
3. 系统权限配置方法:
	   rwx- 000~777 001 002 003

4. 文件权限说明:
   1)没有权限
	管理员用户(root):	读、写权限都可以执行,但是没有执行权限。
    数据属主信息:		只有写权限可以执行,但是没有读和执行权限;
                      	且写权限不完全,会覆盖前一次的内容。
    数据其他用户:		任何权限都不能执行。
   2)只有读权限
    管理员用户(root):	读、写权限都可以执行,但是没有执行权限。
    数据属主信息:		读写权限都可以执行,但是没有执行权限。
    数据其他用户:		只有读权限可以执行,但是没有写和执行权限。
   3)只有写权限
    管理员用户(root):	读、写权限都可以执行,但是没有执行权限。
    数据属主信息:		只有写权限可以执行,但是没有读和执行权限;
                      	且写权限不完全,会覆盖前一次的内容。
    数据其他用户:		只有写权限可以执行,但是没有读和执行权限;
                     	且写权限不完全,会覆盖前一次的内容。
   4)只有执行权限
     管理员用户(root):	读、写和执行权限都可以执行。
     数据属主信息:		只有写权限可以执行,但是没有读和执行权限;
                     	且写权限不完全,会覆盖前一次的内容。
     数据其他用户:		任何权限都不能执行。

5. 目录权限说明:
   1)没有权限
     管理员用户(root):	读、写和执行权限都可以执行。
     数据属主信息:		任何权限都不能执行。
     数据其他用户:		任何权限都不能执行。
   2)只有读权限
     管理员用户(root):	读、写和执行权限都可以执行。
     数据属主信息:		只有读权限可以执行,但是没有写和执行权限;
                      	且读权限不完全,不会显示inode信息,只有block信息。
     数据其他用户:		只有读权限可以执行,但是没有写和执行权限;
                      	且读权限不完全,不会显示inode信息,只有block信息。
   3)只有写权限
     管理员用户(root):	读、写和执行权限都可以执行。
     数据属主信息:		任何权限都不能执行。
     数据其他用户:		任何权限都不能执行。
   4)只有执行权限
     管理员用户(root):	读、写和执行权限都可以执行。
     数据属主信息:		只有执行权限可以执行,但是没有读和写权限。
     数据其他用户:		只有执行权限可以执行,但是没有读和写权限。


======================================================================
进行权限修改:  chmod  权限信息  数据信息
属主修改权限: chmod u+/-/=  属主 user
属组修改权限: chmod g+/-/=  属组 group
其他用户修改: chmod o+/-/=  属组 other
同时三种用户都做权限修改:
rw-  r--  ---  chmod 640 
======================================================================

在这里插入图片描述

二. 正则表达式

1. 正则符号信息
1)系统基础符号:
   美元符号:$
     用于取出变量中的内容
       [root@shiyi ~ 14:19:14]# abc=123
       [root@shiyi ~ 16:17:59]# echo $abc
        123
     用于取出指定列的信息(awk)
     
     表示用户命令提示符号
        [oldboy01@shiyi ~ 16:44:20]$ ----普通用户
        [root@shiyi ~ 16:44:25]# --------超级管理员

     表示一行的结尾
   
    叹号符号:!
       用于表示取反或者排除意思
       命令行中表示取出最近命令
           !awk(慎用)
           history|grep awk 
           history -c -w 
           ctrl+r 
       用于表示强制操作处理
            vim底行模式保存 退出 wq! q!
   
   竖线符号:| 表示管道符号,管道前面命令,交给管道后面执行
  			 经常配合xargs命令使用
   		查找指定数据信息进行删除
		   find /oldboy -type f -name "oldboy*.txt"|xargs rm
		   find /oldboy -type f -name "oldboy*.txt" -exec rm -rf {} \;
		   find /oldboy -type f -name "oldboy*.txt" -delete
   		查找指定数据信息进行复制
		   find /oldboy -type f -name "oldboy*.txt" |xargs -i cp {} /oldgirl/
		   find /oldboy -type f -name "oldboy*.txt" |xargs cp -t /oldgirl/
		   find /oldboy -type f -name "oldboy*.txt" -exec cp -a {} /oldgirl \;
   		查找指定数据信息进行移动
		   find /oldboy -type f -name "oldboy*.txt" |xargs -i mv {} /oldgirl/
		   find /oldboy -type f -name "oldboy*.txt" |xargs mv -t /oldgirl/
		   find /oldboy -type f -name "oldboy*.txt" -exec mv {} /oldgirl \;
   		查找指定数据信息按照日期
		   查找7天以前的数据: find /oldboy -type f -mtime +7 
		   查找最近7天的数据: find /oldboy -type f -mtime -7
		   查找距今第7天数据: find /oldboy -type f -mtime 7
   		主要用于批量删除历史数据信息
		   产生输出的信息|grep xxx
		   rpm -qa | grep vim 
   
   井号符号:#
       表示文件内容注释符号
       表示用户命令提示符号
          超级用户为 #
          普通用户为 $
2) 引号符号系列
    美元括号:$() == ``
  	 表示命令执行结果留下,用于其他命令调用
	   引号符号:
	   · 双引号 "" : 表示输入内容,就是输出内容,但是部分信息会被解析
	   · 单引号 '' : 表示输入内容,就是输出内容(所见即所得)
	   · 反引号 `` : 表示命令执行结果留下,用于其他命令调用
	   · 没引号    : 表示和双引号功能类似, 但是可以识别序列信息 {}
   
3) 定向符号系列
   小于符号:单个小于符号   <  标准输入重定向符号
                      tr 'a-z' 'A-Z' < oldboy.txt
                      xargs -n2 < oldboy01.txt 
           两个小于符号 <<  标准输入追加重定向符号
                      cat >> oldboy.txt <<EOF
                      oldboy01
                      oldboy02
                      oldboy03
                      EOF
   大于符号:单个大于符号 1>/>   标准输出重定向符号
                      2>     错误输出重定向符号
           两个大于符号 1>>/>> 标准输出追加重定向符号
                      2>>    错误输出追加重定向符号

4) 路径符号系列
   单点符号:find ./   表示当前目录
   双点符号:cd   ..   表示上级目录
   波浪符号:cd   ~    表示用户家目录信息
           超级用户:/root
           普通用户:/home/用户名称
   横线符号:cd   -    两个目录路间进行切换
                 OLDPWD: 保存用户切换目录之前的所在路径信息
 
5) 系统逻辑符号:
   && : 前一件事执行成功了, 在执行&& 后面的命令 
   || : 前一件事执行失败了, 在执行|| 后面的命令
    ; : 不管前面命令成功与否, 都会执行分号后面的命令
6)系统通配符号:
    *  匹配任意字符或者字符串信息
	   # ll /oldboy/*.txt
       -rw-r--r-- 1 root root 24 Dec 17 10:58 /oldboy/oldboy01.txt
       -rw-r--r-- 1 root root 78 Dec 17 10:59 /oldboy/oldboy.txt
	{} 匹配生成序列信息
	   数字序列: {01..10}  奇数序列 {01..10..2} 偶数序列 echo {00..10..2}
       字母序列: {a..z}    
	   组合序列: 
	   #1对多
       # echo 1{a..c}
       1a 1b 1c
       #多对多
       # echo {1..3}{a..c}
       1a 1b 1c 2a 2b 2c 3a 3b 3c
       #多对1
       #echo {1..3}a
       1a 2a 3a
       # echo A{,B}  ---> 实现快速备份数据 cp /oldboy/oldboy.txt{,.bak}
       A AB
       # echo A{B,}  ---> 实现快速还原数据 cp /oldboy/oldboy.txt{.bak,}
	   AB A
7)系统正则符号:
      特点(概念):
		正则符号主要用于匹配字符信息
  	    正则符号主要匹配文件内容信息
		正则符号主要匹配的是文件名称
		正则符号只有三剑客命令可以识别
		正则符号可以用于分析数据
	基础正则符号(grep  sed   awk):
		^	匹配以什么开头的信息       文件名称以什么信息开头
		$	匹配以什么结尾的信息       文件名称以什么信息结尾
		^$	匹配空行信息
		.	匹配任意一个字符
		*	匹配符号前面一个字符连续出现0次或者多次
		.*	匹配任意字符
		\	转义(将意思进行转变)符号
     	     \t  ---制表符号    \n  ---换行符号      \r  ---换行符
		[]	匹配多个字符信息
		[^]	匹配多个字符信息并进行取反
	扩展正则符号(egrep/grep -E     sed -r    awk):
		+	匹配符号前面一个字符连续出现1次或者多次
		?	匹配符号前面一个字符连续出现0次或者1{}	匹配符号前面一个字符连续出现指定次数
		    {n,m}	匹配到的字符最少出现n次,最多出现m次
		    {,m}	匹配到的字符最少0次,最多出现m次
		    {n,}	匹配到的字符最少出现n次,最多0{n}		匹配到的字符正好n次
		|	匹配多个字符串信息
		()	将多个字符信息汇总成一个整体
			后项引用前项信息
============================================================================
	补充: 如何查看一行后面是否有空格
	方法一: 
	cat -A 文件信息
	方法二:
	vim 文件信息---> :set list
============================================================================

附赠补充正则符号和其他正则部分组合符号
在这里插入图片描述

[a-z0-9A-Z]   	表示字符范围
  \+  			一次或多次 
  \?   			零次或一次 
  \| 			表示或语法
8)实际操作
1>在某文件中找出以“m”开头的文件行   
	 grep "^m"  文件
	 例如:
	 [root@znix ~]# grep "^m" oldboy.txt
     my blog is http://oldboy.blog.51cto.com
     my qq num is 49000448.
     my god ,i am not oldbey,but OLDBOY!

2>在某文件中找出以“m”结尾的文件行
	 grep "m$"  文件
	 例如:
	 [root@znix ~]# grep "m$" oldboy.txt
     my blog is http://oldboy.blog.51cto.com
 
3>在某文件中找出以“a”开头并且以“b”结尾的文件行
	 grep "^a.*b$"  文件
	 [root@znix ~]# grep "^a.*b$" oldboy.txt
	 ankh   ohma zi-o  grond  zi-o  honeycomb
4>在某文件中找出以“oldb”开始并且以“d”结尾的单词所在行
	 grep "oldb.y"  文件
     例如:
	 [root@znix ~]# grep "oldb.y" oldboy.txt
	 I am oldboy teacher!
	 my blog is http://oldboy.blog.51cto.com
	 my god ,i am not oldbey,but OLDBOY!
   	 [root@znix ~]# grep -o "oldb.y" oldboy.txt
	 oldboy
	 oldboy
	 oldbey
5>在某文件中匹配“o”的出现次数
     grep  ""
	 [root@oldboy69 oldboy 08:49:54]# grep "g.d"  test01.txt 
	 god
	 [root@oldboy69 oldboy 08:50:28]# grep "g..d"  test01.txt 
	 good
	 [root@oldboy69 oldboy 08:50:49]# grep "g...d"  test01.txt 
	 goood
	 [root@oldboy69 oldboy 08:50:53]# grep ".d"  test01.txt 
	 gd
     god
     good
     goood
     gooood
     [root@oldboy69 oldboy 08:51:18]# grep "o*"  test01.txt
     gd
     god
     good
     goood
     gooood
6>在文件中找出不以字母数字结尾的文件行

	 [root@shiyi bonian02 20:47:53]# grep "[^0-9a-zA-Z]$"  bonian.txt   
 	 m oldboy teacher!
	 I teach linux.
 	 I like badminton ball ,billiard ball and chinese chess!
 	 my qq num is 49000448.
	 not 4900000448.
	 my god ,i am not oldbey,but OLDBOY!

2. 三剑客命令grep
概述:
	命令用于查找文件里符合条件的字符串
语法格式:
	grep  [参数]  ‘条件 ’  文件
重要参数总结:
	-i   --- 忽略大小写搜索信息
	-n   --- 搜索信息后显示行号
	-c   --- 统计筛选出来的行数
	-v   --- 将搜索信息进行取反
	-o   --- 只输出显示匹配信息
	-w   --- 按照字符串进行匹配
	-A   --- 过滤指定内容之后的信息
	-B   --- 过滤指定内容之前的信息
	-C   --- 过滤指定内容上下几行的信息 
	-D	 --- 设置对设备,FIFO,管道的操作,读取,跳过
	-F	 --- 一个换行符分隔的字符串的集合fgrep
	-G	 --- 基本正则
	-E   --- 识别扩展正则信息
	-e   --- 指定字符串做为查找文件内容
	-r   --- 递归搜索指定数据信息
	-d	 --- 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作
	-s   --- 不显示错误信息
	-q   --- 不显示任何信息
	-l   --- 列出文件内容符合指定的样式的文件名称
	-L   --- 列出文件内容不符合指定的样式的文件名称
	-y   --- 此参数的效果和指定"-i"参数相同
	-H   --- 在显示符合样式的那一行之前,显示该行所属的文件名称
	-h   --- 在显示符合样式的那一行之前,不显示该行所属的文件名称
    -P   --- 调用的perl正则
    -f   --- 从文件中获得匹配模式
    -x   --- 匹配整行
    -z   --- 一个0字节的数据行,但不是空行
    -m   --- 匹配的最大数
    -b   --- 打印匹配行前面打印该行所在的块号码。
    -a   --- 匹配二进制的东西
    -I   --- 不匹配二进制的东西
    -d   --- 目录操作,读取,递归,跳过
    -R   --- 递归调用
    -Z   ---FILE 文件最后打印空字符 
    -U   --- 使用标志高亮匹配字串;
    -u   ---CR 字符不存在,报告字节偏移(MSDOS 模式)
实战演练:
1、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:
	grep test *file 
	结果如下所示:
	$ grep test test* #查找前缀有“test”的文件包含“test”字符串的文件  
	testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行  
	testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行  
	testfile_2:Linux test #列出testfile_2 文件中包含test字符的行 

2、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,
   并打印出该字符串所在行的内容,使用的命令为:
	grep -r update /etc/acpi 
	输出结果如下:
	$ grep -r update /etc/acpi #以递归的方式查找“etc/acpi”  
	#下包含“update”的文件  
	/etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause 	a lot of IO.)  
	Rather than  
	/etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of  
	IO.) Rather than  
	/etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update 

3、反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。
查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:
	grep -v test *test*
	结果如下所示:
	$ grep-v test* #查找文件名中包含test 的文件中不包含test 的行  
	testfile1:helLinux!  
	testfile1:Linis a free Unix-type operating system.  
	testfile1:Lin  
	testfile_1:HELLO LINUX!  
	testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.  
	testfile_1:THIS IS A LINUX TESTFILE!  
	testfile_2:HELLO LINUX!  
	testfile_2:Linux is a free unix-type opterating system

4. 场景: 系统报警显示了时间,但是日志文件太大无法直接 cat 查看。(查询含有特定文本的文件,并拿到这些文本所在的行)
	grep -n '2019-10-24 00:01:11' *.log
	查看符合条件的日志条目。
	free-coder
  	free-coder


5. Linux 里利用 grep 和 find 命令查找文件内容
   从文件内容查找匹配指定字符串的行:
	$ grep "被查找的字符串" 文件名
	例子:在当前目录里第一级文件夹中寻找包含指定字符串的 .in 文件
	grep "thermcontact" /.in

	从文件内容查找与正则表达式匹配的行:
	$ grep –e "正则表达式" 文件名
	查找时不区分大小写:
	$ grep –i "被查找的字符串" 文件名
	查找匹配的行数:
	$ grep -c "被查找的字符串" 文件名

	从文件内容查找不匹配指定字符串的行:
	$ grep –v "被查找的字符串" 文件名

	从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 "ERROR" 的行:
	$ find / -type f -name "*.log" | xargs grep "ERROR"
	例子:从当前目录开始查找所有扩展名为 .in 的文本文件,并找出包含 "thermcontact" 的行:
	find . -name "*.in" | xargs grep "thermcontact"
	在文件中搜索一个单词,命令会返回一个包含“match_pattern”的文本行:
	grep match_pattern file_name
	grep "match_pattern" file_name
	
	在多个文件中查找:
	grep "match_pattern" file_1 file_2 file_3 ...
	
	输出除之外的所有行 -v 选项:
	grep -v "match_pattern" file_name
	
	标记匹配颜色 --color=auto 选项:
	grep "match_pattern" file_name --color=auto

	使用正则表达式 -E 选项:
	grep -E "[1-9]+"
	或
	egrep "[1-9]+"

	只输出文件中匹配到的部分 -o 选项:
	echo this is a test line. | grep -o -E "[a-z]+\."
	line.
	echo this is a test line. | egrep -o "[a-z]+\."
	line.

	统计文件或者文本中包含匹配字符串的行数 -c 选项:
	grep -c "text" file_name

	输出包含匹配字符串的行数 -n 选项:
	grep "text" -n file_name
	或
	cat file_name | grep "text" -n

	#多个文件
	grep "text" -n file_1 file_2

	打印样式匹配所位于的字符或字节偏移:
	echo gun is not unix | grep -b -o "not"
	7:not

	#一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项 -b -o 一般总是配合使用。
	搜索多个文件并查找匹配文本在哪些文件中:
	grep -l "text" file1 file2 file3...
	grep递归搜索文件

	在多级目录中对文本进行递归搜索:
	grep "text" . -r -n
	# .表示当前目录。

	忽略匹配样式中的字符大小写:
	echo "hello world" | grep -i "HELLO"
	hello

	选项 -e 制动多个匹配样式:
	echo this is a text line | grep -e "is" -e "line" -o
	is
	line

	#也可以使用-f选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。
	cat patfile
	aaa
	bbb

	echo aaa bbb ccc ddd eee | grep -f patfile -o
	在grep搜索结果中包括或者排除指定文件:

	#只在目录中所有的.php和.html文件中递归搜索字符"main()"
	grep "main()" . -r --include *.{php,html}

	#在搜索结果中排除所有README文件
	grep "main()" . -r --exclude "README"

	#在搜索结果中排除filelist文件列表里的文件
	grep "main()" . -r --exclude-from filelist
	
	使用0值字节后缀的grep与xargs:
	#测试文件:
	echo "aaa" > file1
	echo "bbb" > file2
	echo "aaa" > file3
	
	grep "aaa" file* -lZ | xargs -0 rm

	#执行后会删除file1和file3,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 
	读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。
	grep静默输出:
	grep -q "test" filename

	#不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。
	打印出匹配文本之前或者之后的行:

	#显示匹配某个结果之后的3行,使用 -A 选项:
	seq 10 | grep "5" -A 3
	5
	6
	7
	8

	#显示匹配某个结果之前的3行,使用 -B 选项:
	seq 10 | grep "5" -B 3
	2
	3
	4
	5

	#显示匹配某个结果的前三行和后三行,使用 -C 选项:
	seq 10 | grep "5" -C 3
	2
	3
	4
	5
	6
	7
	8

	#如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
	echo -e "a\nb\nc\na\nb\nc" | grep a -A 1
	a
	b
	--
	a
	b
3. 三剑客命令sed
sed作用:
	1)可以查找过滤筛选出指定的信息
	2)擅长编辑文件内容信息
	3)擅长对文件行进行操作
语法格式:
	sed [参数] '条件 指令' 文件信息
	参数:
	-n   --- 取消模式输出
	-i   --- 真正编辑文件内容
	-r   --- 识别扩展正则 
	-e   --- 识别多个条件操作
	-f   --- 直接将 sed 的动作写在一个文件内,-f filename 则可以运行filename 内的
sed动作指令 
	 p    --- 输出操作
	 d    --- 删除操作
	 a    --- 附加操作
	 i    --- 插入操作
	 c    --- 取代操作:c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
	 s    --- 替换操作
	 g    --- 全局替换 
	 w    --- 表示把行写入一个文件。  
	 x    --- 表示互换模板块中的文本和缓冲区中的文本。  
	 y    --- 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
	 \1   --- 子串匹配标记
	 &    --- 已匹配字符串标记
	a\   --- 在当前行下面插入文本。
 	i\   --- 在当前行上面插入文本。
 	c\   --- 把选定的行改为新的文本。
	 D   --- 删除模板块的第一行。
	 h   --- 拷贝模板块的内容到内存中的缓冲区。
	 H   --- 追加模板块的内容到内存中的缓冲区。
	 G   --- 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
	 l   --- 列表不能打印字符的清单。
	 N   --- 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
	 P   --- 打印模板块的第一行。
	 q   --- 退出Sed。
	 b   --- 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
	 t   --- if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
	 T   --- 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
	 w   --- 写并追加模板块到file末尾。  
	 W   --- 写并追加模板块的第一行到file末尾。    

使用方法:
	熟悉sed命令查询操作:
		(1)根据行号进行查询:
			单行查询:sed -n  '3p'    文件
			连续多行查询:sed -n '1,3p'    文件
                     	sed -n  '2,$p'    文件
			不连续多行查询:sed  -n  '1p;3p;5p'     文件
		(2)根据字符进行查询:
			单行查询:sed -n  '/字符信息/p'    文件
			连续多行查询:sed -n  '/字符信息1/,/字符信息2/p'    文件
			不连续多行查询:sed  -n '/字符信息1/p;/字符信息2/p;/字符信息3/p' 文件
	熟悉sed命令增添操作:a--在某一行或几行的下一行添加
                      i--在某一行或几行的上一行添加
                      $--在文件最后一行后添加信息
		(1)根据行号进行增添:
			单行增添:sed '1a信息' 文件
			连续多行增添:sed '1,3a信息' 文件 
			不连续多行增添:sed  -e '1a信息'  -e '3a信息' -e  '5a信息'  文件 
		(2)根据字符进行增添:
			单行增添:sed '/字符信息/a信息' 文件
			连续多行增添:sed '/字符信息/,/字符信息/a信息' 文件  
			不连续多行增添:sed  -e '/字符信息/a信息' -e '/字符信息/a信息' -e '/字符信息/a信息'  文件 
	熟悉sed命令删除操作: 不加参数就不会真正删除,真正删除加参数-i
                      -i ---将模式空间内容覆盖到block中进行删除
		(1)根据行号进行删除:
			单行删除:sed '6d'   文件
			连续多行删除:sed '6,9d'   文件
			不连续多行删除:sed '6p;9p'    文件
		(2)根据字符进行删除:
			单行删除:sed   '/字符信息/d'    文件
			连续多行删除:sed   '/字符信息1/,/字符信息2/d'    文件
			不连续多行删除:sed '/字符信息1/d;/字符信息2/d;/字符信息3/d'  文件
	熟悉sed命令修改操作:	
		(1)根据行号进行修改:
			单行修改:sed '3s#文件内需要修改的内容#修改完后的内容#g'   文件
			连续多行修改:sed '2,4s#文件内需要修改的内容#修改完后的内容#g'  文件
		(2)根据字符进行修改:
			单行修改:sed '/字符信息/s#文件内需要修改的内容#修改完后的内容#g' 文件
			连续多行修改:sed '/字符信息/,/字符信息/s#文件内需要修改的内容#修改完后的内容#g' 文件
实战演练:
  //test.txt 内容如下
 	11 aa
 	22 bb
 	33 cc
 	23 dd
 	55 2e
删除行:
  按照行号删除:
	[root@shiyi bonian02 16:59:30]# sed '1d' test.txt
 	22 bb
	33 cc
	23 dd
	55 2e
	[root@shiyi bonian02 16:59:30]# sed '2,5d' test.txt   删除带字符‘2’的行
	11 aa
 	55 2e
	[root@shiyi bonian02 16:59:30]# sed '2d,4d' test.txt 删除以字符‘2’开头的行
	11 aa
	33 cc
	55 2e
  按照字符删除:
	[root@shiyi bonian02 16:59:30]# sed '/11 aa/d' test.txt
 	22 bb
	33 cc
	23 dd
	55 2e
	[root@shiyi bonian02 16:59:30]# sed '/22 bb/,/55 2e/d' test.txt   删除带字符‘2’的行
	11 aa
 	55 2e
	[root@shiyi bonian02 16:59:30]# sed '/22 bb/d,/23 dd/d' test.txt 删除以字符‘2’开头的行
	11 aa
	33 cc
	55 2e

新增行:
  按照行号增加:a--在某一行或几行的下一行添加  i--在某一行或几行的上一行添加
	[root@shiyi bonian02 16:59:30]# sed '1a hello world' test.txt
	11 aa
	hello world
	22 bb
 	33 cc
 	23 dd
 	55 2e
	[root@shiyi bonian02 16:59:30]# sed '1i hello world' test.txt
	hello world
 	11 aa
 	22 bb
 	33 cc
 	23 dd
 	55 2e
  按照字符增加:
	[root@shiyi bonian02 16:59:30]# sed '/11 aa/a hello world' test.txt
	11 aa
	hello world
	22 bb
 	33 cc
 	23 dd
 	55 2e
	[root@shiyi bonian02 16:59:30]# sed '/11 aa/i hello world' test.txt
	hello world
 	11 aa
 	22 bb
 	33 cc
 	23 dd
 	55 2e

替换行
  按照行号替换:
	[root@shiyi bonian02 16:59:30]# sed '1c hello world' test.txt
	hello world
	22 bb
 	33 cc
 	23 dd
 	55 2e
	[root@shiyi bonian02 16:59:30]# sed '2,4c hello world' test.txt
	11 aa
 	hello world
 	33 cc
	hello world
	55 2e
  按照字符替换:
	[root@shiyi bonian02 16:59:30]# sed '/11 aa/c hello world' test.txt
	hello world
	22 bb
 	33 cc
 	23 dd
 	55 2e
	[root@shiyi bonian02 16:59:30]# sed '/22 bb/c,/23 dd/c hello world' test.txt
	11 aa
 	hello world
 	33 cc
	hello world
	55 2e

替换部分内容
	[root@shiyi bonian02 16:59:30]# sed 's#aa#AA#g' test.txt
	11 AA
 	22 bb
 	33 cc
	23 dd
 	55 2e
	s#需要替换的内容信息#替换后的内容信息#(g)
	当不加上"g"时只会将字符串开头的进行替换
	而加上"g"时会进行全局替换
	  PPS:当然表示分隔的不止#,还有/,@等
==========================================================================
为了更好地体现 s#需要替换的内容信息#替换后的内容信息#(g) 的效果,将文件内容进行增添:
//test.txt
 11 aa
 22 bb
 33 cc
 23 dd
 55 2e
 66 aaff ccaa
 zz ggaa
==========================================================================
	[root@shiyi bonian02 16:59:30]# sed 's#aa#AA#' test.txt
	11 AA
	22 bb
	33 cc
	23 dd
	55 2e
	66 AAff ccaa
	zz ggAA
	[root@shiyi bonian02 16:59:30]# sed 's#aa#AA#g' test.txt
	11 AA
	22 bb
	33 cc
	23 dd
	55 2e
	66 AAff ccAA
	zz ggAA
替换指定行的内容:
	[root@shiyi bonian02 16:59:30]# sed '1s#aa#AA#g' test.txt
	11 AA
	22 bb
	33 cc
	23 dd
	55 2e
	66 aaff ccaa
	zz ggaa

	[root@shiyi bonian02 16:59:30]# sed '5,$s#aa#AA#g' test.txt
	11 aa
 	22 bb
 	33 cc
 	23 dd
 	55 2e
 	66 AAff ccAA
 	zz ggAA
	[root@shiyi bonian02 16:59:30]# sed '/^[0-9]/s#aa#AA#g' test.txt
	11 AA
 	22 bb
 	33 cc
 	23 dd
 	55 2e
 	66 AAff ccAA
 	zz ggaa

==========================================================================
为了更直观的表示查询效果,更改文件内容如下:
//test.txt
 11 aa
 22 bb
 33 cc
 23 dd
==========================================================================
	[root@shiyi bonian02 16:59:30]# sed '2p' test.txt
	11 aa
 	22 bb
 	22 bb
 	33 cc
 	23 dd
	可以看到第二行被输出来了,但是将文件的所有内容输出了一遍,且第2行则多输出了一次
    这是因为文件内容默认输出了,可以用-n取消默认输出
	[root@shiyi bonian02 16:59:30]# sed -n '2p' test.txt
	22 bb
	[root@shiyi bonian02 16:59:30]# sed -i '2d' test.txt 
	加上-i参数在运行命令之后,我们发现test.txt的第2行没有了,因为不论是删除,替换,添加都是在内容中进行,不会对磁盘内容有任何影响,
	加上-i参数后,会将内存的内容对磁盘内容进行覆盖从而真正改变文件内容
4. 三剑客命令awk
1) 三剑客awk命令概述介绍:
	awk - pattern scanning and processing language
         模式扫描(处理文件每一行信息) 过程语言(一门脚本语言 逻辑语句(循环/判断))
	作用说明:
	1) 擅长对文件列进行操作
	2) 擅长统计分析数据信息
2) 三剑客awk命令执行原理:
3) 三剑客awk命令语法结构:
	awk [参数] '模式{动作信息}'  文件信息
	awk [options] 'script' var=value file(s) 
	awk [options] -f scriptfile var=value file(s)
   使用方法:
	参数:	-F 指定列分隔
	        -v 在awk程序开始之前指定一个值valu给变量var,这些变量值用于awk程序的BEGIN-f 后面跟一个保存了awk程序的文件,代替在命令行指定awk程序
    动作信息:print:参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分
            printf:其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂
			gsub: awk替换信息方法:
			       gsub(/替换的信息/,"要替换成什么",$n替换的第几列信息)
    模式信息:BEGIN 	用于初始化FS变量(列分隔符),打印标题,或者初始化后需要在程序中调用的全局变量
			END	用于执行最后的运算或者打印最终的输出结果
    	    END块和BEGIN不是必须的
    内置变量:
    		NR:	表示行号信息
			NF:	当前行中有多少列
			$NF:	当前行最后一列的内容(如果每一行有多列内容)
			FS:	表示分隔符字段信息

;awk提供了多个比较操作符:"=="  ">" "<"  "<=" ">="  "!="   "~"匹配  "!~"不匹配

三剑客awk命令执行原理(图解):
在这里插入图片描述

4) 三剑客awk命令实操练习:
==========================================================================
准备环境:
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
==========================================================================1)awk '{print}'   文件信息     #逐行读取文件并输出到界面
		[root@shiyi bonian02 20:11:05]# awk '{print}' awk.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:1752)awk '{print $n}'   文件信息    #逐列读取文件并输出第n列到界面(当n=0时,保留当前行所有内容)
		[root@shiyi bonian02 20:13:39]# awk '{print $1}' awk.txt 
		Zhang
		Zhang
		Meng
		Wu
		Liu
		Wang
		Zi
		Li
		Lao
		[root@shiyi bonian02 20:22:16]# awk '{print $0}' awk.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:1753)awk '{print "Xiaoyu"}' 文件信息  #逐行读取文件,每行结束后打印一次Xiaoyu,文件有多少行就打印多少个Xiaoyu
		[root@shiyi bonian02 20:19:59]# awk '{print "Xiaoyu"}' awk.txt 
		Xiaoyu
		Xiaoyu
		Xiaoyu
		Xiaoyu
		Xiaoyu
		Xiaoyu
		Xiaoyu
		Xiaoyu
		Xiaoyu
	(4)awk  -F ":" '{print $1}' 文件   #以":"为分隔符打印文件的第一例内容
		[root@shiyi bonian02 20:28:51]# awk  -F ":" '{print $1}' awk.txt 
		Zhang  Dandan    41117397    
		Zhang  Xiaoyu    390320151   
		Meng   Feixue    80042789    
		Wu     Waiwai    70271111    
		Liu    Bingbing  41117483    
		Wang   Xiaoai    3515064655  
		Zi     Gege      1986787350  
		Li     Youjiu    918391635   
		Lao    Nanhai    9183916355)awk '/Xiaoyu/{print}'  文件  #打印文件中匹配Xiaoyu的那一行内容
		[root@shiyi bonian02 20:29:09]# awk '/Xiaoyu/{print}' awk.txt
		Zhang  Xiaoyu    390320151   :155:90:2016)awk -F ":"  '/Xiaoyu/{print $3}' 文件  #以":"为分隔符打印文件中匹配Xiaoyu的那一行中的第三列的内容
		[root@shiyi bonian02 20:38:33]# awk -F ":" '/Xiaoyu/{print $3}' awk.txt
		907)awk '$2~/Xiaoyu/{print $3}'  文件 #打印文件中,第二列匹配Xiaoyu的行其第三列的内容 ~表示匹配(以空格为分隔符)
		[root@shiyi bonian02 11:36:25]# awk '$2~/Xiaoyu/{print $3}' awk.txt
		3903201518)awk -F ":" '$1~/Xiaoyu/{print $3}'  文件 #打印文件中,第一列匹配Xiaoyu的行其第三列的内容 ~表示匹配(以":"为分隔符)
		[root@shiyi bonian02 11:20:25]# awk -F ":" '$1~/Xiaoyu/{print $3}' awk.txt
		909)awk 'BEGIN {FS=":"} {if ($1~/Xiaoyu/) {print $2}}'  文件 # 以":"为分隔符,打印文件中第一列匹配Xiaoyu的行,其第二列的内容
		[root@shiyi bonian02 11:40:23]# awk 'BEGIN {FS=":"} {if ($1~/Xiaoyu/) {print $2}}' awk.txt
		15510)awk 'BEGIN {FS=":"} ($1~/Xiaoyu/ || $2~/175/) {print $3}' 文件# 以":"为分隔符,打印文件中,第一列匹配Xiaoyu或者第二列匹配175的行,其第三列的内容
		[root@shiyi bonian02 13:57:13]# awk 'BEGIN {FS=":"} ($1~/Xiaoyu/ || $2~/175/) {print $3}' awk.txt
		90
		7511)awk '/111/{print NF}'' 文件 # 统计匹配ock的行有多少列
		[root@shiyi bonian02 16:55:33]# awk '/111/{print NF}' awk.txt 
		4
		5
		412)awk 'NF == 5 {print}'  文件  #打印文件中有5列的行的内容,示例中,第四行有五列,所以打印的就是第四行的内容
		[root@shiyi bonian02 17:12:16]# cat awk.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       Xiaoai
		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@shiyi bonian02 17:15:43]# awk 'NF==5 {print}' awk.txt
		Wu     Waiwai    70271111    :250:80:75       Xiaoai

 	(13)awk '{if (NR > 3) {print $NF} }' 文件   # 输出文件中行号大于3的行,其最后一列的内容
 		[root@shiyi bonian02 17:15:51]# awk '{if (NR > 3) {print $NF} }' awk.txt
		Xiaoai
		:250:100:175
		:50:95:135
		:250:168:200
		:175:75:300
		:250:100:17514)awk '{if (NR > 8) {print NR".\t"$0} }' 文件  #格式化输入文件中行号大于3的行的行号和内容
		[root@shiyi bonian02 17:17:51]# awk '{if (NR > 8) {print NR".\t"$0} }' awk.txt
		9.	Lao    Nanhai    918391635   :250:100:17515)awk 'BEGIN { x=0 } /^$/{x=x+1} END{print "find" " " x " " "blank lines"}'  文件  #统计文件中有多少空行
		[root@shiyi bonian02 17:25:05]# awk 'BEGIN {x=0} /^$/{x=x+1}END{print"find" ""x"" "blank lines"}' awk.txt
		find0blank lines

==========================================================================
awk脚本作用:打印文本中每一列的内容
#!/bin/bash
num=`wc 1.txt | awk '{print $2}'`   # 统计1.txt文件有多少列
for i in `seq 1 $num`            # 根据文件列数进行循环
do
 awk -v a=$i '{print $a}' 1.txt     # 打印每一列的内容,-v 参数可以指定一个变量保存外部变量的值,将外部变量传递给awk
done
==========================================================================

5) 三剑客awk命令高级功能:
   普通运算:
	[root@shiyi bonian02 20:09:39]# awk 'BEGIN{print 2+4}'
	6
	[root@shiyi bonian02 20:10:21]# awk 'BEGIN{print 2-4}'
	-2
	[root@shiyi bonian02 17:01:01]# awk 'BEGIN{print 2*4}'   
	8
	[root@shiyi bonian02 20:10:07]# awk 'BEGIN{print 2^4}'
	16
	[root@shiyi bonian02 20:10:15]# awk 'BEGIN{print 2%4}'
	 2
	[root@shiyi bonian02 20:10:15]# awk '{print ($2**2) +1}'  文件  
	#将文件中第二列内容做平方运算后再加1输入(字符串做平方运算后结果为0)
   统计分析数据信息:
	累加公式: i=i+1 ---(等同于)---> i++
	[root@shiyi bonian02 20:10:15]# cat test13.txt 
	   oldboy  
       oldgirl
       oldboy   
       olddog
       oldboy   
       oldbaby
    在文件中逐行读取,并‘oldboy’信息出现的次数(显示过程)
	[root@shiyi bonian02 20:10:15]# awk '/oldboy/{i=i+1;print i} test13.txt    
       1
       2
       3
    在文件中逐行读取,只输出次数结果(不显示过程)
	[root@shiyi bonian02 20:10:15]# awk '/oldboy/{i=i+1}END{print i}' test13.txt    
       3
	求和运算/累加运算:
	求和公式: i=i+$n   $n 需要将第几列做求和运算
	[root@shiyi bonian02 20:10:15]#cat test14.txt 
       1    
       2      
       3       
       4
       5
       6
       7
       8
       9
       10
	[root@shiyi bonian02 20:10:15]# awk '{i=i+$1;print i}' test14.txt 
       1
       3
       6
       10
       15
       21
       28
       36
       45
       55
	[root@shiyi bonian02 20:10:15]# awk '{i=i+$1}END{print i}' test14.txt
       55
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值