一、把身份证号过滤出来

我们还是从一道面试题说起。

请从test.txt文件当中过滤出正确的的身份证号码

[root@localhost test.dir]# cat test.txt

赵 370831199405162458

钱 370831199305162kjl

孙 37083119920516245X

李 37083110516245887k

张 37083KKKKKKK990516

在LINUX当中,我们要过滤文本时,我们一定要搞清楚,要过滤的文本有什么特征,那么问题来了,身份证号有什么特征?

  1. l  身份证号都是18位的
  2. 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的时候最好都使用单引号。

它有以下这么几个常用的选项,我们要做简要的描述,然后再举详细的例子

  1. n:显示行号,是行原本在文本的原始行号
  2. v:取反
  3. o:显示过程,可以理解为只显示匹配到的字符而非行,默认grep是行过滤器
  4. E:使得grep支持扩展的正则表达式,与egrep的效果是一样的
  5. i:igore case,不区分大小写
  6. w:我们上面见识过了,即锚定连续的字符,即描写单词
  7. A2:显示目标行的后面2行,数字可自定义
  8. B2:显示目标行的前面2行,数字可自定义
  9. 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复习的更多相关文章

  1. shell脚本创建身份证号

    --作者:飞翔的小胖猪 --创建时间:2021年5月16日 --修改时间:2021年5月16日 说明 运行脚本,用户手动输入信息生成身份证号.该程序的核心在于函数模块化及select的使用. 注意:该 ...

  2. iOS之由身份证号返回性别

    该博文出自:http://www.cnblogs.com/yang-guang-girl/p/5683454.html - (void)viewDidLoad { [super viewDidLoad ...

  3. input表单手机号、身份证号验证

    <form action="" method="post" onsubmit="return checkForm(this)"> ...

  4. mysql从身份证号中提取生日、性别

    SELECT p.ID, p.IDCardNo, IF ( LENGTH(p.IDCardNo) , CAST( , ) AS DATETIME ), CAST( CONCAT( ', , ) ) A ...

  5. js 随机生成姓名、手机号、身份证号、银行卡号

    开发测试的时候,经常需要填写姓名.手机号.身份证号.银行卡号,既要符合格式要求.又不能重复.大家会到网上搜各种生成器.能不能自己写一个简单的生成器呢.下面是随机生成姓名.手机号.身份证号.银行卡号的j ...

  6. 教你一招:根据身份证号计算出生年月和年龄 text函数和mid函数混用 datedif函数和today函数混用

    在电子表格Excel中,使用text函数和mid函数混用,根据身份证号计算出生年月: =text(mid(A2,,),"0!/00!/00") #0!/00!/00 为日期的格式# ...

  7. C#中使用正则表达式验证电话号码、手机号、身份证号、数字和邮编

      验证电话号码的主要代码如下: public bool IsTelephone(string str_telephone) { return System.Text.RegularExpressio ...

  8. Js 根据身份证号获取年龄-性别

    参考:http://www.tuicool.com/articles/J7r2ien 方式一: $scope.GetAgeAndSexByIDNum = function (IdCardNO) { / ...

  9. 锋利的js之验证身份证号

    我们在做互联网网站时,注册个人资料时,经常要用到身份证号,我们需要对身份证进验证,不然别人随便输个号码就通过,让你感觉这个网站做得很shit. 身份证号是有规则的. 结构和形式 1.号码的结构  公民 ...

随机推荐

  1. c# 第20节 一维数据的冒泡排序

    本节内容: 1:冒泡排序说明: 2:冒泡排序实现: 3:冒泡排序的时间复杂度 1:冒泡排序说明: 冒泡排序也是最简单最基本的排序方法之一.冒泡排序的思想很简单,就是以此比较相邻的元素大小,将小的前移, ...

  2. docker使用,包括有nvidia-docker

    docker run 命令:https://www.runoob.com/docker/docker-run-command.html docker run -it ubuntu:15.10 /bin ...

  3. LG4111/LOJ2122 「HEOI2015」小Z的房间 矩阵树定理

    问题描述 LG4111 题解 矩阵树定理板子题. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; #defin ...

  4. 【2019.7.20 NOIP模拟赛 T2】B(B)(数位DP)

    数位\(DP\) 首先考虑二进制数\(G(i)\)的一些性质: \(G(i)\)不可能有连续两位第\(x\)位和第\(x+1\)位都是\(1\).因为这样就可以进位到第\(x+2\)位.其余情况下,这 ...

  5. ​为什么我会选择走 Java 这条路?

    ​本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点 ...

  6. navicat远程连接mysql的方法

    navicat远程连接mysql的方法1 先在打开phpmyadmin 添加用户 用户名和密码自己设置 设置如下 2 关闭防火墙service iptables status可以查看到iptables ...

  7. axios 源码分析(上) 使用方法

    axios是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它可以在浏览器和node环境下运行,在github上已经有六七万个星了,axios使用很方便,很多人在使用他,vu ...

  8. 【译】.NET Core 是 .NET 的未来

    为什么要翻译咧,.NET 5 都宣布在 .NET Core 之后发布咯,何不再给 .NET Core 打打鸡血,我这个 .NET Core 的死忠粉. 原文:<.NET Core is the ...

  9. 分布式应用的未来 — Distributionless

    作者丨阿里云高级技术专家 至简(李云) 在技术变革推动社会发展这一时代背景下,大量支撑规模化分布式应用的技术创新.创造与创业应用而生,Could Native.Service Mesh.Serverl ...

  10. C# iText split PDF C# 拆分PDF

    Nuget install iText7 using iText.Kernel.Pdf; using System.Linq; using System.Text; using System.Thre ...