Centos7 Shell编程之正则表达式、文本处理工具详解


Posted in Servers onAugust 05, 2022

1. 正则表达式

正则表达式可以很灵活的提供各种模糊匹配的筛选规则。常被用来检索、替换那些符合某个模式的文本。grep、sed、awk等文本处理工具都支持通过正则表达式进行模式匹配

1.1 常规匹配

一串不包含特殊字符的正则表达式,匹配包含它自己的字符,例如:

[root@bigdata001 ~]# cat /etc/passwd | grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@bigdata001 ~]#

1.2 常用特殊字符

特殊字符:^:匹配一行的开头,例如:

[root@bigdata001 ~]# cat /etc/passwd | grep ^root
root:x:0:0:root:/root:/bin/bash
[root@bigdata001 ~]#

特殊字符:$:匹配一行的结束,例如:

[root@bigdata001 ~]# cat /etc/passwd | grep bash$
root:x:0:0:root:/root:/bin/bash
[root@bigdata001 ~]#

特殊字符:.:匹配一个任意的字符,例如:

[root@bigdata001 ~]# cat /etc/passwd | grep r..t
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@bigdata001 ~]#

特殊字符:*:不单独使用,和上一个字符连用,表示匹配上一个字符0次或多次,例如

[root@bigdata001 ~]# cat /etc/passwd | grep ro*t
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@bigdata001 ~]#

字符区间:[ ]:表示匹配某个范围内的一个字符

  • [68]:匹配6或者8
  • [0-9]:匹配一个0-9的数字
  • [0-9]*:匹配任意长度的数字字符串
  • [a-z]:匹配一个a-z之间的字符
  • [a-c, e-f]-匹配a-c或者e-f之间的任意一个字符
[root@bigdata001 ~]# echo 12345 | grep "[0-9]*"
12345
[root@bigdata001 ~]#

**特殊字符:**:表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如我想找出所有包含’$'的行),就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身,例如:

[root@bigdata001 ~]# echo -e 'abc$def'"\n123456" | grep '\$'
abc$def
[root@bigdata001 ~]#

实战练习

[root@bigdata001 ~]# echo 13667894536 | grep -E ^1[34578][0-9]{9}$
13667894536
[root@bigdata001 ~]#

grep默认是不支持正则特殊字符{}的,需要开启拓展正则表达式功能

2. 文本处理工具

2.1 cut

cut可以将文件中内容(也可以通过管道符传输),按照指定分隔符将每一行进行切割,然后取指定字节、字符、字段进行输出

基本语法: cut [选项参数] filename

选项参数如下:

-d 分隔符:按照指定分隔符分割每行数据,默认是制表符\t

-f 列号:取第几列。可以使用3,5表示取第三列和第五列,-33-55-分布表示取前三列、第三列到第五列、第五列和后面所有列

-c 字符号:表示取第个字符。不能指定分隔符

-b 字节号:表示取第个字节。不能指定分隔符

示例:

[root@bigdata001 ~]# cat /etc/passwd | grep bash$ | cut -d ":" -f 1
root
bigdata
[root@bigdata001 ~]# 
[root@bigdata001 ~]# cat /etc/passwd | grep bash$ | cut -d ":" -f 6-
/root:/bin/bash
/home/bigdata:/bin/bash
[root@bigdata001 ~]#
[root@bigdata001 ~]# cat /etc/passwd | grep bash$ | cut -c 1
r
g
[root@bigdata001 ~]#

实战示例:

[root@bigdata001 ~]# ifconfig ens33 | grep netmask | cut -d " " -f 10
192.168.8.111
[root@bigdata001 ~]#

2.2 awk

awk把文件逐行的读入(文件名或通过管道符传输),以空格为默认分隔符将每行切片,切开的部分再进行分析处理

基本语法:awk [选项参数] ‘/pattern1/{action1} /pattern2/{action2} …’ filename

  • pattern:表示awk在数据中查找的内容,就是正则表达式匹配
  • action:在找到匹配内容时所执行的一系列命令

选项参数说明

  • -F 分隔符:指定输入文件每行分隔符
  • -v 变量名=变量值:赋值一个用户定义变量

awk的内置变量

FILENAME:文件名NR:数据所在的行号NF:每行切割后的列数

示例1:

[root@bigdata001 ~]# cat /etc/passwd | grep bash$
root:x:0:0:root:/root:/bin/bash
bigdata:x:996:1000::/home/bigdata:/bin/bash
[root@bigdata001 ~]# 
[root@bigdata001 ~]# awk -F ":" -v my_var=1 'BEGIN{print "begin line"} /bash$/{print $3+my_var", "$1", 文件名: "FILENAME", 行号: "NR",  列数: "NF} END{print "end line"}' /etc/passwd
begin line
1, root, 文件名: /etc/passwd, 行号: 1, 列数: 7
997, gpadmin, 文件名: /etc/passwd, 行号: 22, 列数: 7
end line
[root@bigdata001 ~]#
  • BEGIN和END都是可选的,表示在所有数据行读取之前或之后执行的操作
  • 可以不定义pattern,只定义action
  • print是awk内部的命令
  • $1表示第一列,$2表示第二列,依次类推

示例2:

[root@bigdata001 ~]# ifconfig | awk '/netmask/{print $2}'
192.168.8.111
127.0.0.1
[root@bigdata001 ~]#

前面的多个空格会当作一个空格,且只统计有内容的列所在的位置

示例3:

[root@bigdata001 ~]# cat test.awk
#!/bin/awk -f
# 在所有数据行读取之前的操作
BEGIN {
    # 定义变量
    math = 0
    english = 0
 
    printf "name         math   english   total\n"
}

# 对每行数据进行的操作
{
    math+=$2
    english+=$3
    printf "%-10s %6d %9d %7d\n", $1, $2, $3, $2+$3
}
# 在所有数据行读取之后的操作
END {
    printf "total:     %6d %9d\n", math, english
    printf "average:   %6.2f %9.2f\n", math/NR, english/NR
}
[root@bigdata001 ~]# 
[root@bigdata001 ~]# echo -e "zhang_san 60 80\nli_si 70 90" | awk -f test.awk
name         math   english   total
zhang_san      60        80     140
li_si          70        90     160
total:        130       170
average:    65.00     85.00
[root@bigdata001 ~]#
  • printf是wak内置命令
  • printf中-表示左对齐,默认右对齐。数字表示宽度。s表示字符串,d表示数字,f表示浮点数(数字1.数字2:数字1表示宽度,数字2表示小数点位数)

到此这篇关于Centos7 Shell编程之正则表达式、文本处理工具的文章就介绍到这了,更多相关正则表达式、文本处理工具内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Servers 相关文章推荐
Nginx + consul + upsync 完成动态负载均衡的方法详解
Mar 31 Servers
win10安装配置nginx的过程
Mar 31 Servers
Nginx域名转发https访问的实现
Mar 31 Servers
Nginx URL重写rewrite机制原理及使用实例
Apr 01 Servers
nginx配置虚拟主机的详细步骤
Jul 21 Servers
nginx安装以及配置的详细过程记录
Sep 15 Servers
使用Nginx搭载rtmp直播服务器的方法
Oct 16 Servers
nginx负载功能+nfs服务器功能解析
Feb 28 Servers
centos7安装mysql5.7经验记录
May 02 Servers
详解如何使用Nginx解决跨域问题
May 06 Servers
服务器SVN搭建图文安装过程
Jun 21 Servers
在虚拟机中安装windows server 2008的图文教程
Jun 28 Servers
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
Aug 05 #Servers
Nginx跨域问题解析与解决
Aug 05 #Servers
win10搭建配置ftp服务器的方法
Aug 05 #Servers
windows系统搭建WEB服务器详细教程
Aug 05 #Servers
Win10系统搭建ftp文件服务器详细教程
Aug 05 #Servers
Linux在两个服务器直接传文件的操作方法
Aug 05 #Servers
windows10 家庭版下FTP服务器搭建教程
Aug 05 #Servers
You might like
PHP中的Memcache详解
2014/04/05 PHP
PHP缓存机制Output Control详解
2014/07/14 PHP
php中smarty实现多模版网站的方法
2015/06/11 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
TNC vs BOOM BO3 第三场2.13
2021/03/10 DOTA
鼠标移动到一张图片时变为另一张图片
2006/12/05 Javascript
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
js判断浏览器版本以及浏览器内核的方法
2015/01/20 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
Python3 assert断言实现原理解析
2020/03/02 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
全球酒店比价网:HotelsCombined
2017/06/20 全球购物
美津浓美国官网:Mizuno美国
2018/08/07 全球购物
专升本自我鉴定
2013/10/10 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
大学专科自荐信
2014/06/17 职场文书
2014法制宣传日活动总结
2014/07/09 职场文书
手术室消毒隔离制度
2015/08/05 职场文书
调研报告的主要写法
2019/04/18 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
解析Java异步之call future
2021/06/14 Java/Android
Python移位密码、仿射变换解密实例代码
2021/06/27 Python