Shell编程正则表达式、扩展正则表达式及文本处理器

正则表达式概念

  • 正则表达式又称正规表达式、常规表达式。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,正则表达式是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串
  • 正则表达式一般用于脚本编程与文本编辑器中。很多文本处理器与程序设置语言均支持正则表达式,例如linux系统中场景的文本处理器(grep、egrep、sed、awk)以及应用比较广泛的Python语言。正则表达式具备很强大的文本匹配功能,能够在文本海洋中快速高效地处理文本。
  • 正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式扩展正则表达式。基础正则表达式是常用正则表达式最基础的部分。在 Linux 系统中常见的文件处理工具中 grep 与 sed 支持基础正则表达式,而 egrep 与 awk 支持扩展正则表达式

一、grep

  • 常用选项:
-n 显示行号
-i  不区分大小写
-v 反向过滤

1.1 查找特定字符

grep -n ‘the’ test.txt
## 若反向选择 查找不含the字符的行
grep -vn ‘the’ test.txt

1.2 查找字符集合

  • 利用[] 查找
grep -n 'sh[io]rt' test.txt    ## 无论[]中有几个字符,都只能取一个字符查找   过滤shirt或者short
  • 查看包含两个“o”的
grep -n 'oo' test.txt  ## 表示过滤包含两个o的
  • 过滤oo前不是w开头的
greo -n '[^w]oo' test.txt  ## 表示过滤oo前不是w的 ^[w]表示以w开头的 ‘[^w]oo' 表示包含两个o ,o前面不是w的
  • 过滤以字母开头的
grep -n '^[a-zA-Z]' test.txt ## 表示以字母开头的
  • 过滤以数字开头的
grep -n '[0-9]'  test.txt  ## 查看包含数字的行
  • 查找空白行
[root@localhost ~]# grep -n '^$' test.txt

1.3查找行首“^”与行尾字符“$”

  • 查找以the开头的
[root@localhost ~]# grep -n '^the' test.txt
  • 查找以小数点. 结尾的行
[root@localhost ~]# grep -n '\.$' test.txt

1.4 查找任意一个字符“.”与重复字符“*”

  • 查找w后面出现任意字符的行
grep -n   ‘w.*’ test.txt   ## W后面出现任意字符
  • 查找oo后面出现0次“o”或多次“o”的行
grep -n ‘ooo*’ test.txt   ## 表示*前面的(一个o)字符出现0次或者多次,只针对前面的第一个字符有效,本身就有两个o  可以理解为前面一个字符出现的次数
  • 过滤“*”的行
grep -n   ‘*’ test.txt     ## *作为普通的字符,被过滤出来    *前面没有别的字符参考,就作为普通字符被过滤出来  

1.5 大括号的使用——{} 往往用来作为次数的限制

  • 使用大括号 一定要加转义字符“\”
  • 过滤出现两个“o”的行
[root@promote ~]# grep -n 'o\{2\}' test.txt 
  • 匹配以wo开头 d结尾,中间出现2到5个o的字符
grep -n ‘wo\{
    
    2,5\}d’test.txt   ## 先匹配最大的5次,再看后面o的个数
  • 匹配以wo开头 d结尾,中间出现2个以上o的字符
grep -n ‘wo\{
    
    2,\}d

1.6 元字符总结

字符 用法
^ 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配“^” 字符本身,请使用“^”
$ 以什么什么为结尾
. 任意单个字符
\ 配合元字符使用 把元字符转换为普通字符
* 匹配前面的字符的次数
[] 中间的字符取其一匹配
[^] 赋值字符集合。匹配未包含的一个任意字符。例如,“[^bc]”可以匹配“plain”中任何一个字母
[n1-n2] 字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意一个小写字母字符。注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示字符的范围;如果出现在字符组的开头,则只能表示连字符本身
{n} n 是一个非负整数,匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的“oo”
{n,} n 是一个非负整数,至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”
{n,m} m 和 n 均为非负整数,其中 n<=m,最少匹配 n 次且最多匹配m 次

二、扩展正则表达式—egrep

  • “?”和“+” 仅用在扩展表达式中

2 .1 同时过滤多次

  • | 为或 若为且中间直接不加|
egrep -v  '^$'|'^#'   httpd.conf     ## 直接筛选出没有空行和#号的行   | 为或     若为且中间直接不加|

2.2筛选出前面的元素出现一次或者重复出现

egrep -n  'wo+d'  httpd.conf    ## ”+“ 表示前面的元素出现一个或者重复出现,w开头 d结尾 中间o至少出现一次
egrep -n 'A(xyz)+C' test.txt          ##  ()+辨别重复的组        表示 A开头 C结尾   xyz出现一次或者一次以上

2.3 筛选出前面的元素出现0次或1次

egrep  -n  'wo?d'  httpd.conf  ##  ?  表示w开头  d结尾   o出现0次或者一次

2.4 过滤多个字符串

egrep  -n ‘if|is|on’    ##  |   查找of 或者 if  或者on字符串

2.5 元字符

元字符 作用
+ 作用:重复一个或者一个以上的前一个字符
作用:零个或者一个的前一个字符
| 作用:使用或者(or)的方式找出多个字符
()+ 作用:辨别多个重复的组,示例:“egrep -n ‘A(xyz)+C’ test.txt”。该命令是查询开头的"A"结尾是"C",中间有一个以上的"xyz"字符串的意思

三、文本处理器

3.1 sed工具

  • sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed 也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于 Shell 脚本中,用以完成各种自动化处理任务。
  • 工作流程主要包括读取、执行和显示三个过程
    读取:sed 从输入流(文件、管道、标准输入)中读取一行内容,并存储到临时的缓冲区中(又称模式空间,pattern space)。
    执行: 默认情况下,所有的sed命令都在模式空间中顺序地执行,除了指定了行的地址,否则sed命令将会在所有的行一次执行
    显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
    在所有的文件内容都被处理完成前,上述清空将重复执行,直到内容都被清理完。
    默认都是在模式空间内执行的,因此输入的文件不会发生任何变化,除非时用重定向存储输出。
  • sed基本格式
sed [选项] '操作' 参数
sed [选项] -f  scriptfile  参数      ## scriptfile 即脚本
  • 常用选项
-e或--expression=: 表示指定的命令或脚本来处理输入的文件
-f或--file=: 表示用指定的脚本文件来处理输入的文本文件
-h或--help=: 显示帮助
-n、--quiet 或 silent:表示仅显示处理后的结果。
-i:直接编辑文本文件。

  • 操作”用于指定对文件操作的动作行为,也就是 sed 的命令。通常情况下是采用的“[n1[,n2]]”操作参数的格式。n1、n2 是可选的,代表选择进行操作的行数,如操作需要在 5~ 20 行之间进行,则表示为“5,20 动作行为”。
a:增加,在当前行下面增加一行指定内容。
c:替换,将选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
s:替换,替换指定字符。
y:字符转换。

3.2 迁移


H:复制到剪贴板;
g、G:将剪贴板中的数据覆盖/追加至指定行;
w:保存为文件;
r:读取指定文件;
a:追加指定内容。
  • 例子
sed '/the/{H:d};$G'test.txt   ## 查找有the的行  H:剪切到剪切板  d:删除原来的行   $G: 追加到行尾
sed '1,5{H:d};17G'test.txt  ##将1到5行粘贴到17行后面 
sed '/the/w  abc.txt' test.txt  ## 将test.txt 中有the 的行保存到abc.txt中
sed '/the/{H;d};$G' test.txt	//将包含the 的行迁移至文件末尾,{
    
    ;}用于多个操作
sed '1,5{H;d};17G' test.txt	//将第 1~5 行内容转移至第 17 行后
sed '/the/w out.file' test.txt	//将包含the 的行另存为文件 out.file
sed '/the/r /etc/hostname' test.txt	//将文件/etc/hostname 的内容添加到包含 the 的每行以后
sed '3aNew' test.txt	//在第 3 行后插入一个新行,内容为New
sed '/the/aNew' test.txt	//在包含the 的每行后插入一个新行,内容为 New
sed '3aNew1\nNew2' test.txt	//在第 3 行后插入多行内容,中间的\n 表示换行

3.3 查看删除效果

  • nl 命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果。
nl   test.txt  ## 有行号的文本内容
nl  test.txt |sed '3d'      ## 删除第3行
nl  test.txt |sed '3,5d'  ## 删除删除3到5行   
nl  test.txt |sed '/the/d'    ## 删除有 the的行

3.4 替换

  • 在使用 sed 命令进行替换操作时需要用到 s(字符串替换)、c(整行/整块替换)、y
    (字符转换)命令选项。
sed 's/the/THE' test.txt    ## 将每行中的第一个the替换为THE
sed 's/the/THE/2' test.txt  ## 替换每行中的第二个the  替换为THE
sed 's/the/THE/g' test.txt    ## 将所有的the替换为THE 
 sed  's/o//g' test.txt  ## 将文中所有的o都删掉

四、awk 工具

  • 在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作。
  • wk 执行结果可以通过 print 的功能将字段数据打印显示。在使用 awk 命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||” 表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。

4.1 基本格式

awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2 … //过滤并输出文件中符合条件的内容
awk   -f   脚本文件 文件 1 文件 2 …	//从脚本中调用编辑指令,过滤并输出内容

4.2 awk内建选项

FS:指定每行文本的字段分隔符,默认为空格或制表位。
NF:当前处理的行的字段个数。
NR:当前处理的行的行号(序数)。
$0:当前处理的行的整行内容。
$n:当前处理行的第 n 个字段(第 n 列)。
FILENAME:被处理的文件名。
RS:数据记录分隔,默认为\n,即每行为一条记录

4.3 awk用法示例

  • 按行输出文本
awk '{print}' test.txt	//输出所有内容,等同于 cat test.txt
awk '{print $0}' test.txt	//输出所有内容,等同于 cat test.txt
awk 'NR==1,NR==3{print}' test.txt	//输出第 1~3 行内容
awk '(NR>=1)&&(NR<=3){print}' test.txt	//输出第 1~3 行内容
awk 'NR==1||NR==3{print}' test.txt	//输出第 1 行、第 3 行内容
awk '(NR%2)==1{print}' test.txt	//输出所有奇数行的内容
awk '(NR%2)==0{print}' test.txt	//输出所有偶数行的内容
  • 按字段输出文本
awk '{print $3}' test.txt	//输出每行中(以空格或制表位分隔)的第 3 个字段
awk '{print $1,$3}' test.txt	//输出每行中的第 1、3 个字段awk -F ":" '$2==""{print}' /etc/shadow //输出密码为空的用户的shadow 记录awk 'BEGIN {FS=":"}; $2==""{print}' /etc/shadow//输出密码为空的用户的shadow 记录
awk -F ":" '$7~"/bash"{print $1}' /etc/passwd //输出以冒号分隔且第 7 个字段中包含/bash 的行的第 1 个字段   ~号对应的意思是包含
  • 通过管道、双引号调用 Shell 命令

awk -F: '/bash$/{print | "wc -l"}' /etc/passwd //调用wc -l 命令统计使用 bash 的用户个数,等同于 grep -c "bash$" /etc/passwd
awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'//调用w 命令,并用来统计在线用户数
awk 'BEGIN { "hostname" | getline ; print $0}'//调用hostname,并输出当前的主机名

五、sort工具

  • sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。

5.1 格式及常用选项

sort常用语法
sort [选项] 参数

- 参数
-f:忽略大小写;
-b:忽略每行前面的空格;
-M:按照月份进行排序;
-n:按照数字进行排序;
-r:反向排序;
-u:等同于 uniq,表示相同的数据仅显示一行;
-t:指定分隔符,默认使用[Tab]键分隔;
-o <输出文件>:将排序后的结果转存至指定文件;
-k:指定排序区域。

5.2 示例

[root@localhost ~]# sort /etc/passwd   ## 将/etc/passwd 文件中的账号进行排序。
[root@localhost ~]# sort -t ':' -rk 3 /etc/passwd ## 将/etc/passwd 文件中第三列进行反向排序。
[root@localhost ~]# sort -t ':' -k 3 /etc/passwd -o user.txt  ## 将/etc/passwd 文件中第三列进行排序,并将输出内容保存至 user.txt 文件中。

六、uniq 工具

  • Uniq 工具在 Linux 系统中通常与 sort 命令结合使用,用于报告或者忽略文件中的重复行。

6.1 格式及常用选项

- 语法格式
- uniq [选项] 参数

- 常用选项
-c:进行计数;
-d:仅显示重复行;
-u:仅显示出现一次的行

6.2 示例

[root@localhost ~]# uniq -c testfile  ## 删除 testfile 文件中的重复行,并在行首显示该行重复出现的次数。
[root@localhost ~]# uniq -d testfile  ## 查找 testfile 文件中的重复行。

七、tr工具

  • 命令常用来对来自标准输入的字符进行替换、压缩和删除。可以将一组字符替换之后变成另一组字符,经常用来编写优美的单行命令,作用很强大。

7.1 命令格式及常用选项

- 命令格式
tr [选项] [参数]



- 常用选项
-c:取代所有不属于第一字符集的字符;
-d:删除所有属于第一字符集的字符;
-s:把连续重复的字符以单独一个字符表示;
-t:先删除第一字符集较第二字符集多出的字符。 

7.2 示例

[root@localhost ~]# echo "KGC" | tr 'A-Z' 'a-z'   ## 将输入字符由大写转换为小写。
[root@localhost ~]# echo "thissss is	a text linnnnnnne." | tr -s 'sn'  ## 压缩输入中重复的字符。
[root@localhost ~]# echo 'hello world' | tr -d 'od'      ## 删除字符串中某些字符。

猜你喜欢

转载自blog.csdn.net/weixin_47219725/article/details/107606649