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 proxy_cache 缓存配置详解
Mar 31 Servers
Nginx代理同域名前后端分离项目的完整步骤
Mar 31 Servers
Nginx部署vue项目和配置代理的问题解析
Aug 04 Servers
图文详解nginx日志切割的实现
Jan 18 Servers
Apache Pulsar结合Hudi构建Lakehouse方案分析
Mar 31 Servers
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
Apr 29 Servers
教你如何用cmd快速登录服务器
Jun 10 Servers
openEuler 搭建java开发环境的详细过程
Jun 10 Servers
Python安装及建立虚拟环境的完整步骤
Jun 25 Servers
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
Jul 15 Servers
win10搭建配置ftp服务器的方法
Aug 05 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+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
2011/06/27 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
2014/01/13 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
简单谈谈json跨域
2016/03/13 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
JavaScript实现经典排序算法之选择排序
2016/12/28 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
微信小程序实现美团菜单
2018/06/06 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
vue实现评价星星功能
2020/06/30 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
详解Java中String JSONObject JSONArray List转换
2020/11/13 Javascript
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
在Mac下使用python实现简单的目录树展示方法
2018/11/01 Python
在Python中调用Ping命令,批量IP的方法
2019/01/26 Python
python实现kmp算法的实例代码
2019/04/03 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
Python中字典与恒等运算符的用法分析
2019/08/22 Python
基于Tensorflow批量数据的输入实现方式
2020/02/05 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
英语演讲稿范文
2014/01/03 职场文书
运动会班级口号
2014/06/09 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
申请吧主发表的感言
2015/08/03 职场文书
2016党员党课心得体会
2016/01/07 职场文书