bash是什么

  • bash是一个命令处理器,运行在文本窗口中,并能执行用户直接输入的命令
  • bash还能从文件中读取linxu命令,称之为脚本
  • bash支持通配符、管道、命令替换、条件判断等逻辑控制语句

bash的特性

  • 命令行展开
[root@chaogelinux ~]# echo {tom,bob,chaoge,jerry}
tom bob chaoge jerry [root@chaogelinux ~]# echo chaoge{666,888}
chaoge666 chaoge888 [root@chaogelinux ~]# echo chaoge{1..5}
chaoge1 chaoge2 chaoge3 chaoge4 chaoge5 [root@chaogelinux ~]# echo chaoge{1..10..2}
chaoge1 chaoge3 chaoge5 chaoge7 chaoge9 [root@chaogelinux ~]# echo chaoge{01..10..2}
chaoge01 chaoge03 chaoge05 chaoge07 chaoge09
  • 命令别名
alias,unalias
  • 命令历史
history
!行号
!! 上一次的命令
  • 快捷键
ctrl + a  移动到行首
ctrl + e 移动到行尾
ctrl + u 删除光标之前的字符
ctrl + k 删除光标之后的字符
ctrl + l 清空屏幕终端内容,同于clear
  • 命令补全
tab键
补全
$PATH中存在的命令
  • 文件路径补全
/opt/chaoge/linux_study

Linux正则表达式

正则表达式:Regual Expression, REGEXP

由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;

分两类:

基本正则表达式:BRE
扩展正则表达式:ERE

正则表达式的意义

  • 处理大量的字符串
  • 处理文本

通过特殊符号的辅助,可以让linux管理员快速过滤、替换、处理所需要的字符串、文本,让工作高效。

通常Linux运维工作,都是面临大量带有字符串的内容,如

  • 配置文件
  • 程序代码
  • 命令输出结果
  • 日志文件

且此类字符串内容,我们常会有特定的需要,查找出符合工作需要的特定的字符串,因此正则表达式就出现了

  • 正则表达式是一套规则和方法
  • 正则工作时以单位进行,一次处理一行
  • 正则表达式化繁为简,提高工作效率
  • linux仅受三剑客(sed、awk、grep)支持,其他命令无法使用

正则表达式应用非常广泛,应用在如Python、Java、Perl等,Linux下普通命令无法使用正则表达式的,只能使用三剑客。

通配符是大部分普通命令都支持的,用于查找文件或目录,而正则表达式是通过三剑客命令在文件(数据流)中过滤内容的

Linux三剑客

文本处理工具,均支持正则表达式引擎

  • grep:文本过滤工具,(模式:pattern)工具
  • sed:stream editor,流编辑器;文本编辑工具
  • awk:Linux的文本报告生成器(格式化文本),Linux上是gawk

正则表达式的分类

Linux三剑客主要分两类

  • 基本正则表达式(BRE、basic regular expression)
BRE对应元字符有 ^$.[]*
  • 扩展正则表达式(ERE、extended regular expression)
ERE在在BRE基础上,增加上 (){}?+| 等字符

基本正则表达式BRE集合

  • 匹配字符
  • 匹配次数
  • 位置锚定
符号 作用
^ 尖角号,用于模式的最左侧,如 "^oldboy",匹配以oldboy单词开头的行
$ 美元符,用于模式的最右侧,如"oldboy$",表示以oldboy单词结尾的行
^$ 组合符,表示空行
. 匹配任意一个且只有一个字符,不能匹配空行
\ 转义字符,让特殊含义的字符,现出原形,还原本意,例如\.代表小数点
* 匹配前一个字符(连续出现)0次或1次以上 ,重复0次代表空,即匹配所有内容
.* 组合符,匹配任意长度的任意字符
^.* 组合符,匹配任意多个字符开头的内容
.*$ 组合符,匹配以任意多个字符结尾的内容
[abc] 匹配[]集合内的任意一个字符,a或b或c,可以写[a-c]
[^abc] 匹配除了^后面的任意字符,a或b或c,^表示对[abc]的取反
<pattern> 匹配完整的内容
<或> 定位单词的左侧,和右侧,如<chao>可以找出"The chao ge",缺找不出"yuchao"

扩展正则表达式ERE集合

扩展正则必须用 grep -E 才能生效

字符 作用
+ 匹配前一个字符1次或多次,前面字符至少出现1次
[:/]+ 匹配括号内的":"或者"/"字符1次或多次
? 匹配前一个字符0次或1次,前面字符可有可无
竖线 表示或者,同时过滤多个字符串
() 分组过滤,被括起来的内容表示一个整体
   
a{n,m} 匹配前一个字符最少n次,最多m次
a{n,} 匹配前一个字符最少n次
a{n} 匹配前一个字符正好n次
a{,m} 匹配前一个字符最多m次

Tip:

grep命令需要使用参数 -E即可支持正则表达式
egrep不推荐使用,使用grep -E替代
grep不加参数,得在特殊字符前面加"\"反斜杠,识别为正则

grep

全拼:Global search REgular expression and Print out the line.

作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行

模式:由正则表达式的元字符文本字符所编写出的过滤条件

语法:
grep [options] [pattern] file
命令 参数 匹配模式 文件数据
-i:ignorecase,忽略字符的大小写;
-o:仅显示匹配到的字符串本身;
-v, --invert-match:显示不能被模式匹配到的行;
-E:支持使用扩展的正则表达式元字符;
-q, --quiet, --silent:静默模式,即不输出任何信息;

grep命令是Linux系统中最重要的命令之一,功能是从文本文件管道数据流中筛选匹配的数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令

grep命令里的匹配模式就是你想要找的东西,可以是普通的文字符号,也可以是正则表达式

参数选项 解释说明
-v 排除匹配结果
-n 显示匹配行与行号
-i 不区分大小写
-c 只统计匹配的行数
-E 使用egrep命令
--color=auto 为grep过滤结果添加颜色
-w 只匹配过滤的单词
-o 只输出匹配的内容

案例

cat /etc/passwd > /tmp/test_grep.txt

grep  "login" /tmp/test_grep.txt  -n                                #找出login有关行
grep "login" /tmp/test_grep.txt -n -v #找出没有login的行
grep "ROOT" /tmp/test_grep.txt -i #忽略大小写,找出root有关行
grep -E "root|sync" /tmp/test_grep.txt --color=auto #同时过滤出root和sync有关行
grep "login" /tmp/test_grep.txt -c #统计匹配结果的行数
grep "login" /tmp/test_grep.txt -n -o #只输出匹配出的内容 grep "oldboy" /tmp/test_grep.txt -w #完整匹配,字符串精确匹配,整个单词
grep -Ev "^#|^$" /tmp/test_grep.txt #过滤掉空白和注释行

正则表达式grep实践

准备测试文件

^符号

1.输出所有以m开头的行

[root@pylinux data]# grep -i  -n "^m" luffy.txt        # -i忽略大小写  -n 显示仪行号
5:My qq is 877348180.
7:My name is chaoge.

2.输出所有以i开头的行

[root@pylinux data]# grep -i -n "^i" luffy.txt
1:I am oldboy teacher
2:I teach linux.
3:I like python.

$符

1.输出所有以r结尾的行

[root@pylinux data]# grep -i -n "r$" luffy.txt
1:I am oldboy teacher

2.输出所以以m结尾的行

[root@pylinux data]# grep -i -n "m$" luffy.txt
9:Our school website is http://oldboyedu.com

TIP

注意在Linux平台下,所有文件的结尾都有一个$符
可以用cat -A 查看文件

3.输出所有以"."结尾的行,注意用转义符

1.注意不加转义符的结果,正则里"."是匹配任意1个字符,grep把.当做正则处理了,因此把有数据的行找出来了,

[root@pylinux data]# grep -i -n ".$" luffy.txt
1:I am oldboy teacher
2:I teach linux.
3:I like python.
5:My qq is 877348180.
7:My name is chaoge.
9:Our school website is http://oldboyedu.com 2.加上转义符,当做普通的小数点过滤
[root@pylinux data]# grep -i -n "\.$" luffy.txt
2:I teach linux.
3:I like python.
5:My qq is 877348180.
7:My name is chaoge.

^$组合符

1.找出文件的空行,以及行号
[root@pylinux data]# grep "^$" luffy.txt -n
4:
6:
8:
10:
11:
12:

.点符号

"."点表示任意一个字符,有且只有一个,不包含空行

[root@pylinux data]# grep -i -n "." luffy.txt
1:I am oldboy teacher
2:I teach linux.
3:I like python.
5:My qq is 877348180.
7:My name is chaoge.
9:Our school website is http://oldboyedu.com

匹配出 ".ac",找出任意一个三位字符,包含ac

[root@pylinux data]# grep -i -n ".ac" luffy.txt
1:I am oldboy teacher
2:I teach linux.

\转义符

1.找出文中所有的点"."

[root@pylinux data]# grep "\." luffy.txt
I teach linux.
I like python.
My qq is 877348180.
My name is chaoge.
Our school website is http://oldboyedu.com

*符

1.找出前一个字符0次或多次,找出文中出现"i"的0次或多次

[root@pylinux data]# grep -n "i*" luffy.txt
1:I am teacher
2:I teach linux.
3:I like python.
4:
5:My qq is 283178231.
6:
7:My name is haoge.
8:
9:Our school website is http://www.baidu.com
10:
11:
12:

.*组合符

.表示任意一个字符,*表示匹配前一个字符0次或多次,因此放一起,代表匹配所有内容,以及空格

[root@pylinux data]# grep '.*' luffy.txt
I am oldboy teacher
I teach linux.
I like python. My qq is 877348180. My name is chaoge. Our school website is http://oldboyedu.com

^.*o符

^以某字符为开头

.任意0或多个字符

.*代表匹配所有内容

o普通字符,一直到字母o结束

这种匹配相同字符到最后一个字符的特点,称之为贪婪匹配

[root@chaogelinux data]# grep "I.*o" luffy.txt
I am oldboy teacher
I like python.

[abc]中括号

中括号表达式,[abc]表示匹配中括号中任意一个字符,a或b或c,常见形式如下

  • [a-z]匹配所有小写单个字母
  • [A-Z]匹配所有单个大写字母
  • [a-zA-Z]匹配所有的单个大小写字母
  • [0-9]匹配所有单个数字
  • [a-zA-Z0-9]匹配所有数字和字母
[root@pylinux data]# grep '[a-z]' luffy.txt
I am oldboy teacher
I teach linux.
I like python.
My qq is 877348180.
My name is chaoge.
Our school website is http://oldboyedu.com

[root@pylinux data]# grep '[abcd]' luffy.txt
I am oldboy teacher
I teach linux.
My name is chaoge.
Our school website is http://oldboyedu.com

grep参数-o

使用"-o"选项,可以只显示被匹配到的关键字,而不是讲整行的内容都输出。

显示文件中有多少个字符a

[root@pylinux data]# grep -o  'a' luffy.txt |wc -l
5

[^abc]中括号中取反

[^abc][^a-c]这样的命令,"^"符号在中括号中第一位表示排除,就是排除字母a或b或c

出现在中括号里的尖角号表示取反

1.找出除了小写字母以外的字符

[root@pylinux data]# grep '[^a-z]' luffy.txt
I am oldboy teacher
I teach linux.
I like python.
My qq is 877348180.
My name is chaoge.
Our school website is http://oldboyedu.com

扩展正则表达式实践

此处使用grep -E进行实践扩展正则,egrep官网已经弃用

+号

+号表示匹配前一个字符1次或多次,必须使用grep -E 扩展正则

[root@pylinux data]# grep -E  'l+'  luffy.txt
I am oldboy teacher
I teach linux.
I like python.
Our school website is http://oldboyedu.com

?符

匹配前一个字符0次或1次

1.找出文件中包含gd或god的行

[root@pylinux data]# grep -E 'go?d' luffycity.txt
god #字母o出现了一次
gd #字母o出现了0次

|符

竖线|在正则中是或者的意思

1.找出系统中的txt文件,且名字里包含a或b的字符

[root@pylinux data]# find / -maxdepth 3  -name "*.txt" |grep -i -E "a|b"
/data/luffycity.txt
/data/luffy.txt
/test_find/chaoge.txt
/test_find/alex.txt
/opt/all.txt
/opt/_book/123.txt
/opt/Python-3.7.3/pybuilddir.txt
/opt/alltxt.txt
/opt/s15oldboy/qiong.txt
/opt/IIS/keystorePass.txt

()小括号

将一个或多个字符捆绑在一起,当作一个整体进行处理;

  • 小括号功能之一是分组过滤被括起来的内容括号内的内容表示一个整体
  • 括号()内的内容可以被后面的"\n"正则引用n为数字,表示引用第几个括号的内容
    • \1:表示从左侧起,第一个括号中的模式所匹配到的字符
    • \2:从左侧期,第二个括号中的模式所匹配到的字符

1.找出包含good和glad的行

[root@pylinux data]# grep -E 'goo|lad' luffycity.txt        #结果不是我们想要的
good
goooood
goooooood
glad [root@pylinux data]# grep -E 'good|glad' luffycity.txt #我们希望能够实现这这样的匹配
good
glad [root@pylinux data]# grep -E 'g(oo|la)d' luffycity.txt
good
glad

分组之后向引用

[root@chaogelinux data]# cat lovers.txt
I like my lover.
I love my lover.
He likes his lovers.
He love his lovers. [root@chaogelinux data]# grep -E '(l..e).*\1' lovers.txt
I love my lover.
He love his lovers. [root@chaogelinux data]# grep -E '(r..t).*\1' /etc/passwd #案例2
root:x:0:0:root:/root:/bin/bash

最清晰的分组解释

{n,m}匹配次数

重复前一个字符各种次数,可以通过-o参数显示明确的匹配过程

Linux正则表达式与grep的更多相关文章

  1. [Linux]正则表达式和grep使用【转载】

    [Linux]正则表达式和grep使用 2018年12月05日 23:45:54 祥知道 阅读数 78 标签: 正则表达式grepLinuxegrep 更多 个人分类: Linux 所属专栏:  Li ...

  2. linux 正则表达式 使用grep命令

    最常应用正则表达式命令是 awk sed grep [root@MongoDB ~]# cat mike.log I am mike! I like linux. I like play footba ...

  3. Linux 正则表达式 vi, grep, sed, awk

          1. vi 表示内容的元字符 模式 含义 . 匹配任意字符 [abc] 匹配方括号中的任意一个字符.可以使用-表示字符范围,如[a-z0-9]匹配小写字母和阿拉伯数字. [^abc] 在方 ...

  4. linux 正则表达式 目录

    linux 通配符与正则表达式 linux 通配符 linux 正则表达式 使用grep命令 linux 扩展正则表达式 egrep linux 正则表达式 元字符

  5. 正则表达式(grep,awk,sed)和通配符

    1. 正则表达式 1. 什么是正则表达式? 正则表达式就是为了处理大量的字符串而定义的一套规则和方法. 通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串. Linux正则 ...

  6. Linux正则表达式grep

    正则表达式是一种符号表示法,用于识别文本模式.Linux处理正则表达式的主要程序是grep.grep搜索与正则表达式匹配的行,并将结果输送至标准输出. 1. grep匹配模式 grep按下述方式接受选 ...

  7. linux正则表达式之-基础正则表达式(基于grep)

    linux正则表达式: 简单的说,正则表达式就是为处理大量的字符串而定义的一套规则和方法,如:假设@代表123456,!代表abcde.通过定义的这些特殊符号的铺助,系统管理员就可以快速的过滤,替换或 ...

  8. Linux正则表达式grep与egrep

    grep -io "http:/=[A-Z0-9]\{16\}" ./wsxf.txt >wsxf_urls.txt Linux正则表达式grep与egrep 正则表达式:它 ...

  9. Linux运维正则表达式之grep

    一.什么是正则表达式?简单的说,正则表达式就是一套处理大量的字符串而定义的规则和方法.例如:假设 @代表12345通过正则表达式这些特殊符号,我们可以快速过滤.替换需要的内容.linux正则表达式一般 ...

随机推荐

  1. Redis 06 哈希

    参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 哈希就是 ke ...

  2. java-RandomAccessFile操作以及IO流简单使用

    1.1RandomAccessFile--使用RAF读写基本类型数据,以及了解Raf的指针操作 write有相对应的写入基本类型的方法 void seek(Long pos)调整RAF指针位置,可以在 ...

  3. 第三十八篇:vue3路由

    好家伙,水博客怎么说 1.0.安装:简简单单的淘宝镜像安装 装一下淘宝镜像(一般都有) npm install -g cnpm --registry=https://registry.npm.taob ...

  4. x64dbg 插件开发环境配置

    x64dbg 是一款开源的应用层反汇编调试器,旨在对没有源代码的可执行文件进行恶意软件分析和逆向工程,同时 x64dbg 还允许用户开发插件来扩展功能,插件开发环境的配置非常简单,如下将简单介绍x64 ...

  5. Vben Admin 源码学习:状态管理-角色权限

    前言 本文将对 Vue-Vben-Admin 角色权限的状态管理进行源码解读,耐心读完,相信您一定会有所收获! 更多系列文章详见专栏   Vben Admin 项目分析&实践 . 本文涉及到角 ...

  6. etcd v3版本生产级集群搭建以及实现一键启动脚本

    本专栏的上一篇文章写了<长篇图解etcd核心应用场景及编码实战>,本文继续.后续计划章节内容如下: <长篇图解etcd核心应用场景及编码实战> <搭建高可用etcd集群& ...

  7. 创建一个k8s私有仓库-harbor

    〇.前言 这一步应该是在搭建k8s之前做好,注意了奥 一.安装docker和docker-compose 1.下载docker-compose的最新版本 # 建议那种网上冲浪下载!,下载下来记得命名成 ...

  8. 若依代码生成的一个大坑 You have an error in your SQL syntax; check the manual that corresponds to your MySQL s

    报错如下所示:显示我的xml文件的SQL语句有错 ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You h ...

  9. 以软件定义物联网芯片,以技术融合推动LPWAN2.0泛在物联

    作为数字化产业重要的基础设施之一,物联网迎来了黄金发展期.物联网通信技术通过数据的采集.分析.输出,从浅层次的互联工具和产品深化,到成为重塑生产组织方式的基础设施和关键要素,正深刻地改变着传统产业形态 ...

  10. paddleocr安装与图片识别快速开始

    本文首发我的个人博客:paddleocr安装教程快速开始 1. 安装Python环境 wget https://mirrors.huaweicloud.com/python/3.8.5/Python- ...