过滤身份证号和grep复习
一、把身份证号过滤出来
我们还是从一道面试题说起。
请从test.txt文件当中过滤出正确的的身份证号码
[root@localhost test.dir]# cat test.txt
赵 370831199405162458
钱 370831199305162kjl
孙 37083119920516245X
李 37083110516245887k
张 37083KKKKKKK990516
在LINUX当中,我们要过滤文本时,我们一定要搞清楚,要过滤的文本有什么特征,那么问题来了,身份证号有什么特征?
- l 身份证号都是18位的
- l 有的身份证号全都是数字,有的身份证号前17位是数字,最后一位是大写的X
好,那事情就简单了!
我们先来满足第一个要求,即身份证号都是18位,18位!如何用正则表达式表示呢?其实无法用基本的正则表达式表达18位数字,需要用到扩展的正则表达式,即:{18};第二个要求就有点麻烦了,最后一位是什么不确定,最后一位要么是数字要么是大写的X,“或”的关系,或的关系用扩展的正则表达式如何表达呢?要用到"|"这个符号,前面的17位数字倒是容易了,数字通过[0-9]就可以表示了。
好,注意了,来了啊!两种方法都可以:
- [root@localhost test.dir]# egrep '[0-9]{18}|[0-9]{17}X' test.txt
- 赵 370831199405162458
- 孙 37083119920516245X
#查找有18位数字的或者前17位是数字最后一位是X的行,把完全是数字的号码与数字X混杂的号码分开考虑
- [root@localhost test.dir]# egrep '[0-9]{17}[0-9X]{1}' test.txt
- 赵 370831199405162458
- 孙 37083119920516245X
#查找前17位是数字后面跟一位数字或大写的X的行,把完全是数字的号码与数字X混杂的号码放在一起考虑
好,现在增加难度!现在文件变成这样了:
- [root@localhost test.dir]# cat test.txt
- 赵 370831199405162458
- 钱 370831199305162kjl
- 孙 39083119920516245X
- 陈 37083119920516245X377
- 李 37083110516245887k
- 张 37083KKKKKKK990516
- [root@localhost test.dir]# egrep '[0-9]{18}|[0-9]{17}X' test.txt
- 赵 370831199405162458
- 孙 39083119920516245X
- 陈 37083119920516245X377 #出现了这个,不符合我们的需求 #为什么不符合要求呢?因为这这一行明显是超过了18位的要求
- [root@localhost test.dir]# egrep '[0-9]{17}[0-9X]{1}' test.txt
- 赵 370831199405162458
- 孙 39083119920516245X
- 陈 37083119920516245X377 #出现了这个,不符合我们的需求
怎么办呢?我们怎样才能只过滤出18位的呢?可以这样,如下所示:
- [root@localhost test.dir]# egrep '[0-9]{18}|[0-9]{17}X' test.txt -w #对egrep使用-w选项
- 赵 370831199405162458
- 孙 39083119920516245X
- [root@localhost test.dir]# egrep '[0-9]{17}[0-9X]{1}' test.txt -w
- 赵 370831199405162458
- 孙 39083119920516245X
-w是什么意思呢?即锚定连续的字符,即锚定单词,仔细体会一下!
二、grep使用复习
grep做为文本三剑客之一,其作用就是用来过滤文本,与单引号匹配,我们在使用grep的时候最好都使用单引号。
它有以下这么几个常用的选项,我们要做简要的描述,然后再举详细的例子
- n:显示行号,是行原本在文本的原始行号
- v:取反
- o:显示过程,可以理解为只显示匹配到的字符而非行,默认grep是行过滤器
- E:使得grep支持扩展的正则表达式,与egrep的效果是一样的
- i:igore case,不区分大小写
- w:我们上面见识过了,即锚定连续的字符,即描写单词
- A2:显示目标行的后面2行,数字可自定义
- B2:显示目标行的前面2行,数字可自定义
- C2:显示目标行的前后各2行,数字可自定义
下面就是例子了:
- [root@localhost test.dir]# cat test.txt
- 赵 370831199405162458
- 钱 370831199305162kjl
- 孙 39083119920516245X
- 陈 37083119920516245X377
- 李 37083110516245887k
- 张 37083KKKKKKK990516
- [root@localhost test.dir]# grep -n '1993' test.txt #显示行号
- 2:钱 370831199305162kjl
- [root@localhost test.dir]# grep -o '1993' test.txt #只显示匹配到的字符,不显示一整行 1993
- [root@localhost test.dir]# grep -nv '1993' test.txt #取反
- 1:赵 370831199405162458 3:孙 39083119920516245X
- 4:陈 37083119920516245X377
- 5:李 37083110516245887k
- 6:张 37083KKKKKKK990516
- [root@localhost test.dir]# grep -Ew '[0-9]{18}|[0-9]{17}X' test.txt #-E和-w连用,能看懂吗?不懂再去看看上面的例子哦!
- 赵 370831199405162458
- 孙 39083119920516245X
- [root@localhost test.dir]# grep -E '[k]{7}' test.txt #用小写的K,啥都过滤不出来
- [root@localhost test.dir]# grep -Ei '[k]{7}' test.txt #使用了-i选项之后,忽略了大小写,就能把下面这一行过滤出来了。
- 张 37083KKKKKKK990516
- [root@localhost test.dir]# grep -EB2 '[K]{7}' test.txt #把目标内容的上面的两行过滤出来
- 陈 37083119920516245X377
- 李 37083110516245887k
- 张 37083KKKKKKK990516
过滤身份证号和grep复习的更多相关文章
- shell脚本创建身份证号
--作者:飞翔的小胖猪 --创建时间:2021年5月16日 --修改时间:2021年5月16日 说明 运行脚本,用户手动输入信息生成身份证号.该程序的核心在于函数模块化及select的使用. 注意:该 ...
- iOS之由身份证号返回性别
该博文出自:http://www.cnblogs.com/yang-guang-girl/p/5683454.html - (void)viewDidLoad { [super viewDidLoad ...
- input表单手机号、身份证号验证
<form action="" method="post" onsubmit="return checkForm(this)"> ...
- mysql从身份证号中提取生日、性别
SELECT p.ID, p.IDCardNo, IF ( LENGTH(p.IDCardNo) , CAST( , ) AS DATETIME ), CAST( CONCAT( ', , ) ) A ...
- js 随机生成姓名、手机号、身份证号、银行卡号
开发测试的时候,经常需要填写姓名.手机号.身份证号.银行卡号,既要符合格式要求.又不能重复.大家会到网上搜各种生成器.能不能自己写一个简单的生成器呢.下面是随机生成姓名.手机号.身份证号.银行卡号的j ...
- 教你一招:根据身份证号计算出生年月和年龄 text函数和mid函数混用 datedif函数和today函数混用
在电子表格Excel中,使用text函数和mid函数混用,根据身份证号计算出生年月: =text(mid(A2,,),"0!/00!/00") #0!/00!/00 为日期的格式# ...
- C#中使用正则表达式验证电话号码、手机号、身份证号、数字和邮编
验证电话号码的主要代码如下: public bool IsTelephone(string str_telephone) { return System.Text.RegularExpressio ...
- Js 根据身份证号获取年龄-性别
参考:http://www.tuicool.com/articles/J7r2ien 方式一: $scope.GetAgeAndSexByIDNum = function (IdCardNO) { / ...
- 锋利的js之验证身份证号
我们在做互联网网站时,注册个人资料时,经常要用到身份证号,我们需要对身份证进验证,不然别人随便输个号码就通过,让你感觉这个网站做得很shit. 身份证号是有规则的. 结构和形式 1.号码的结构 公民 ...
随机推荐
- pytest--生成HTML报告
前戏 我们做自动化,测试报告是必不可少的.方便自己查看,也可以供领导查看,一个测试报告就可以说明我们做了哪些事情,pytest-html插件给我们提供了一个很简陋的测试报告,为什么说简陋,因为是真简陋 ...
- 题解 P2719 【搞笑世界杯】
其实懂了之后很简单,但是刚开始真的很难想.. d[a][b]表示剩a张A类票和b张B类票时,最后两张票相同的概率 那么此时的排队的第一个人只有两种选择 拿A类票或者B类票 抛硬币得到的可能性当然是二分 ...
- 这几款我私藏的Markdown编辑器,今天分享给你
相信很多人都使用 Markdown 来编写文章,Markdown 语法简洁,使用起来很是方便,而且各大平台几乎都已支持 Markdown 语法 那么,如何选择一款趁手的 Markdown 编辑器,就是 ...
- 十、Spring之BeanFactory源码分析(二)
Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...
- Python term 模块
Python term 模块 term 模块适用于文字编辑,样式切换,光标移动 等一系列操作适用于终端命令行文字光标处理等操作. 安装 pip install py-term 使用方式 方式一 imp ...
- Prometheus 监控K8S 资源状态对象
Prometheus 监控K8S 资源状态对象 官方文档:https://github.com/kubernetes/kube-state-metrics kube-state-metrics是一个简 ...
- opencv代码片段合集
个人笔记 长期更新 #### 创建一个图片 import cv2 # Not actually necessary if you just want to create an image. impor ...
- python基础之Matplotlib库的使用一(平面图)
在我们过去的几篇博客中,说到了Numpy的使用,我们可以生成一些数据了,下面我们来看看怎么让这些数据呈现在图画上,让我们更加直观的来分析数据. 安装过程我就不再说了,不会安装的,回去补补python最 ...
- 三元運算子回傳lambda expression
紀錄一下 假如我想要透過三元運算子?: 傳回lambda expression 要明確轉型
- Python - 迭代器与生成器 - 第十三天
Python 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问 ...