SHELL编程之三剑客
操作系统三剑客命令
基础知识
- 正则符号
基础正则符号:
^ 以什么开头的信息进行匹配----- ^oldboy
$ 以什么结尾的信息进行匹配----- oldboy$
^$ 表示匹配空行信息
. 匹配任意一个且只有一个字符 grep “.”
* 匹配前一个字符连续出现0次或者多次
.* 匹配所有任意信息 类似于通配符 *
\ 将有意义的字符信息,转换成普通的字符进行识别
—>找出文件中以点结尾的信息
将特殊的扩展正则符号,转换成基础正则符号
将没有意义的字符转换成有意义的字符,(\n \t \r)
[ ] 匹配多个字符信息,多个字符信息匹配时是或者的关系
[ok] 在文件中找到有o的字符信息,有k的信息
**ps:**将一个字符串信息,进行拆分成一个一个的字符进行匹配
[^] 对匹配的字符进行排除(反选)
[^ok] 在文件中找到有o的字符信息和有k的字符信息,进行排除,选择其他的信息
扩展正则符号:
+ 匹配前一个字符连续出现一次或多次
| 利用竖线可以匹配多个字符信息
() 将多个字符信息汇总成一个整体,进行过滤
进行后项引用前项 (oldboy)\1–sed
{} 指定匹配前一个字符连续出现多少次
{n,m} 至少连续n次,最多连续m次
{n} 匹配只连续n次的信息
{n,} 至少连续n次,至多不限
{,m} 至少连续0次,至多连续m次
? 匹配前一个字符连续出现0次或者1次
grep命令识别扩展正则:egrep -E
sed命令识别扩展正则:sed -r
sed命令
sed命令概述说明:
sed命令:字符流编辑工具 (行编辑工具)==按照每行中的字符进行处理操作
ps:全屏编辑工具 vi/vim
sed命令作用说明:
擅长对行进行操作处理
擅长将文件的内容信息进行修改调整/删除
编写脚本:修改文件内容时
网络服务中的IP地址进行修改:
第一个步骤:vi ifcfg-eth0
第二个步骤:重启网络服务
第三个步骤:检查测试
具体功能作用:
- 文件中添加信息的能力(增)
- 文件中删除信息的能力(删)
- 文件中修改信息的能力(改)
- 文件中查寻信息的能力(查)
sed命令的语法信息
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
命令 参数 条件-处理(指令) 处理文件信息# 显示文件中有oldboy的信息
sed -n 'oldboy' oldboy.txt
sed命令执行原理
sed命令实践测试—查看信息
# 测试信息
cat >person.txt<<EOF
101,oldboy,CEO
102,zhangyang,CTO
103,Alex,COO
104,YY,CFO
105,feixue,CIO
EOF# 测试1 将有oldboy行的信息找出来
[root@wenyi] ~]# sed -n '/oldboy/p' person.txt
101,oldboy,CEO[root@wenyi] ~]# sed -n '1p' person.txt
101,oldboy,CEO# 测试2 将有oldboy到Alex行的信息都输出出来
[root@wenyi] ~]# sed -n '/oldboy/,/Alex/p' person.txt
101,oldboy,CEO
102,zhangyang,CTO
103,Alex,COO[root@wenyi] ~]# sed -n '1,3p' person.txt
101,oldboy,CEO
102,zhangyang,CTO
103,Alex,COO# 测试3 将有oldboy的行和Alex的行的信息输出出来
[root@wenyi] ~]# sed -n '/oldboy/p;/Alex/p' person.txt
101,oldboy,CEO
103,Alex,COO[root@wenyi] ~]# sed -n '1p;3p' person.txt
101,oldboy,CEO
103,Alex,COO
sed命令添加信息的方法
- 在文件第一行添加信息
# 在要输入的信息前面添加'行号+i'
[root@wenyi] ~]# sed '1i100,oldgrile,UFO' person.txt
100,oldgrile,UFO
101,oldboy,CEO
102,zhangyang,CTO
103,Alex,COO
104,YY,CFO
105,feixue,CIO
- 在文件最后一行添加信息
# 在要添加的文件前面添加$a($:表示行号,可以是数字,但是如果不知道最后一行是多少行的时候 就用$)
[root@wenyi] ~]# sed '$a100,oldgrile,UFO' person.txt
101,oldboy,CEO
102,zhangyang,CTO
103,Alex,COO
104,YY,CFO
105,feixue,CIO
100,oldgrile,UFO
测试
# 在第三行后面添加oldboy.txt信息
[root@wenyi] ~]# sed '3aoldboy.txt' person.txt
101,oldboy,CEO
102,zhangyang,CTO
103,Alex,COO
oldboy.txt
104,YY,CFO
105,feixue,CIO# 在第二行前面添加olddoy信息
[root@wenyi] ~]# sed '2ioldboy' person.txt
101,oldboy,CEO
oldboy
102,zhangyang,CTO
103,Alex,COO
104,YY,CFO
105,feixue,CIO# 在有oldboy的行的前面添加oldgirl,后面添加olddog的信息
[root@wenyi] ~]# sed -e '/oldboy/ioldgirl' -e '/oldboy/aolddog' person.txt
oldgirl
101,oldboy,CEO
olddog
102,zhangyang,CTO
103,Alex,COO
104,YY,CFO
105,feixue,CIO# 添加多行信息 sed '$a 内容 \n 内容' 文件名
[root@wenyi] ~]# sed '$a100\n101' person.txt
101,oldboy,CEO
102,zhangyang,CTO
103,Alex,COO
104,YY,CFO
105,feixue,CIO
100
101
sed命令删除信息方法
# 删除单行信息
[root@wenyi] ~]# cat person.txt
101,oldboy,CEO
102,zhangyang,CTO
103,Alex,COO
104,YY,CFO
105,feixue,CIO# 删除第3行信息
[root@wenyi] ~]# sed '3d' person.txt
101,oldboy,CEO
102,zhangyang,CTO
104,YY,CFO
105,feixue,CIO# 删除有oldboy的行
[root@wenyi] ~]# sed '/oldboy/d' person.txt
102,zhangyang,CTO
103,Alex,COO
104,YY,CFO
105,feixue,CIO# 删除多行信息
# 删除2~6行信息
[root@wenyi] ~]# sed '2,5d' person.txt
101,oldboy,CEO# 删除第2行和第5行的信息
[root@wenyi] ~]# sed '2d;5d' person.txt
101,oldboy,CEO
103,Alex,COO
104,YY,CFO# 删除文件的中空行
[root@wenyi] ~]# cat person.txt
101,oldboy,CEO102,zhangyang,CTO103,Alex,COO104,YY,CFO105,feixue,CIO# 方法1 找到空行反选方法
[root@wenyi] ~]# sed -n '/^$/!p' person.txt
101,oldboy,CEO
102,zhangyang,CTO
103,Alex,COO
104,YY,CFO
105,feixue,CIO# 方法2 找到空行删除
[root@wenyi] ~]# sed '/^$/d' person.txt
101,oldboy,CEO
102,zhangyang,CTO
103,Alex,COO
104,YY,CFO
105,feixue,CIO
sed命令修改信息方法
# sed 's###g'
# sed 's#原有内容#修改后的内容#g' 文件信息
[root@wenyi] ~]# sed 's##oldgirl#old#g' person.txt
sed: -e expression #1, char 12: unknown option to `s'
[root@wenyi] ~]# sed 's/#oldgirl/old/g' person.txt
101,oldboy,CEO102,zhangyang,CTO103,Alex,COO104,YY,CFO105,feixue,CIO# 补充01
# 修改文件内容直接进行备份
[root@wenyi] ~]# sed -i.bak 's#oldboy#oldgirl#g' person.txt
[root@wenyi] ~]# ll person.txt.bak
-rw-r--r-- 1 root root 72 Aug 10 21:36 person.txt.bak# 补充02
# 在生产环境中n和i不能同时使用,会清空文件
[root@wenyi] ~]# sed -ni 's#Alex#aaa#g' person.txt
[root@wenyi] ~]# cat person.txt
[root@wenyi] ~]#
扩展
# 批量重命名专业命令 rename
rename .txt .jpg oldbot*.txt
#命令 原文件需要修改的信息 要修改成的信息 将什么样的文件进行修改
总结:sed命令的指令信息
- p print 输出信息
- i insert 插入信息,在指定的信息前面插入新的信息
- a append 附加信息,在指定信息后面附加新的信息
- d delete 删除信息
- s substitute 替换 替换信息 s###g
- c 替换一整行的信息
总结:sed命令的参数信息
- -n 取消默认输出
- -r 识别扩展正则
- -i 真是编辑文件(将内存中的信息覆盖到磁盘中)
- -e 识别sed命令多个操作命令
awk
awd简介:awk是处理列文件的(擅长处理日志文件),全名是gawk
[root@wenyi] ~]# ls -l `which awk`
lrwxrwxrwx. 1 root root 4 Jun 25 07:19 /usr/bin/awk -> gawk
awk概念介绍
作用特点:
- 排除信息
- 查询信息
- 统计信息
- 替换信息
语法格式:
awk [参数] '模式-动作' 文件
awk实际操作
测试环境
[root@wenyi] ~]# cat awk_test.txt
1.Zhang Dandam 56263673 :250:100:165
2.Zhang Xiaoyu 69386058 :166:453:937
3.Meng Feixu 72382065 :123:534:738
4.Wu Wasfg 42501510 :234:123:421
5.Liu Mgale 25023105 :345:156:091
6.Ma Wenti 69783656 :981:236:831
7.Wang meng 95473126 :632:743:214
8.Liang glahga 26276626 :522:734:452
9.Sgghe Ghggag 65908236 :523:744:278
命令查询信息方法
# 按照行号查询信息:
# 查询第二行的信息
[root@wenyi] ~]# awk 'NR==2' awk_test.txt
Zhang Xiaoyu 69386058 :166:453:937# 查询第2行到第4行
[root@wenyi] ~]# awk 'NR==2,NR==4' awk_test.txt
Zhang Xiaoyu 69386058 :166:453:937
Meng Feixu 72382065 :123:534:738
Wu Wasfg 42501510 :234:123:421# 查询第3行和第5行
[root@wenyi] ~]# awk 'NR==3;NR==5' awk_test.txt
Meng Feixu 72382065 :123:534:738
Liu Mgale 25023105 :345:156:091# 注意在Linux系统中oldboy=1(赋值变量),oldboy==2(真正的oldboy等于2)
按照字符查询信息:
# 查找有Xiaoyu的行
[root@wenyi] ~]# awk '/Xiaoyu/' awk_test.txt
Zhang Xiaoyu 69386058 :166:453:937# 查找Xiaoyu到meng的行
[root@wenyi] ~]# awk '/Xiaoyu/,/meng/' awk_test.txt
Zhang Xiaoyu 69386058 :166:453:937
Meng Feixu 72382065 :123:534:738
Wu Wasfg 42501510 :234:123:421
Liu Mgale 25023105 :345:156:091
Ma Wenti 69783656 :981:236:831
Wang meng 95473126 :632:743:214# 查找有Xiaoyu的行和有meng的行
[root@wenyi] ~]# awk '/Xiaoyu/;/meng/' awk_test.txt
Zhang Xiaoyu 69386058 :166:453:937
Wang meng 95473126 :632:743:214
测试
# 练习1 找出Xiaoyu的姓和id号
[root@wenyi] ~]# awk '/Xiaoyu/' awk_test.txt
Zhang Xiaoyu 69386058 :166:453:937
[root@wenyi] ~]# awk '/Xiaoyu/{print $1 $3}' awk_test.txt
Zhang69386058
[root@wenyi] ~]# awk '/Xiaoyu/{print $1',' $3}' awk_test.txt# 练习2 姓氏是Zhang的人,显示它的第二次捐款
# 方法1
[root@wenyi] ~]# awk '/Zhang/{print $NF}' awk_test.txt | awk -F ":" '{print $3}'
100
453
# 注意$NF表示取最后一行# 方法2
[root@wenyi] ~]# awk -F ":" '/Zhang/{print $3}' awk_test.txt
100
453# 练习3 取出有Zhang的行的姓,名和捐款数
# 方法1
[root@wenyi] ~]# awk -F "[ :]+" '/Zhang/{print $1,$3,$5}' awk_test.txt
Zhang 56263673 100
Zhang 69386058 453# 方法2
# 注意:$NF代表最后一行,$(NF-1)代表倒数第二行,这里括号必须要加,不加的话就是取出最后一行,进行减一的操作
[root@wenyi] ~]# awk -F "[ :]+" '/Zhang/{print $1,$3,$(NF-1)}' awk_test.txt
Zhang 56263673 100
Zhang 69386058 453# 练习4
# 显示所有以65开头的id号码的人的全名和id号码
[root@wenyi] ~]# awk '$3~/^65/{print $1,$2,$3}' awk_test.txt
Sgghe Ghggag 65908236
# ^ 后面跟的是以什么开头,~ 表示匹配## 练习5 显示所有id号码最后一位数字是1或5的人的全名
# 方法1
[root@wenyi] ~]# awk '$3~/1$|5$/{print $1,$2}' awk_test.txt |column -t
Meng Feixu
Liu Mgale
# colume -t 表示按照表格的样式输出# 方法2
[root@wenyi] ~]# awk '$3~/[15]$/{print $1,$2}' awk_test.txt |column -t
Meng Feixu
Liu Mgale# 方法3
[root@wenyi] ~]# awk '$3~/(1|5)$/{print $1,$2}' awk_test.txt |column -t
Meng Feixu
Liu Mgale# 练习6
# 显示xiaoyu的捐款,每个捐款数值前面都有以$开头,如$123456789
# gsub(/需要替换的信息/,"修改成什么信息",将哪列信息进行修改)
[root@wenyi] ~]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt
$166$453$937
文件中空行进行排除/文件中注释信息进行排除
grep -Ev "^#|^$" 文件信息
sed -n '/^#|^$/!p' 文件信息
awk '/^#|^$/' 文件信息# 总结:awk命令中$的几种用法
$1,$2,$3 取第几列信息
$NF 取最后一列
$(NF-n) 取倒数第几列
$0 取所有列的信息
awk的高级功能
- 对日志信息进行统计(求和)
- 对日志信息数值进行求和(流量统计)
- (数组)进行数值排序
- 可以进行脚本编写(循环语句,判断语句)
**awk模式概念说明:**匹配的条件信息
普通的模式:
正则表达式作为模式
awk ‘/^oldboy/{print xxx }’ 文件
利用比较匹配信息
NR==2
NR>=2
NR<=2
特殊的模式
BEGIN{} 在awk执行命令前作什么事
[root@wenyi] ~]# awk 'BEGIN{print "姓","名","id号码","捐款金额"}{print $0}' awk_test.txt | column -t 姓 名 id号码 捐款金额 Zhang Dandam 56263673 :250:100:165 Zhang Xiaoyu 69386058 :166:453:937 Meng Feixu 72382065 :123:534:738 Wu Wasfg 42501510 :234:123:421 Liu Mgale 25023105 :345:156:091 Ma Wenti 69783656 :981:236:831 #Wang meng 95473126 :632:743:214 Liang glahga 26276626 :522:734:452 Sgghe Ghggag 65908236 :523:744:278# BEGIN还可以用于计算 [root@wenyi] ~]# awk 'BEGIN{print 10/2}' 5
END{} 在awk执行命令结束之后的操作
[root@wenyi] ~]# awk 'BEGIN{print "姓","名","id号码","捐款金额"}{print $0}END{print "操作结束"}' awk_test.txt | column -t 姓 名 id号码 捐款金额 Zhang Dandam 56263673 :250:100:165 Zhang Xiaoyu 69386058 :166:453:937 Meng Feixu 72382065 :123:534:738 Wu Wasfg 42501510 :234:123:421 Liu Mgale 25023105 :345:156:091 Ma Wenti 69783656 :981:236:831 #Wang meng 95473126 :632:743:214 Liang glahga 26276626 :522:734:452 Sgghe Ghggag 65908236 :523:744:278 操作结束
测试1
# 取出/etc/services里面的空行
# 方法1
[root@wenyi] ~]# grep -c "^$" /etc/services # -c 表示统计行数
17# 方法2
[root@wenyi] ~]# i=0
[root@wenyi] ~]# echo $((i=i+1))
1
[root@wenyi] ~]# echo $((i=i+1))
2
[root@wenyi] ~]# awk '/^$/{i=i+1;print i}' /etc/services
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 我们这款看到上面把每次读取的空行都输出到屏幕上了,这并不是我们关注的,我们往往只需要最后的结果,在这里就需要END 了。
[root@wenyi] ~]# awk '/^$/{i=i+1}END{print i}' /etc/services
17# 进阶
# 统计 /etc/services里面有多少#开头的
[root@wenyi] ~]# awk '/^#/{i++}END{print i}' /etc/services
102
测试2
# 统计系统中有多少虚拟用户,多少普通用户
# 第一步:了解虚拟用户,普通用户存放的位置
/etc/passwd
# 第二步:普通用户,虚拟用户的结尾都是/bin/bash结尾
# 第三步:awk统计
[root@wenyi] ~]# awk '$NF~/bash/{i=i+1}END{print i}' /etc/passwd # 普通用户
22
[root@wenyi] ~]# awk '$NF~!/bash/{i=i+1}END{print i}' /etc/passwd # 虚拟用户
27
# $NF 表示在结尾取值
基本求和运算
[root@wenyi] ~]# seq 10
1
2
3
4
5
6
7
8
9
10
[root@wenyi] ~]# seq 10 | awk '{sum=sum+$1;print sum}'
1
3
6
10
15
21
28
36
45
55# 最终结果
[root@wenyi] ~]# seq 10 | awk '{sum=sum+$1}END{print sum}'
55
SHELL编程之三剑客相关推荐
- shell 编程四剑客简介 find sed grep awk(微信公众号摘抄)
一,Shell编程四剑客之Find 通过如上基础语法的学习,读者对Shell编程有了更近一步的理解,Shell编程不再是简单命令的堆积,而是演变成了各种特殊的语句.各种语法.编程工具.各种命令的集合. ...
- Shell编程四剑客之AWK(基础篇)
Shell 编程四剑客之 AWK 概述 其语法参数格式为,AWK 常用参数.变量.函数详解如下: (1) AWK 基本语法参数详解: (2) AWK 内置变量详解: (3) AWK 内置函数详解: ( ...
- shell编程四剑客之awk
1.awk简介 awk是一个优良的文本处理工具,Linux及UNIX环境中现有的功能最强大的数据处理引擎之一,以Aho.Weinberger.Kernighan三位发明者名字首字母命名为awk,awk ...
- 四、shell编程四剑客
sed的使用 使用vim在打开的文件中替换内容 :%s/168/134/g #把文件中的所有168替换为134 在文件外部替换文件中的内容 sed -i 's/192.168/192.134/g' l ...
- SHELL编程(介绍)
前言 说到shell编程,很多从事Linux运维工作的朋友都不陌生,都对shell有基本的了解,读者可能刚开始接触shell的时候,有各种想法,感觉编程非常困难,但shell编程是所有编程语言中最容易 ...
- 第五阶段:shell编程企业实战,完整版
第五阶段:shell编程企业实战 第一章shell变量核心基础与进阶 1.1节.什么是shell 什么是shell Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等,用户输入一条命 ...
- 04-Linux之Linux软件安装、三剑客和Shell编程
1.9 Linux的软件安装 1.9.1 环境变量的配置 环境变量是指 当我们配置了环境变量后, 执行相应的命令,告诉系统命令搜索的文件夹,当我们执行一个命令的时候,默认从当前路径开始查找,如果当前路 ...
- shell编程基础(2)---与||
shell 编程重要的应用就是管理系统,对于管理系统中成千上万的程序而言,查询某个文件名是否存在,并且获取该文件名所指代文件基本信息是系统管理员的基本任务.shell命令可以很轻松的完成这项任务. # ...
- 如让自己想学不好shell编程都困难?
众所周知,shell是linux运维必备的技术,必须要掌握,但是shell语法复杂,灵活,网友掌握了语法也不知道如何应用到实际运维中,老男孩培训shell编程给所有linux运维人员带来了学好shel ...
最新文章
- 在浏览器中输入URL按下回车键后发生了什么
- 全球及中国商用卫生间纸巾分配器行业需求前景及发展趋势研究报告2021-2027年版
- “我求你们不要再给我打电话了,我不炒股!”
- NYOJ 631 冬季长跑
- 科大星云诗社动态20210901
- springboot-注解汇总
- 人民币转换美金的c语言代码大全,C语言 人民币转换代码
- 网上阅卷系统php源码,又开源了,网上阅卷系统自动识别功能代码 | 学步园
- 最新抖音下载无水印视频
- 精述wifi、zigbee在链路层的安全原理:CCM模式
- 3.tensorflow单层神经网络mnist数字识别:训练,加载模型,预测图像
- 使用TimerOne库
- 世界最大的数字优惠券​公司
- DFS(深度优先搜索算法)入门
- 数据报和字节流的区别
- Qiime2最全安装教程--包教包会,可私信远程免费帮装
- Java 并发之 AQS 详解(上)
- cmake 基本命令 交叉编译配置 模块的编写
- 计算机科学类学术论文,计算机科学与技术学院申请博士学位发表学术论文的规定(2008.9上网)...
- C语言-计算三角形的周长和面积
热门文章
- Unity Shaders and Effects Cookbook (7-2) Surface Shader 中实现 顶点动画
- 图书管理系统之DAO设计与实现
- NDK实践(一)在linux环境下编译ffmpe
- 【原创】【个人向】CSP-S 2019 爆炸退役记 (已完成)
- 用了这么久的消息队列,你知道为什么需要它吗?
- linux svn 查看忽略文件
- CTF密码学--新手题--Normal_RSA--解题过程及总结
- php开源混合模式吗,CSS3混合模式使用详解
- ViveInputUtility-手柄触摸3D物体(6)
- matlab实践总结与体会,MatLab实习心得体会