#

7. 三剑客命令

课程知识回顾

  1) 正则符号
	基础正则符号:
	^  以什么开头的信息进行匹配  ^oldboy
    $  以什么结尾的信息进行匹配  oldboy$
    ^$ 表示匹配空行信息
    .  匹配任意一个且只有一个字符 grep "." 
    *  匹配前一个字符连续出现0次或者多次
    .* 匹配所有任意信息 类似于通配符*
    \  将有意义的字符信息,转义成普通字符进行识别  --> 找出文件中以点结尾的信息
	   将特殊的扩展正则符号,转换成基础正则符号
	   将没有意义的字符信息转成有意义的字符
	   \n \r \t
	[] 匹配多个字符信息,多个字符匹配时,是或者的关系
	   [ok] 在文件中找有O的字符信息 找文件中有k的字符信息
	   PS: 将一个字符串信息,进行拆分成一个一个的字符进行匹配
   [^] 对匹配的字符信息进行排除
       [^ok]  在文件中找有O的字符信息 找文件中有k的字符信息,进行排除不要显示,显示其他信息
       [^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 命令概述

# 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 网卡地址信息存储到一个文件中 共享存储
	echo "服务器修改后的IP地址:$(hostname -I)" >> /tmp/oldboy.txt
    
# 具体功能作用:
  # 处理文件信息:
   	1. 文本文件信息(小文件)
   	2. 日志文件信息(grep awk 分析)
   	3. 配置文件信息(sed)
  # 处理文件方式
	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	

4.1 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

4.2 sed 命令添加信息方法

# 在文件第一行添加信息:
    100,oldgirl,UFO
	[root@oldboyedu ~]# sed  '1i100,oldgirl,UFO' person.txt    -i 实际修改
    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' 文件名称

4.3 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

4.4 sed 命令修改信息方法

# 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
    -rw-r--r--. 1 root root      0 Oct 10 02:10 oldboy04.txt
    -rw-r--r--. 1 root root      0 Oct 10 02:10 oldboy05.txt
    -rw-r--r--. 1 root root      0 Oct 10 02:10 oldboy06.txt
    -rw-r--r--. 1 root root      0 Oct 10 02:10 oldboy07.txt
    -rw-r--r--. 1 root root      0 Oct 10 02:10 oldboy08.txt
    -rw-r--r--. 1 root root      0 Oct 10 02:10 oldboy09.txt
    -rw-r--r--. 1 root root      0 Oct 10 02:10 oldboy10.txt
    
  # 批量修改文件的扩展名称 将oldboyxx.txt扩展名修改为oldboyxx.jpg	
	[root@oldboyedu oldboy]# ls oldboy*.txt|sed -r 's#(.*)txt#mv & \1jpg#g'   # & =ls oldboy*.txt 引用前面的查询结果
    mv oldboy01.txt oldboy01.jpg
    mv oldboy02.txt oldboy02.jpg
    mv oldboy03.txt oldboy03.jpg
    mv oldboy04.txt oldboy04.jpg
    mv oldboy05.txt oldboy05.jpg
    mv oldboy06.txt oldboy06.jpg
    mv oldboy07.txt oldboy07.jpg
    mv oldboy08.txt oldboy08.jpg
    mv oldboy09.txt oldboy09.jpg
    mv oldboy10.txt oldboy10.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

5. 文件中添加内容方法

	01. vim/vi 
	02. cat >>xxx<EOF .. EOF 
	03. echo -e "xxx\nxxx"
	04. sed 'na/i xxxx\nxxxx\nsxxxx'

6. 总结: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

7. 总结:sed 命令的参数信息

    -n  取消默认输出
    -r  识别扩展正则
    -i  真实编辑文件(将内存中的信息覆盖到磁盘中)	.bak 直接生成备份文件
	-e  识别sed命令多个操作指令

课程知识回顾

    1) sed流编辑命令
	2) 语法结构  sed 参数 [条件-处理方式:指令] 文件信息
	3) sed命令实际应用过程
	   文件中查询信息  参数-n	指令p
	   文件中增加信息        	  指令i a
	   文件中删除信息	参数-i	指令d
	   文件中替换信息	参数-i.bak  指令 s g c  后项引用前项 &

1. akw 概念介绍说明

# 处理文件信息:
	1.文本文件信息
	2.日志文件信息
	3.配置文件信息
# 作用特点:
	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

2.1 按照行号查询信息

# 按照行号查询信息:
	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

2.2 按照字符查询信息

# 按照字符查询信息:
    [root@oldboyedu ~]# awk '/Xiaoyu/' awk_test.txt
    Zhang	Xiaoyu		390320151	:155:90:201
    [root@oldboyedu ~]# awk '/Xiaoyu/,/Waiwai/' awk_test.txt
    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
    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 
    :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

    [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
    
    # gsub(/需要替换的信息/,"修改成什么信息",将哪列信息进行修改)
    [root@oldboyedu ~]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt 
    $155$90$201

3. 文件中空行进行排除/文件中注释信息进行排除

# 文件中空行进行排除/文件中注释信息进行排除
	grep -Ev "^#|^$"  文件信息 
	sed -n '/^#|^$/!p' 文件信息
	awk '/^#|^$/'
	
	[root@oldboyedu ~]# awk '$0~/^#|^$/'  awk_test.txt   --- $0:取所有列的信息
    #Liu    Bingbing 41117483    :250:100:175
    
    [root@oldboyedu ~]# awk '$0!~/^#|^$/'  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
    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 

4. 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

4.1 awk模式概念说明: 匹配的条件信息

# 普通的模式: 
	01. 正则表达式作为模式  
	    awk '/^oldboy/{print xx}'
	02. 利用比较匹配信息
	    NR==2
		NR>=2
	    NR<=2
	03. NR==2,NR==10
	
	
# 特殊的模式 BEGIN{}  END{}
	#BEGIN{}  在awk执行命令前做什么事情:
		1.用于测试
		2.用于计算
		3.修改内置变量
	[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

4.2 修改内置分隔符变量

  • FS 字符分隔符变量
  • NR 表示行号信息
  • NF 表示每一行有多少列
# -F ":" == BEGIN{FS=":"} == -vFS=":"	
	
	
	[root@oldboyedu ~]# 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
    操作结束

4.3 统计累加运算测试:

# 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

4.4 求和运算

# 求和运算:
	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. 总结正则符号
02. 总结sed命令
03. 总结find tar date

==================
01 求出测试文件中 所有人第一次捐款的总额和第三次捐款总额
   显示表头 
   第一总额  第三次总额 	
   xxx        xxxx	
posted @ 2020-08-06 18:41  苒苒物华休&  阅读(308)  评论(0编辑  收藏  举报