正規表示法


假设你今天需要将这个月份曾经登入过主机的使用者调出来,要执行什么指令呢?没错!就是 last 这个指令!但是会不会觉得使用 last 时,如果你的登入者太乱了,这样的话很不容易发现到底我们要调查的那一个使用者在何时出现过?假设我们需要将 root 的资料调出来,那么应该如何作呢?呵呵呵呵!使用 grep 吧!他可以使用比对的方式来将 last 一行一行资料分析,发现该行有 root 这个字时,就会立刻将该行调出来!嗯!相当棒的一个指令!而这个就涉及到『正规表示法』的内容了! 
正规表示法 ( 也有称为常规表示法的,无论如何,就是 Regular Express 的翻译啦! ) 使用的地方相当的广泛,我们提一个常常用到的例子来做说明好了!假如我们在自己的目录下有相当多的档案,而我要找一个档案,他的内容含有一个字串,叫做是『VBird talk』,那么要如何来找出这个档案呢?很简单啦!就直接将每个档案的内容捉出来,然后逐一加以比对,如果在比对的过程中发现了 VBird talk 这个字串,那么就将该行输出到萤幕上,那么您自然也就可以知道他是在那个档案里面啰!搜寻上面很是简单!而要提到正规表示法就不能不提到 grep 这个指令,底下我们先来谈一谈 grep 这个指令的用法吧! 
· grep 
语法: 
[root @test /root ]# grep "word" filename 参数说明: 范例: [root @test /root]# grep root /var/log/secure   <==将 /var/log/secure 这个档案中有 root 的那一行秀出来 [root @test /root]# grep "*[a-d]*" /var/log/secure<==将每一行中有a-d 的就予以输出
说明: 
在上面的第一个例子中,我们知道系统的登入资讯档都记录在 /var/log/secure 这个登录档中,那么如何将这个档案里面关于 root 的资料取出来呢?!就使用 grep 就对啦!很简单吧!但他是很有用的资讯呦! 
例题:我想要知道 /var/log/messages 这个档案里面,所有跟 kernel 有关的文字! 答: 想要知道的是 kernel ,找这个关键字即可,所以直接: grep kernel /var/log/messages
例题:我想要知道某个档案里面含有 boot 的字眼,而这个档案在 /etc/ 底下,我要如何找出这个档案? 答: 既然知道有这个字眼那就好办了!可以直接下达: grep boot /etc/*
例题:我想要找出在 /etc 底下,档案内容含有 * 的档案名称? 答: 由于 * 是特殊字元,在变数的订定法则里面曾经提过要将特殊字元移除,需要使用跳脱字元,亦即是 \ 符号,所以我可以这样下达指令: grep \* /etc/*
此外,除了正规表示法之外,我们还可以藉由万用字元的搭配来进行字串的搜索与其他相关的使用。底下列出几个常见的咚咚让大家了解一下! 
 
· 例题:我记得有个档案在 /etc/ 底下,而且他的内容中,有一行是以 boot 做为开头,我要如何查询这个档案呢? 答: 由于知道 boot 是在该行的第一个字元,所以我可以这样找出来: grep ^boot /etc/* 对照上面的表格后,您应该可以了解, ^ 表示『句首』的意思!
题:我想要知道,在 /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]#