Linux学习资料-基础正规表示法(grep)

基础正规表示法:
 
 

--------------------------------------------------------------------------------

grep
 
语法: [root @test /root ]# grep [-acinv] ‘搜寻字符串‘ filename
参数说明:
-a :将 binary 档案以 text 档案的方式搜寻数据
-c :计算找到 ‘搜寻字符串‘ 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 ‘搜寻字符串‘ 内容的那一行!
范例:
[root @test /root]# grep ‘root‘ /var/log/secure 
将 /var/log/secure 这个档案中有 root 的那一行秀出来
[root @test /root]# grep -v ‘root‘ /var/log/secure
若该行没有 root 才将数据秀出来到屏幕上!

[root @test /root]# last | grep root
若该行有 root 才将数据秀出来到屏幕上!

[root @test /root]# grep [A-Z]ANPATH /etc/man.config
将 /etc/man.config 这个档案当中,所有有:
[任何一个大写字符]后面接 ANPATH 的那一行就显示出来!
例如 AANPATH, BANPATH.... ZANPATH 等等!
 
说明:
grep 是一个很常见的指令,最重要的功能就是进行字符串数据的比对了,需要说明的是『grep 在一个档案中查寻一个字符串时,他是以"整行"为单位来数据的撷取的!』也就是说,假如一个档案内有 10 行,其中有两行具有你所搜寻的字符串,则将那两行显示在屏幕上,其它的就丢弃了!而 grep 除了可以进行档案的资料搜寻之外,也常常被应用在 input/output 的数据处理当中,例如常见的管线命令 ( pipe ) 就可以常常见到他的踪影!以上面的例子来看,我们可以发现前两个例子是查寻档案的内容,有没有加上 -v 所显示出来的结果是『相反的!』,而第三个例子则是以 pipe 的功能进行数据的处理的喔!至于最后一个例子比较特殊,使用到中括号 [] ,这是什么意思呢?
 
在中括号里面『只有一个字符』,而里面的内容就是『字符的范围』啦!所以呢[A-Z]就是指:『A到Z当中的任何一个字符都能被接受,但是只有一个字符』的意思!所以,如果我想要所有的数字都接受,那就是[0-9],如果我只要接受 1,3,5 呢?就是[135]或者可以用逗号隔开[1,3,5]!所以啦,那个减号 - 在中括号当中,代表『一个范围(range)』的意思啦!中括号还有很多用途呢!底下会更详细介绍!
 
grep 是最简单的正规表示法搜寻指令之一,他并不支持一些更严谨的正规表示法内容,不过,已经相当的好用啦!底下我们就以一个档案做为练习吧!先来查看一下这个档案内容:
  [root @test /root ]# vi regexp.txt
This is a cat, however, I need a dog.
I want to "Happy" and <Happy> and /Happy/ here.
* I don‘t know how to do this *
# I don‘t Know how to do this $
^ I don‘t KNOW how to do this @
OK!     everythins is OK
Now, I will eat my food
are you         finished your work
what do you 123 goto where
tesaaaaatest
quit bbbbqqa testglgs
i will shutdown my mechine
bye bye
 
这个档案是鸟哥在 MS dos 的环境中编辑的,所以他还含有一些特殊的字符喔!使用 vi 来查看的时候还没有很清楚,如果使用 cat -A 来查看时,会出现什么呢?
  [root @test /root ]# cat -A regexp.txt
This is a cat, however, I need a dog.^M$
I want to "Happy" and <Happy> and /Happy/ here.^M$
* I don‘t know how to do this *^M$
# I don‘t Know how to do this $^M$
^ I don‘t KNOW how to do this @^M$
OK! ^Ieverythins is OK^M$
Now, I will eat my food^M$
are you ^Ifinished your work^M$
what do you 123 goto where^M$
tesaaaaatest^M$
quit bbbbqqa testglgs^M$
i will shutdown my mechine^M$
bye bye^M$
 
上面粗体的地方就是 DOS 档案底下的特殊字符啦!比较一下用 vi 与 cat -A 秀出来的结果有什么不同?而主要的 DOS 字符有:
^M :表示断行字符;
^I :表示 <tab> 造成的按键符号;
$  :表示每一行的行尾之意!
这个 regexp.txt 档案你可以在 http://linux.vbird.org/download/index.php#regular 下载回去做练习喔!好了,假设你已经将这个档案给他捉到自己的 Linux 底下了,此时,应该要来做一些小练习啰!赶紧看看吧!
  例题一:找出这个档案里面含有 know 这个字符,并将行号列出来:
[root @test /root ]# grep -n ‘know‘ regexp.txt
3:* I don‘t know how to do this *
grep 会一行一行的去比对 know 这个字符串,请注意,大小写是不一样的!
当该行里面没有 know 这个字符串时, grep 就会将该行舍弃而不显示出来,
不过,到第三行时,出现了 know 了,所以第三行就会被显示出来啦!
例题二:找出这个档案里面含有 * 这个字符,并将行号列出来:
[root @test /root ]# grep -n ‘\*‘ regexp.txt
3:* I don‘t know how to do this *
请特别留意喔,在正规表示法里面有相当多的『特殊字符』存在,而要
取消掉这些特殊字符的属性时,反斜线『\』的存在就显的特别重要了!
在这个例子中,或许你会发现使用 grep -n ‘*‘ regexp.txt 也可以得到
相同的结果,但是,良好的习惯是需要养成的,这里,请以较为正统的
正规表示法来去除 * 这个特殊字符的属性,对您以后一定会有很多的好处的!

例题三:我要将所有 know 不论大小写都列出来,并列出行号:
[root @test /root]# grep -ni ‘know‘ regexp.txt
3:* I don‘t know how to do this *
4:# I don‘t Know how to do this $
5:^ I don‘t KNOW how to do this @
如果不理会大小写的差异,加入 -i 这个参数吧!列出行号就以 -n 来达成!
 
 

--------------------------------------------------------------------------------

正规表示法的特殊字符(charaters)与 egrep 指令
 
正规表示法不止于寻找简单的字符串,他还有相当多的额外功能提供我们使用者组合、分析字符串,底下我们先来列出几个常见的正规表示法的特殊字符,搭配刚刚您下载的档案,然后再以右边的范例来实习一下吧!
  特殊字符 表示意义与范例
^word 意义:待搜寻的字符在行首
说明:
搜寻 word 这个字符串,『并且 word 必需为这一行的行首』。
范例:
找出档案中以 i 为开头的那一行,并且忽略大小写:
[[email protected] root]# grep -in ‘^i‘ regexp.txt
2:I want to "Happy" and <Happy> and /Happy/ here.
12:i will shutdown my mechine
word$ 意义:待搜寻的字符在行尾
说明:
搜寻 word 这个字符串,并且 word 必需为这一行的行尾
范例:
由于鸟哥提供的档案其实是 DOS 档案下的产物,所以字尾都会存在着 ^M 的字符,因此,我们先以 tr 这个指令将这个字符给他去掉,然后再找出字尾为 ye 的那一行,并显示出来!关于更多的 tr 指令的用法,我们会在后面进行说明。
[[email protected] root]# cat regexp.txt|tr -d ‘\r‘ grep -n ‘ye$‘
13:bye bye
. 意义:代表『一个』任意字符,一定要有『一个字符』存在
说明:
这个『.』在正规表示法当中很常用,代表的是『一个』任意字符,不是 0 个也不是多个,恰恰好就是『一个』。
范例:
我要将档案中有 e 与 t 并且中间含有一个字符的该行抓出来,注意喔! e 与 t 的中间一定会有一个字符存在才是成功的喔!例如下列范例:
[[email protected] root]# grep -n ‘e.t‘ regexp.txt
7:Now, I will eat my food
10:tesaaaaatest
11:quit bbbbqqa testglgs
\ 跳脱符号将特殊字符变成普通字符
? 任何一个『单一』字符
* 随意几个任意字符
[list] 列表中的字符
[range] 列表中范围内的字符
[^list] 反向选择,与 [list] 相反
[^range] 反向选择,与 [range]相反
\{n\} 与前一个相同字浮连续 n 个
\{n,m\} 与前一个相同字浮连续 n-m 个
 
请特别留意的是,『正规表示法的特殊字符』与一般在指令列输入指令的『万用字符』并不相同,例如,在万用字符当中, * 代表的是 0 ~ 无限多个字符的意思,但是在正规表示法当中, * 则是重复前一个字符的意思~使用的意义并不相同,不要搞混了!(鸟哥我一开始摸正规表示法时就很容易搞混!因为这里是新手最容易搞错的地方,特别小心啊!)
  题:我想要知道,在 /etc 底下,只要含有 XYZ 三个字符的任何一个字符的那一行就列出来,要怎样进行?
答:
『只要』含有 X 或 Y 或 Z 就将该行列出来,因此,我们的范围很很广啦!这个时候就必需要使用到 [] 这个咚咚!还记得中括号的用途吗?那就是『在中括号里面谨代表一个字符而已!』而这个中括号是一个『代表』,可以是一串字也可以是几个不连续的字!这里我们仅需要 XYZ 其中任何一个,所以可以这样写:
grep [XYZ] /etc/*
则只要在每一行当中,只要发现 X 或 Y 或 Z 任何一个,就会将他印出来!这个与 grep XYZ /etc/* 是『完全不一样』的!请仔细的思考一下ㄟ!
  例题:我想要知道在 /etc 里面,只要句首是 w-z 的就将他印出来?
答:
同样的,使用中括号!
grep ^[w-z] /etc/*
 
当然还有很多很多用法啦!毕竟一个正规表示法加上他附属的一些指令,几乎可以出一本书了,这里仅是想让大家了解他的好处罢了!所以就写到这里!其它的,就等着您去参详与发现啰!

--------------------------------------------------------------------------------

diff
语法: [root @test /root ]# diff file1 file2
参数说明:
范例:
[root @test /root]# diff index.htm index.html
说明:
这是用来比较两个档案内容是否有不一致的指令!

--------------------------------------------------------------------------------

awk
语法: [root @test /root ]# last | awk ‘{print $1 " " $2}‘
参数说明:
范例:
[root @test /root]# 
说明:
施工中

--------------------------------------------------------------------------------

sed
语法: [root @test /root ]# last | sed 10,\$d 
参数说明:
范例:
[root @test /root]# 
说明:
施工中

时间: 2024-07-29 17:30:12

Linux学习资料-基础正规表示法(grep)的相关文章

linux学习资料持续更新中

一.LINUX基础教程 1.老男孩系列免费视频: 1) linux高薪入门实战视频教程(第二部)老男孩linux教程 http://edu.51cto.com/course/course_id-1035-page-1.html 2) 跟着老男孩从0开始一步步实战深入学习linux运维(三) http://edu.51cto.com/lesson/id-11909.html linux学习资料持续更新中,布布扣,bubuko.com

Linux学习 -- Shell基础 -- Bash基本功能

历史命令 history -c   clear -w   写入 ~/.bash_history 默认保存1000条, 可在/etc/profile中修改 调用 Tab补全 命令.目录.文件 命令别名 alias 别名='原命令' 命令执行顺序: 绝对路径或相对路径 > 别名 > Bash的内部命令 > $PATH环境变量中找到的第一个命令(外部命令) 配置文件:/root/.bashrc 删除:unalias 别名 常用快捷键 输入输出重定向 标准输入输出 输出重定向 注意:2和>

Linux学习资料整理

Shell Linux Shell脚本教程:30分钟玩转Shell脚本编程 Bash Shell字符串操作小结 vi vim使用 vi.vim删除以及其他命令 Vim静态模板文件 打造自己的vim界面 命令 linux中grep命令的用法 linux之sort用法 gawk gawk手册 Common threads: Awk by example, Part 1 sed sed命令用法详解 Linux学习资料整理

Linux学习 -- Shell基础 -- 概述

Shell是什么? 命令解释器 编程语言 Linux支持的Shell类型 cat /etc/shells 主要学习 bash 脚本执行方式 echo echo -e 单引号 -- 原始字符串  双引号 -- 支持转义字符串 \e[1;31m xxx  开启颜色 \e[0m    关闭颜色 首行:#!/bin/bash #写好注释 执行方式: 方式1 sh xxx.sh 方式2 chmod 755 xxx.sh  ./xxx.sh 或 绝对路径 Linux学习 -- Shell基础 -- 概述

Linux学习资料-管线命令 ( pipe )

管线命令 ( pipe ) 就如同前面所说的, bash 命令执行的时候有输出的数据会出现!那么如果这群数据必需要经过几道手续之后才能得到我们所想要的格式,应该如何来设定?这就牵涉到管线命令的问题了( pipe ),管线命令使用的是『 | 』这个界定符号!另外,管线命令与『连续下达命令』是不一样的呦!这点底下我们会再说明.底下我们先举一个例子来说明一下简单的管线命令. 假设我们要读取 last 这个指令中,那个 root 登入的『次数』应该怎么作?注意呦!我们只需要『次数』.那么我所进行的步骤是

Linux学习之基础篇

一.Linux学习的必备条件: 1. 计算器概论不硬件相关知识: 2. 先从Linux癿安装不挃令学起: 3. Linux操作系统的基础技能:『使用者.群组癿概忛』.『权限癿观忛』,『程序的定义』等等: 4. 务必学会vi文书编辑器: 5. Shell不Shell Script癿学习: 6. 一定要会软件管理员:Tarball/RPM/DPKG 等软件管理员的安装方式,对你来说重要的不行了.(嵌入式设备,学术研究单位) 7. 网绚基础癿建立:IP概念,路由的概念等等:

Linux学习资料-万用字符与特殊符号

万用字符与特殊符号 由于在 bash 当中常会使用到一些万用字符,与搭配特殊符号来将指令做更好的利用(例如最常提到的正规表示法 Regulare Express )!底下我们列出一些常用的万用字符与特殊符号: 符号 内容 * 万用字符,代表一个或多个字符(或数字) ? 万用字符,代表一个字母 # 批注,这个最常被使用在 script 当中,视为说明! \ 跳脱符号,将『特殊字符或万用字符』还原成一般字符 | 分隔两个管线命令的界定: ; 连续性命令的界定(注意!与管线命令并不相同) ~ 使用者的

大数据学习初体验:Linux学习+Shell基础编程+hadoop集群部署

距离上次博客时间已经9天,简单记录下这几天的学习过程 2020-02-15 10:38:47 一.Linux学习 关于Linux命令,我在之前就已经学过一部分了,所以这段时间的linux学习更多的是去学习Linux系统的安装以及相关配置多一些,命令会一些比较常用的就够了,下面记录下安装配置Linux系统时的注意事项. 这里配置的虚拟机的内存为4g 使用的 CentOS-6.5-x86_64-minimal.iso 映射文件 在进入linux系统中时,需要将虚拟机的主机名修改成自己想要的名字,还要

Linux学习日记--基础命令(6)--grep及正则表达式

grep: Global search REgular expression and Print out the line.        作用:文本搜索工具,根据用户指定的"模式"对目标文本逐行进行匹配检查:打印匹配到的行:            模式:由正则表达式字符及文本字符所编写的过滤条件:            REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能:                分两类: