课程知识回顾
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