在马哥教育学习Linux第二周,这周又学习了一些Linux的基础知识,通过写这篇文章对自己的这周所学做一个简单的梳理和回顾。

grep是一款Unix上的命令行工具,它最初设计开发用于Unix操作系统,但是如今几乎所有的类Unix(Unix-like)操作系统都在使用。grep是由Unix的创造者之一的Ken Thompson所编写,第一次出现在是version 4 Unix中 。 grep是英文 globally search a regular expression and print的缩写,它的作用从名字就能看出,使用正则表达式做全局搜索并打印出所有匹配行。grep和egrep、fgrep构成了grep家族,后两者是由AWK的联合创作者Al Aho在1975年编写。

Linux作为一款类Unix系统,其使用的也是grep,不过Linux使用的应该是GNU grep,也是GNU版本的grep。

在谈到如何使用grep之前我们的先学习下正则表达式。

基本正则表达式元字符

1)字符匹配。

.

匹配任意单个字符(换行符除外)

[]

匹配范围内的任意单个字符

[^]

匹配范围外的任意单个字符

2)匹配次数:限制其前面的字符要出现的次数。

*

匹配前面的字符任意次(0次、1次或者多次),例如 .* 代表的就是任意长度任意字符

\+

匹配前面的字符至少一次

\?

匹配之前的字符0次或者一次

\{m\}

匹配之前的字符m次,m未非负整数,例x\{2\} 匹配x两次

\{m,n\}

匹配之前的字符至少出现m次,最多出现n次。m和n为非负整数。

3)位置锚定:限制匹配到的字符在文本中出现的位置。grep搜索是贪婪模式的,只要字符串中有匹配到的字符就打印出来,所以加位置锚定更加精确查找。

^

行首锚定,用在模式的最左侧。例: ^a的意思是以a开头的行。

$

行尾锚定,用在模式的最右侧。例:a$的意思是以a结尾的行。^$表示空行。

\<或\b

单词词首锚定,用于单词模式的最左侧,限制要匹配的单词要以什么开头。

\>或\b

单词词尾锚定,用于单词模式的最右侧,限制要匹配的单词要以什么结尾。例:\<this\> 匹配this这个单词。

4)分组与引用

\(PATTERN\) :将此PATTERN匹配到的字符当做一个不可侵害的整体进行处理。分组括号中的模式匹配到的字符会被正则表达式引擎自动记录在内部的变量中,这些变量是\1、\2...,\1表示第一组括号中的pattern中匹配到字符串,同理\2表示第二组括号中匹配到的字符串。具体的说就是\n:模式中第几个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;不是模式本身,而是匹配到的结果。

后向引用:引用前面的括号中的模式所匹配的字符串。举例说明:

test.txt文件中有两行字符串分别为:abtcd fbtce和dbtca rbdca。我要找出找出第一个字符串就可以使用".\(b.c\).*\1."精确的匹配出了。具体操作命令在本文后面给出。

5)POSIX字符类

为了在不同的国家的字符编码中保持一致, POSIX(The Portable Operating System Interface)增加了特殊的字符类,常见的有:

[[:alnum:]]

所有字母和数字

[[:alpha:]]

所有字母

[[:digit:]]

所有数字

[[:upper:]]

所有大写字母

[[:lower:]]

所有小写的字母

[[:space:]]

空白字符

[[:punct:]]

标点符号

扩展正则表达式与基本正则的主要区别如下:

基本正则表达式 扩展正则表达式
\+ +
\? ?
\{m\} {m}
\{m,n\} {m,n}
\(PATTERN\) {m,n}

另外,扩展正则表达式多了一个或者“|”的概念。

介绍完了基本正则表达式,我们就可以来说说grep的具体用法了。前文已经对grep的来历和作用做了简单的介绍,现在我们来介绍下grep的基本用法。

命令的基本格式:

grep [OPTIONS] PATTERN [FILE...]
        grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

常用命令选项:

-i, --ignore-case:匹配时忽略大小写

-v, --invert-match:反向匹配,只显示不匹配的

-e PATTERN, --regexp=PATTERN:使用多个正则表达式

-o, --only-matching:只显示匹配到的文本本身

-q, --quiet, --silent:常用于脚本中

-f FILE, --file=FILE:从文件中读取正则表达式

--color[=WHEN], --colour[=WHEN]:对匹配到文本着色后高亮显示

-E, --extended-regexp:使用扩展正则表达式匹配,相当于egrep

grep常用选项练习:

在/tmp/目录下有个greptest.txt文件,其内容如下;

[root@localhost ~]# cat /tmp/greptest.txt
This is first
how are you
How old are you
fine,thanks
what,so what
What is you name
[root@localhost ~]#

1、匹配文件中包含字符“you”的行

[root@localhost ~]# grep "you" /tmp/greptest.txt
how are you
How old are you
What is you name
[root@localhost ~]#

2、匹配文件中包含字符“you”的行,且只输出匹配的行。

[root@localhost ~]# grep -o "you" /tmp/greptest.txt
you
you
you
[root@localhost ~]#

3、匹配文件中不包含字符“you”的行

[root@localhost ~]# grep -v "you" /tmp/greptest.txt
This is first
fine,thanks
what,so what
[root@localhost ~]#

4、匹配文件中包含字符“what”的行且不区分大小写

[root@localhost ~]# grep -i "what" /tmp/greptest.txt
what,so what
What is you name
[root@localhost ~]#

5、匹配文件中包含字符“fine”的行和下一行

[root@localhost ~]# grep -A 1   "fine" /tmp/greptest.txt
fine,thanks
what,so what
[root@localhost ~]#

6、匹配文件中包含字符“fine”的行和上一行

[root@localhost ~]# grep -B  1   "fine" /tmp/greptest.txt
How old are you
fine,thanks
[root@localhost ~]#

7、匹配文件中包含字符“fine”的行和上下各一行

[root@localhost ~]# grep -C  1   "fine" /tmp/greptest.txt
How old are you
fine,thanks
what,so what
[root@localhost ~]#

8、使用包含正则表达式的文件进行文本搜索

[root@localhost ~]# cat /tmp/grep
^f.*s$
[root@localhost ~]# grep -f /tmp/grep /tmp/greptest.txt
fine,thanks
[root@localhost ~]#

9、多个正则表达式搜索文本

[root@localhost ~]# grep -e  "^H.*u" -e  "^f.*s$"  /tmp/greptest.txt
How old are you
fine,thanks
[root@localhost ~]#

grep经典练习:

在/tmp目录下有一个文件greptest1.txt,其内容如下:

[root@localhost ~]# cat /tmp/greptest1.txt
He like his liker
He love his lover
138074082711
She love her lover
jie231@sina.cn
She like her lover
18618203761
12
234
19209783900
1.0.0.254
1.0.0.255
255
256
1.2.3.4
223.255.255.254
224.255.255.252
2.255.255.255
1329873909
5678967@qq.com
12589098379
15608764083
ken_tom@netcom.org
jerry#li@baidu.net
li@souhu.net
1369087689015820974619
[root@localhost ~]#

1、分组与引用练习,搜索同时包含love和lover的文本

[root@localhost ~]# grep -E ".+(l.v.).+\1r" /tmp/greptest1.txt
He love his lover
She love her lover
[root@localhost ~]#

2、数字查找练习,匹配1-255的数字

[root@localhost ~]# grep -E "^([1-9]|[1-9][1-9]|1[1-9][1-9]|2[1-4][1-9]|25[1-5])\$"  /tmp/greptest1.txt
12
234
255
[root@localhost ~]#

3、ip地址查找练习,匹配ABC类IP地址即 1.0.0.1---223.255.255.254

[root@localhost ~]# grep -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\.(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>" /tmp/greptest1.txt
1.0.0.254
1.2.3.4
223.255.255.254
[root@localhost ~]#

4、匹配Email地址:任意长度数字字母@任意长度数字字母.(com"org|net等等)

[root@localhost ~]# grep -E "^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$" /tmp/greptest1.txt
jie231@sina.cn
5678967@qq.com
ken_tom@netcom.org
li@souhu.net
[root@localhost ~]#

5、匹配手机号码:手机号码是1[3|4|5|8]后面接9位数字的

[root@localhost ~]# grep -E  "\<1[3|4|5|8][0-9]{9}\>" /tmp/greptest1.txt
18618203761
15608764083
13690876890
15820974619
[root@localhost ~]#

转载于:https://blog.51cto.com/zww577593841/1759392

新手学习Linux之grep相关推荐

  1. 新手学习Linux之快速上手分析

    一.起步 首先,应该为自己创造一个学习linux的环境--在电脑上装一个linux或unix 问题1:版本的选择 北美用redhat,欧洲用SuSE,桌面mandrake较多,而debian是技术最先 ...

  2. 新手学习Linux——rsync+shell脚本完成自动化备份

    (自行理解) -------------------分割线----------------- 首先关掉防火墙 iptables -F iptables -X iptables -Z iptables ...

  3. 你究竟该如何学习Linux系统?

    现在社会信息技术快速发展,不知道从什么时候开始linux变得越来越热门了.其实本人最初使用linux是很无奈的事情.当时因为还是学生,淘了一个旧的笔记本,做一些文字处理的工作.原本安装的Windows ...

  4. Linux系统新手学习的11点建议

    随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起.这里介绍学习Linux的一些建议. 一.从基础开始:常常有些朋友在Linux论 ...

  5. 如何学习Linux / 新手入门

    如何学习Linux / 新手入门 一.从基础开始:常常有些朋友在Linux论坛问一些问题,不过,其中大多数的问题都是很基础的.例如:为什么我使用一个命令的时候,系统告诉我找不到该目录,我要如何限制使用 ...

  6. Linux新手大礼包:学习Linux你必须知道的那些事儿

    欢迎加入Linux的大家庭!对你来说,这可能还是一个陌生的领域,不过相信随着逐步深入的了解,你会喜欢上Linux,喜欢上开源的!首先,让我们来看一下,Linux新手应该注意和了解哪些事情吧! 1.   ...

  7. linux管道符查看家目录,深入学习Linux之Linux中的管道符 | 和grep,awk,cut命令

    学习Linux期间最常用三个命令和一个符号,管道符 | 和grep,awk,cut,并且它们几个经常一起使用,简直就是亲兄弟呀.所以我将他们单独整理 为了让大家更容易的看清楚示例,我将附上测试文件,文 ...

  8. Linux新手学习起步

    因为岗位变动现在接触一些科技.网络方面的工作,所以想多学一些知识丰富一下大脑的储备.不能让其他同事说我是大外行! 实话实说工作已经16年了,原来上学期间对电脑.对网络还是比较喜欢的.虽然不是计算机等相 ...

  9. 新手学习嵌入式Linux和Android开发板推荐

    一,确定目标,linux是一个非常非常大的概念.想全部吃透是不可能的.理想的说,搞懂linux,就可以做所有工作.个人更倾向于说想做什么样工作,需要侧重学linux的哪部分. 二,选择开发板 学习嵌入 ...

  10. Linux正则表达式grep与egrep

    grep -io "http:/=[A-Z0-9]\{16\}" ./wsxf.txt >wsxf_urls.txt Linux正则表达式grep与egrep 正则表达式:它 ...

最新文章

  1. Swift Code Snippet
  2. iphone连上wifi却上不了网_路由器上不了网怎么解决 路由器上不了网解决方法【详解】...
  3. 记录从数据库把数据初始化mongodb缓存的一些坑
  4. centos7建站php_搭建centos7 的php环境
  5. mysql linuxl环境搭建_Linux环境下的MySQL搭建
  6. MCUXpress IDE常用设置
  7. 洛谷——P1035 [NOIP2002 普及组] 级数求和
  8. DevExpress WinForm 控件汉化方法 代码(一)
  9. 极客时间-算法训练营 3.2
  10. 这一晚注定属于C罗!回归首秀梅开二度,现场超过7万球迷见证这场胜利
  11. RNAcentral 数据库简介
  12. matlabrobert锐化_图像锐化matlab算法
  13. Pytorch中函数参数dim的理解
  14. 高级商务办公软件应用【9】
  15. 关于 网页 链接 分享朋友圈 更换title 文字方法
  16. 数组统计问题(统计各学生的优秀率及格率)C语言
  17. java中的同步与异步
  18. 自己写编程语言-m语言
  19. 国家电网:企业数字化发展的“3-3-4”框架!
  20. 经济学方面的电子书挺多

热门文章

  1. MongoDb 聚合报错
  2. javascript之事件模型
  3. onmouseover|onmouseout和onmouseenter|onmouseleave的区别
  4. Python学习笔记(5)practice:shopping_cart
  5. luogu P1307 数字反转
  6. C#中缓存的简单方法及使用Sql设置缓存依赖项
  7. Ubuntu下配置JDK
  8. 从源码角度深入理解LayoutInflater
  9. 周记【距gdoi:105天】
  10. swoole怎么做mysql连接池_Swoole4创建Mysql连接池