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配置SSL证书出错解决方案
Mar 31 Servers
Nginx代理同域名前后端分离项目的完整步骤
Mar 31 Servers
nginx服务器的下载安装与使用详解
Aug 02 Servers
zabbix自定义监控nginx状态实现过程
Nov 01 Servers
Nginx配置https的实现
Nov 27 Servers
nginx搭建NFS网络文件系统
Apr 14 Servers
nginx配置之并发频次限制
Apr 18 Servers
基于docker安装zabbix的详细教程
Jun 05 Servers
V Rising 服务器搭建图文教程
Jun 16 Servers
Nginx安装配置详解
Jun 25 Servers
Python安装及建立虚拟环境的完整步骤
Jun 25 Servers
VMware虚拟机安装 Windows Server 2022的详细图文教程
Sep 23 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开发中页面乱码的产生与解决
2008/03/27 PHP
yii框架源码分析之创建controller代码
2011/06/28 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
2017/01/17 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
JS动态增删表格行的方法
2016/03/03 Javascript
jQuery操作属性和样式详解
2016/04/13 Javascript
Google 地图事件实例讲解
2016/08/06 Javascript
easy ui datagrid 从编辑框中获取值的方法
2017/02/22 Javascript
JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结(整理)
2017/06/09 jQuery
微信小程序分页加载的实例代码
2017/07/11 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
Vue elementui字体图标显示问题解决方案
2020/08/18 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
基于Python的接口测试框架实例
2016/11/04 Python
利用python画一颗心的方法示例
2017/01/31 Python
解决pycharm的Python console不能调试当前程序的问题
2019/01/20 Python
Django框架会话技术实例分析【Cookie与Session】
2019/05/24 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
HTML5 自动聚焦(autofocus)属性使用介绍
2013/08/07 HTML / CSS
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
三星美国官网:Samsung美国
2017/02/06 全球购物
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
给女朋友的道歉信
2014/01/10 职场文书
市场部规章制度
2014/01/24 职场文书
教师个人自我剖析材料
2014/09/29 职场文书