Shell语言基本语法总结(4)正则表达式与文本处理之grep

文章目录

  • 七、正则表达式
    • 7.1、通配符 * { } [ ] [^] ?
    • 7.2、单引号、双引号、不加引号、反引号
    • 7.3、正则表达式概述
    • 7.4、 转义符号(空白符) \n \t \r \v \0 \b
    • 7.5、BRE- ^ $ 以...开头/结尾的行
    • 7.6、BRE- . 匹配除换行符之外的任意单个字符
    • 7.7、BRE- * 匹配重复0次及以上次数的字符
    • 7.8、BRE- .* 所有
    • 7.9、BRE- \[ ] 括号中的任意一个字符 ; [^] 不是括号中的字符
    • 7.10、ERE- + 匹配前面字符连续出现1次或多次
    • 7.11、ERE- ?匹配前面字符 0 次或 1 次
    • 7.12、ERE- | 或 匹配竖杠两边的任意一个
    • 7.13、ERE- a{n,m} 匹配前面字符a至少出现n次,最多m次
    • 7.14、ERE- () 括号里的相当于一个整体;
    • 7.15、字母符号 \w \W \b \S \s
    • 7.16、Posix字符
  • 八、文本处理之grep
    • 8.1、-w 精确匹配单词
    • 8.2、-c 匹配的总行数 -x 匹配整行 -v 显示非匹配的 -n 显示行号
    • 8.3、-e 多模式匹配 ;-m n 显示前n个匹配内容

七、正则表达式

7.1、通配符 * { } [ ] [^] ?

通配符 解释
* 匹配所有字符,可以输出一个或多个字符
{ } 生成序列
[ ] [a-z]匹配小写字母任何一个
[^] 取反排除
? 匹配任何一个字符,只匹配一个字符
  • * 与 ?区别展示 :查找当前目录下的txt文件
[hadoop1@hadoop1 test]$ ls *.txt
aaa.txt  a.txt  b.txt
[hadoop1@hadoop1 test]$ ls ?.txt
a.txt  b.txt
[hadoop1@hadoop1 test]$ ls ???.txt
aaa.txt
  • { } 生成序列 :创建test1…test10命名的文本文件
[hadoop1@hadoop1 test]$ touch test{1..10}.txt
[hadoop1@hadoop1 test]$ ll
总用量 16
-rw-rw-r-- 1 hadoop1 hadoop1  80 525 13:01 aaa.txt
-rwxrwxr-x 1 hadoop1 hadoop1 373 521 19:36 a.sh
-rw-rw-r-- 1 hadoop1 hadoop1  80 525 13:01 a.txt
-rw-rw-r-- 1 hadoop1 hadoop1  50 525 13:01 b.txt
drwxr-xr-x 2 hadoop1 hadoop1  23 522 11:59 test1
-rw-rw-r-- 1 hadoop1 hadoop1   0 525 13:24 test10.txt
-rw-rw-r-- 1 hadoop1 hadoop1   0 525 13:24 test1.txt
-rw-rw-r-- 1 hadoop1 hadoop1   0 525 13:24 test2.txt
-rw-rw-r-- 1 hadoop1 hadoop1   0 525 13:24 test3.txt
-rw-rw-r-- 1 hadoop1 hadoop1   0 525 13:24 test4.txt
-rw-rw-r-- 1 hadoop1 hadoop1   0 525 13:24 test5.txt
-rw-rw-r-- 1 hadoop1 hadoop1   0 525 13:24 test6.txt
-rw-rw-r-- 1 hadoop1 hadoop1   0 525 13:24 test7.txt
-rw-rw-r-- 1 hadoop1 hadoop1   0 525 13:24 test8.txt
-rw-rw-r-- 1 hadoop1 hadoop1   0 525 13:24 test9.txt

  • [ ] 与 [^] 分别查找字符串“123asDe6ht893”中的字母与非字母
    在这里插入图片描述

7.2、单引号、双引号、不加引号、反引号

引号类型 解释
单引号 ’ ’ 所见即所得,单引号里面是什么就输出什么
双引号 " " 双引号里面的特殊符号与变量会被解析
不加引号 支持通配符
反引号 ` ` 优先执行反引号里面的命令 (位于键盘的ESC下面)
  • 分别利用不同引号打印这句话my name is `hostname` {1…4}
# 单引号 :所见即所得 尽管hostname在反引号里,但整体在单引号里面 不解析原有含义
[hadoop1@hadoop1 test]$ echo 'my name is `hostname` {1..4}'
my name is `hostname` {1..4}
# 双引号 :解析原含义 反引号优先解析hostname主机名;双引号不支持通配符 
[hadoop1@hadoop1 test]$ echo "my name is `hostname` {1..4}"
my name is hadoop1 {1..4}
# 不加引号:优先解析反引号;支持通配符 
[hadoop1@hadoop1 test]$ echo my name is `hostname` {1..4}
my name is hadoop1 1 2 3 4

7.3、正则表达式概述

  • 功能:匹配字符(主要工具grep、sed、awk)
  • 注意:
    • 1️⃣所有符号均为英文状态下的符号
    • 2️⃣推荐使用grep工具(过滤命令,先了解,后面深入介绍)或网站正则解析,看看正则执行过程或匹配了什么内容;必须要亲手操作,才有印象
  • 分类:
    • 1️⃣基础正则BRE(basic regular express):^ $ ^$ . * [] [^]
    • 2️⃣扩展正则ERE(extend regular express):| + {} () ? 使用grep时需-E才可以;或者利用egrep命令
  • 通配符和正则区别:
    • 通配符:文件/目录 文件名 处理的是参数;Linux大部分命令可以使用
    • 正则: 进行过滤 在一个文件中查找内容;Linux中的grep\sed\awk支持
# a.txt文件内容
1This a Linux testfile! 
2This is a linux testfile! 

1java tes
3python test
1lalala

# b.txt 文件
aabbbc
defrrg
klvvvvvvf
ffffghlllll
hhhhhhhhhhggf
eeeeeeeeeeeeeegrtrhk
23456defrh44444

7.4、 转义符号(空白符) \n \t \r \v \0 \b

空白符 描述
\n 换行符,重要
\r 回车符
\t 水平制表符,重要
\v 垂直制表符
\0 空值符
\b 退后一格
  • 执行前必须加 “-e” 支持转义字符,否则结果如下:
[hadoop1@hadoop1 test]$ echo "123\n456"
123\n456
[hadoop1@hadoop1 test]$ echo "123\t456"
123\t456
  • 加上-e后的打印输出
[hadoop1@hadoop1 test]$ echo -e "123\n456"
123
456
[hadoop1@hadoop1 test]$ echo -e "123\t456"
123	   456
[hadoop1@hadoop1 test]$ echo -e "123\b456"
12456
[hadoop1@hadoop1 test]$ echo -e "123\r456"
456
[hadoop1@hadoop1 test]$ echo -e "123\v456"
123
   456

7.5、BRE- ^ $ 以…开头/结尾的行

  • 查找以 “1” 开头的行
    在这里插入图片描述
  • 查找以 “t” 结尾的行
    在这里插入图片描述
  • 匹配空行 (-n显示行号)
    在这里插入图片描述
  • 匹配非空行(-v显示与正则不匹配的行)
    Shell语言基本语法总结(4)正则表达式与文本处理之grep_第1张图片
  • 查找以 “1” 开头以 “s” 结尾的行见7.8 .*

7.6、BRE- . 匹配除换行符之外的任意单个字符

在这里插入图片描述

  • 匹配任意单字符 ( -o显示查找过程,过程:从第一行的第一个字符开始查找,因此一个字符一行内容)
    Shell语言基本语法总结(4)正则表达式与文本处理之grep_第2张图片

  • 匹配以 . 结尾的行 (.在正则中为任意字符的意思,所以.$会匹配任意字符(初换行符)结尾的行;要想.为原本含义,需加反斜杠进行转义)
    Shell语言基本语法总结(4)正则表达式与文本处理之grep_第3张图片

7.7、BRE- * 匹配重复0次及以上次数的字符

Shell语言基本语法总结(4)正则表达式与文本处理之grep_第4张图片

贪婪性:连续出现时,尽可能多的匹配

  • 字符串中连续出现的2(一次及以上)
    在这里插入图片描述

7.8、BRE- .* 所有

  • 查找 以任意内容开头到a的行
    在这里插入图片描述
  • 查找以 “1” 开头以 “s” 结尾的行
    [hadoop1@hadoop1 test]$ grep "^1.*s$" a.txt
    1java tes
    

可以看一下不加.*和加.\*的区别:不加.*就是指改行内容只有1s;.加了\*才是指1开头s结尾的正则
在这里插入图片描述

7.9、BRE- [ ] 括号中的任意一个字符 ; [^] 不是括号中的字符

Shell语言基本语法总结(4)正则表达式与文本处理之grep_第5张图片

  • 匹配数字
    Shell语言基本语法总结(4)正则表达式与文本处理之grep_第6张图片
  • 匹配字母(忽略大小写 可以用-i忽略大小写)
    Shell语言基本语法总结(4)正则表达式与文本处理之grep_第7张图片
  • 以大写字母开头,小写字母或空格结尾的行
    在这里插入图片描述
  • 不是以大写字母开头的行 [^] (^在括号内就是非的意思;在括号外就是以括号里字符开头的意思)
    在这里插入图片描述

7.10、ERE- + 匹配前面字符连续出现1次或多次

在这里插入图片描述

  • 查找字母h出现次数达到1次及以上 (-o只显示匹配到的内容)
    Shell语言基本语法总结(4)正则表达式与文本处理之grep_第8张图片

7.11、ERE- ?匹配前面字符 0 次或 1 次

在这里插入图片描述
在这里插入图片描述

  • 查找def的前面字符为任意字符的 (.?代表一个字符或者没有字符;…?第一个.表示一个任意字符,第二个.?表示一个或没有字符;所以意思就是def前至少含有一个字符)
    在这里插入图片描述

7.12、ERE- | 或 匹配竖杠两边的任意一个

|和[]区别

符号 共同点 区别 示例
| 或者 可以是一串字符,可以匹配单词等 cat|dog 匹配cat 或dog
[ ] 或者 只能匹配其中的单个字符 [dog cat] 匹配的是d o g c a t 字母之一

Shell语言基本语法总结(4)正则表达式与文本处理之grep_第9张图片

7.13、ERE- a{n,m} 匹配前面字符a至少出现n次,最多m次

Shell语言基本语法总结(4)正则表达式与文本处理之grep_第10张图片

  • f连续出现次数的范围在2—5之间
    在这里插入图片描述

7.14、ERE- () 括号里的相当于一个整体;

Shell语言基本语法总结(4)正则表达式与文本处理之grep_第11张图片

# 数据准备
echo -e "ccat\npcut\nctg\nabcg"
ccat
pcut
ctg
abcg
  • 寻找单词cat和cut
    • cat和cut只有中间字母不一样,就能想到用ca|ut ,但是很明显 这是获取ca或者ut,而a和u位于同一个位置,因此可以利用()括起来代表二取其一。
      在这里插入图片描述

7.15、字母符号 \w \W \b \S \s

特殊字符 描述
\w 匹配任意数字和字母,等效[a-zA-Z0-9]
\W 与\w 相反,等效[^a-zA-Z0-9]
\b 匹配字符串开始或结束,等效^和$
\s 匹配任意的空白字符,如\n\t等
\S 匹配非空白字符

Shell语言基本语法总结(4)正则表达式与文本处理之grep_第12张图片

7.16、Posix字符

Posix字符 描述
[:alnum:] 等效[a-zA-Z0-9]
[:alpha:] 等效[a-zA-Z]
[:lower:] 等效[a-z]
[:upper:] 等效[A-Z]
[:digit:] 等效[0-9]
[:space:] 匹配任意空白字符,等效[\t\n\r\f\v]
[:graph:] 非空白字符
[:blank:] 空格与定位字符
[:cntrl:] 控制字符
[:print:] 可显示的字符
[:punct:] 标点符号字符,等 价 于[-!”#$%&’()*+,./:;<=>?@[]_‘
[:xdigit:] 十六进制

Shell语言基本语法总结(4)正则表达式与文本处理之grep_第13张图片

正则表达式总结

基础正则 解释
^ 匹配前面字符串开头; ^a
$ 匹配前面字符串结尾; a$
^$ 空行
. 匹配除换行符(\n)之外的任意单个字符
* 匹配前一个字符零次或多次
.* 所有,贪婪性
[ ] 匹配中括号之中的任意一个字符; [a-z] [A-Z] [0-9] [abc]
[^] 匹配[^字符]之外的任意一个字符; [^abc] abc之外的字符
\t 制表符 tab键
\n 换行符
扩展正则 解释
+ 匹配前面字符 1 次或多次
匹配前面字符 0 次或 1 次
{n}或{n,} 匹配花括号前面字符至少 n个字符
{,m} 匹配花括号前面字符至多m个字符
{n,m} 匹配花括号前面字符至少 n个字符,最多 m 个字符
( ) 1、表示整体
2、向后引用(反向引用)
\n 反向引用,n 是数字,从 1 开始编号,表示引用第 n 个分组匹配的内容
| 匹配竖杠两边的任意一个

八、文本处理之grep

  • Linux grep 命令用于查找文件里符合条件的字符串。
  • grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一行显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
  • 只输出含有查找内容的那一行
  • 用法:grep [选项] 正则表达式 [文件或目录…]
选项 描述
grep -E ==egrep 模式是扩展正则表达式(ERE),不需要加反斜杠的
-e 使用模式匹配,可指定多个模式匹配
-i 忽略大小写
-w 模式匹配整个单词
-x 模式匹配整行
-v 打印不匹配的行
-r 递归目录查找
-n 打印行号
-m 数字 输出前m个匹配
-c 输出匹配的行数
  • 太多了,不一一展示了,更多的参数选择参考菜鸟教程:Linux grep 命令
# 数据准备 a.txt
This a linuxtestfile! 
This is a linux testfile! 
java test
python test
mysql
hadoop hive
linux

8.1、-w 精确匹配单词

Shell语言基本语法总结(4)正则表达式与文本处理之grep_第14张图片

8.2、-c 匹配的总行数 -x 匹配整行 -v 显示非匹配的 -n 显示行号

Shell语言基本语法总结(4)正则表达式与文本处理之grep_第15张图片

8.3、-e 多模式匹配 ;-m n 显示前n个匹配内容

  • -e用法:grep -e “正则” -e “正则” 文件
    Shell语言基本语法总结(4)正则表达式与文本处理之grep_第16张图片

你可能感兴趣的:(大数据类,正则表达式,linux,bash)