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快速入门教程
Mar 31 Servers
nginx网站服务如何配置防盗链(推荐)
Mar 31 Servers
nginx proxy_cache 缓存配置详解
Mar 31 Servers
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
May 27 Servers
Nginx速查手册及常见问题
Apr 07 Servers
忘记Grafana不要紧2种Grafana重置admin密码方法详细步骤
Apr 07 Servers
Vscode中SSH插件如何远程连接Linux
May 02 Servers
Linux磁盘管理方法介绍
Jun 01 Servers
Linux服务器离线安装 nginx的详细步骤
Jun 16 Servers
Ubuntu安装Mysql+启用远程连接的完整过程
Jun 21 Servers
Apache POI操作批量导入MySQL数据库
Jun 21 Servers
解决Git推送错误non-fast-forward的方法
Jun 25 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
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
php在linux下检测mysql同步状态的方法
2015/01/15 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
Prototype Function对象 学习
2009/07/12 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
js读取本地文件的实例
2017/12/22 Javascript
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
Python MD5文件生成码
2009/01/12 Python
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
Python3调用微信企业号API发送文本消息代码示例
2017/11/10 Python
python读取中文txt文本的方法
2018/04/12 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
Python切图九宫格的实现方法
2019/10/10 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
品恩科技软件测试面试题
2014/10/26 面试题
关键字throw与throws的用法差异
2016/11/22 面试题
thinkphp5 redis缓存新增方法实例讲解
2021/03/24 PHP
《一株紫丁香》教学反思
2014/02/19 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
四风查摆剖析材料
2014/10/10 职场文书
数学复习课教学反思
2016/02/18 职场文书