📄 0330regularex.htm
字号:
<tr><td rowspan=2 align=center>?</td><td>『零个或一个』的前一个 RE 字符</td></tr>
<tr><td>范例∶<font face='细明体' color=#000088><b>egrep -n 'go?d' regular_express.txt</b></font><br>
<font color=#00AA00>搜寻 (gd) (god) 这两个字串。
那个 o? 代表『空的或 1 个 o 』所以,上面的执行成果会将第 13, 14 行列出来。<br>
有没有发现到,这两个案例( 'go+d' 与 'go?d' )的结果集合与 'go*d' 相同?
想想看,这是为什么喔! ^_^</td></tr>
<tr><td rowspan=2 align=center>|</td><td>用或( or )的方式找出数个字串</td></tr>
<tr><td>范例∶<font face='细明体' color=#000088><b>egrep -n 'gd|good' regular_express.txt</b></font><br>
<font color=#00AA00>搜寻 gd <b>或</b> good 这两个字串,注意,是『或』!
所以,第 1,9,14 这三行都可以被列印出来喔!那如果还想要找出 dog 呢?就这样啊∶<br>
egrep -n 'gd|good|dog' regular_express.txt</td></tr>
<tr><td rowspan=2 align=center>( )</td><td>找出『群组』字串</td></tr>
<tr><td>范例∶<font face='细明体' color=#000088><b>egrep -n 'g(la|oo)d' regular_express.txt</b></font><br>
<font color=#00AA00>搜寻 (glad) 或 (good) 这两个字串,因为 g 与 d 是重复的,所以,
我就可以将 la 与 oo 列于 ( ) 当中,并以 | 来分隔开来,就可以啦!<br>
此外,这个功能还可以用来作为『多个重复群组』的判别喔!举例来说∶<br>
<font face='细明体' color=#000088><b>echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'</b></font><br>
上面的例子当中,意思是说,我要找开头是 A 结尾是 C ,中间有一个以上的
"xyz" 字串的意思~<td></tr>
</table><br>
以上这些就是延伸型的正规表示法的特殊字元。另外,要特别强调的是,那个 ! 在正规表示法当中并不是特殊字元,
所以,如果您想要查出来档案中含有 ! 与 > 的字行时,可以这样∶
<ul><font face="细明体">grep -n '[!>]' regular_express.txt</font></ul>
这样可以了解了吗?!常常看到有陷阱的题目写∶『反向选择这样对否? '[!a-z]'?』,
呵呵!是错的呦~要 '[^a-z] 才是对的!
</div>
<hr><a NAME="printf"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">格式化列印∶ printf</span><br>
<div class=block1>
在很多时候,我们可能需要将输出的资料给他格式化输出的~
举例来说,考试卷分数的输出,姓名与科目及分数之间,总是可以稍微作个比较漂亮的版面配置吧?
例如我想要输出底下的样式∶<br>
<table class="term"><tr><td class="term"><pre>
Name Chinese English Math Average
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33
</pre></td></tr></table>
分成五个栏位,各个栏位分配到正确的位置去!但是因为每个栏位的原始资料其实并非是如此固定的,
而我就是想要如此表示出这些资料,此时,就得需要列印格式管理员 printf 的帮忙了!
printf 可以帮我们将资料输出的结果格式化,而且而支援一些特殊的字符~底下我们就来看看!<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>printf '列印格式' 实际内容</span>
<span class=term_say>参数∶
关于格式方面的几个特殊样式∶
\a 警告声音输出
\b 倒退键(backspace)
\f 清除萤幕 (form feed)
\n 输出新的一行
\r 亦即 Enter 按键
\t 水平的 [tab] 按键
\v 垂直的 [tabl] 按键
\xNN NN 为两位数的数字,可以转换数字成为字元。
关于 C 程式语言内,常见的变数格式
%ns 那个 n 是数字, s 代表 string ,亦即多少个字元;
%ni 那个 n 是数字, i 代表 integer ,亦即多少整数位数;
%N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数位数,
假设我共要十个位数,但小数点有两位,即为 %10.2f 棉!
范例∶</span>
<span class=term_hd>范例一∶将刚刚上头的资料变成档案,仅列出姓名与成绩∶(用 [tab] 分隔</span>
[root@linux ~]# <span class=term_command>printf '%s\t %s\t %s\t %s\t %s\t \n' `cat printf.txt`</span>
Name Chinese English Math Average
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33
<span class=term_say># 假设我将上面的档案存成 printf.txt 档案档名,则可利用上面的案例,
# 将每个单字中间以 [tab] 按键隔开。由上面的输出来看,虽然第二行以后是 OK 的,
# 但是第一行则因为某些单字长度较长,所以就无法对齐了!而 %s 表示以字串 (string)
# 的方式来展现该内容。而每个内容则以 \t 即 [tab] 来隔开啊!</span>
<span class=term_hd>范例二∶将上述资料关于第二行以后,分别以字串、整数、小数点来显示∶</span>
[root@linux ~]# <span class=term_command>printf '%10s %5i %5i %5i %8.2f \n' `cat printf.txt |\</span>
> <span class=term_command>grep -v Name`</span>
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33
<span class=term_say># 这个时候的输出可就有趣了!我将几个内容分成不同的资料格式来输出,
# 最有趣的应该是 %8.2f 这个项目了!我可以针对不同的小数位数来进行格式输出,
# 例如变成底下的样子时,您自己试看看,会是输出什么结果喔!
# printf '%10s %5i %5i %5i %8.1f \n' `cat printf.txt | grep -v Name`</span>
<span class=term_hd>范例三∶列出数值 45 代表的字元为何?</span>
[root@linux ~]# <span class=term_command>printf '\x45\n'</span>
E
<span class=term_say># 这东西也很好玩~他可以将数值转换成为字元,如果您会写 script 的话,
# 可以自行测试一下,由 20~80 之间的数值代表的字元是啥喔! ^_^</span>
</pre></td></tr></table>
printf 的使用相当的广泛喔!包括等一下后面会提到的 awk 以及在 C 程式语言当中使用的萤幕输出,
都是利用 printf 呢!鸟哥这里也只是列出一些可能会用到的格式而已,
有兴趣的话,可以自行多作一些测试与练习喔! ^_^<br>
<div style="padding: 10 0 10 0 ;" align="right"><table width="90%"><tr><td><b>Tips:</b><br /><span style="font-style: italic; color : darkgreen"> 列印格式化这个 printf 指令,乍看之下好像也没有什么很重要的~
不过,如果您需要自行撰写一些软体,需要将一些资料在萤幕上头漂漂亮亮的输出的话,
那么 printf 可也是一个很棒的工具喔!
</span></td><td><img src="../images/vbird_face.gif" /></td></tr></table></div></div>
<hr><a NAME="sed"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">sed 工具简介</span><br>
<div class=block1>
在了解了一些正规表示法的基础应用之后,再来呢?呵呵~两个东西可以玩一玩的,那就是 sed 跟 awk 了!
这两个家伙可是相当的有用的啊!举例来说,鸟哥写的 logfile.sh 分析登录档的小程式,
绝大部分分析关键字的取用、统计等等,就是用这两个宝贝蛋来帮我完成的!
那么你说,要不要玩一玩啊?! ^_^<br><br>
我们先来谈一谈 sed 好了,基本上, sed 可以分析 Standard Input (STDIN) 的资料,
然后将资料经过处理后,再将他输出到 standrad out (STDOUT) 的一个工具。
至于处理呢?可以进行取代、删除、新增、撷取特定行等等的功能呢!很不错吧~
我们先来了解一下 sed 的用法,再来聊他的用途好了!<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>sed [-nefr] [动作]</span>
<span class=term_say>参数∶
-n ∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN
的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过
sed 特殊处理的那一行(或者动作)才会被列出来。
-e ∶直接在指令列模式上进行 sed 的动作编辑;
-f ∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的
sed 动作;
-r ∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i ∶直接修改读取的档案内容,而不是由萤幕输出。
动作说明∶ [n1[,n2]]function
n1, n2 ∶不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作
是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
function 有底下这些咚咚∶
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配
正规表示法!例如 1,20s/old/new/g 就是啦!
范例∶</span>
<span class=term_hd>范例一∶将 /etc/passwd 的内容列出,并且我需要列印行号,同时,请将第 2~5 行删除!</span>
[root@linux ~]# <span class=term_command>nl /etc/passwd | sed '2,5d'</span>
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
<span class=term_say>.....(后面省略).....</span>
<span class=term_say># 看到了吧?因为 2-5 行给他删除了,所以显示的资料中,就没有 2-5 行棉~
# 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!
# 同时也要注意的是, sed 后面接的动作,请务必以 '' 两个单引号括住喔!
# 而,如果只要删除第 2 行,可以使用 nl /etc/passwd | sed '2d' 来达成,
# 至于第 3 到最后一行,则是 nl /etc/passwd | sed '3,$d' 的啦! </span>
<span class=term_hd>范例二∶承上题,在第二行后(亦即是加在第三行)加上『drink tea?』字样!</span>
[root@linux ~]# <span class=term_command>nl /etc/passwd | sed '2a drink tea'</span>
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
<span class=term_say># 嘿嘿!在 a 后面加上的字串就已将出现在第二行后面棉!那如果是要在第二行前呢?
# nl /etc/passwd | sed '2i drink tea' 就对啦!</span>
<span class=term_hd>范例三∶在第二行后面加入两行字,例如『Drink tea or .....』『drink beer?』</span>
[root@linux ~]# <span class=term_command>nl /etc/passwd | sed '2a Drink tea or ......\</span>
> <span class=term_command>drink beer ?'</span>
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
<span class=term_say># 这个范例的重点是,我们可以新增不只一行喔!可以新增好几行~
# 但是每一行之间都必须要以反斜线 \ 来进行新行的增加喔!所以,上面的例子中,
# 我们可以发现在第一行的最后面就有 \ 存在啦!那是一定要的喔!</span>
<span class=term_hd>范例四∶我想将第2-5行的内容取代成为『No 2-5 number』呢?</span>
[root@linux ~]# <span class=term_command>nl /etc/passwd | sed '2,5c No 2-5 number'</span>
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
<span class=term_say># 没有了 2-5 行,嘿嘿嘿嘿!我们要的资料就出现啦!</span>
<span class=term_hd>范例五∶仅列出第 5-7 行</span>
[root@linux ~]# <span class=term_command>nl /etc/passwd | sed -n '5,7p'</span>
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
<span class=term_say># 为什么要加 -n 的参数呢?您可以自行下达 sed '5,7p' 就知道了!(5-7行会重复输出)
# 有没有加上 -n 的参数时,输出的资料可是差很多的喔!</span>
<span class=term_hd>范例六∶我们可以使用 ifconfig 来列出 IP ,若仅要 eth0 的 IP 时?</span>
[root@linux ~]# <span class=term_command>ifconfig eth0</span>
eth0 Link encap:Ethernet HWaddr 00:51:FD:52:9A:CA
<span class=term_write> inet addr:192.168.1.12 Bcast:192.168.1.255
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -