一、正则表达式
正则表达式(RE)是一种字符模式,用于再查找过程中匹配指定的字符,在大多数程序中,正则表达式都被置于两个正斜杠之间:例如//就是由正斜杠界定的正则表达式,他将匹配被查找的行中任何位置出现的相同模式。在正则表达式中,元字符时最重要的概念。
元字符
定义:元字符是这样的一类字符,他们表达的是不同于字面本身的含义
分类:基本正则表达式字符和扩展正则表达式字符
基本正则表达式字符
^ | 行首定位符 |
$ | 行尾定位符 |
. | 点,匹配任意单个字符 |
* | 匹配前导符0到多次 |
.* |
任意多个字符 |
[] | 匹配指定范围的一个字符 |
[-] | 匹配指定范围的一个字符,连续的范围 |
[^] | 匹配不在指定组内的字符 |
\ | 用来转义元字符(‘’ “” \ ),脱义符 |
\< | 词首定位符 |
\> | 词尾定位符 |
() | \(\) 匹配稍后使用的字符的标签 :3,9 s/\(.*)/#\1/ 加注释 :3,9 s/\(#\)\(.*)/\2\1/ 将#号移到最后 s替换 \原来\现在\ |
x\{m\} | 字符x重复出现m次 |
x\{m,\} | 字符x重复出现m次以上 |
x\{m,n\} | 字符x重复出现m次到n次 |
扩展正则表达式字符
+ | 匹配1-n个前导字符 |
? | 匹配0-1个前导字符 |
a|b | 匹配a或b |
() | 组字符 |
示例1:
示例2:
二、grep
过滤,查找文件中的内容
分类:grep,egrep和fgrep
返回值:
- 0 是找到了
- 1 是没有
- 2找的地方不对
示范:
参数:
练习
三、sed(逐行处理模式)
1.前言
sed,流编辑器,StreamEditor,sed是一种在线的,非交互式的编辑器,他一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区,成为“模式空间”,接着用sed命令处理缓冲区的内容,处理完成后,把缓冲区的内容送至屏幕。接着处理下一行,这样不断重复,指导文件末尾,文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作。
2.格式
- sed 选项 命令 文件
- sed 选项 -f 脚本文件
3.返回值
都是0,对错不管
只有当命令存在语法错误时,sed的退出状态才是非0
4.sed和正则表达式
与grep一样,sed在文件中查找模式是也可以使用正则表达式(RE)和各种元字符。正则表达式是括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符
- 使用基本元字符集 ^,$,.,*,[],[^],\<,\>,\(\),
- 使用扩展元字符集 ?,+,|,()
- 使用扩展元字符的方式 \+ 转义 sed -r 加-r -i是写入
5.汇总示例
删除命令:d | |
替换命令:s | |
读文件命令:r | |
写文件命令:w(另存为) | |
追加命令:a(之后) | |
插入命令:i(之前) | 与a相反,i插入到行前 |
替换整行命令:c | |
获取下一行命令:n | |
反向选择:! | |
多重编辑:e | 在一条命令中发布多条指令 |
一行针对多条命令一定要用括号括起来
sed -r '/root/{n:d}' passwd
6.实战案例
1.删除配置文件中的#号注释行
sed -r '/^#/d' /etc/sanba/smb.conf
2.修改文件
sed -ri '$a\chroot_local_user=YES' /etc/vsftpd/vsftpd.conf
sed -ri '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
3.给文件行添加注释
sed -r '2,6s/^/#/' a.txt
sed -r '2,6s/(.*)/#\1/' a.txt
sed -r '2,6s/.*/#&/' a.txt
4.sed中使用外部变量
准备工作 var1=11111
追加变量
巧合
四、awk
1.前言
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理,数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,
awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕)。
2.工作原理
3.语法
awk [options] 'command' filenames(推荐)
==options 例如:-F 定义输入字段分隔符,默认的分隔符是空格或制表符(tab)
==command(时空):
- BEGIN{} begin发生在行处理前(注意大写)
- {} 行处理时,读一次执行一次 (现在)
- END{} 行处理后
示例
awk 'BSGIN{print 1/2} {print "OK"} END{print "-------------"}' /etc/hosts
awk 'BSGIN{print 1/2}{print "OK";print $0}END{print "hoho"}' /etc/hosts
4.内部变量
FS | 输入字段分隔符 (默认空格 |
awk -F:'print $1, $3' /etc/passwd | head -1 awk -F‘[:\t]’ {print $1,$2,$3} /etc/passwd awk ‘BEGIN{FS=":"} {print $1,$3}’ /etc/passwd |
OFS | 输出字段分隔符 | awk ‘BEGIN{FS=":";OFS="---"} {print $1,$3}’ /etc/passwd |
RS | 输入记录(行)分隔符,默认换行符 | |
ORS | 输出记录(行)分隔符,默认换行符 | |
FNR | 多文件独立编号 | |
NR | 多文件汇总编号 | |
NF | 字段总数 |
5.模式化输出
print(函数)
6.模式(正则表达)和动作
1.前言
任何awk语句都由模式和动作组成。模式部分决定动作语句何时触发及触发事件如果省略模式部分,动作将时刻保持执行状态。每一行都会有动作。模式可以是任何条件语句或复合语句或正则表达式。有模式的话,就是对模式对应的行进行动作
2.字符串比较
awk '/^root/ /etc/passwd //是正则匹配
awk '$0 ~ /^root/ /etc/passwd ~像
awk '$0! ~ /^root/' /etc/passwd
awk -F;'$1~ /^root/' /etc/passwd
3.数值比较
比较表达式采用对文本进行比较,只有当条件为真,才执行指定的动作。比较表达式使用关系运算符,用于比较数字与字符串
关系运算符
算数,运算
4.多条件
逻辑操作符和复合模式
范围模式
7.awk脚本编程
1.变量
awk调用变量
>1自定义内部变量 -v
awk -v user=root -F: '$1==user' /etc/passwd -v定义变量
>2外部变量“ ‘ ”
双引号
单引号
2.条件&判断
if语句
格式: {if(表达式){语句;语句;...} }
示例:需求 :如果$3是0,就说他是管理员
awk -F: '{if($3==0) {print $1 " is administrator."}}' /etc/passwd
if..else语句
格式:{if(表达式){语句;语句;...} else {语句;语句;...}}
示例: awk -F: {if($3==0) {print $1"是管理员“} else { print $1"普通用户" }}’ passwd
if..else if..else语句
3.循环
while
for
4.数组
定义数组
索引遍历 for(i in username) username加[]i是值,不加i是索引
5.awk编程案例-统计/etc/passwd中各种类型shell的数量
文章来源:https://www.toymoban.com/news/detail-833481.html
8.一问一答
文章来源地址https://www.toymoban.com/news/detail-833481.html
到了这里,关于Liunx shell编程及自动化运维实现--第五章三剑客的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!