现在的位置: 首页 > 综合 > 正文

《shell脚本学习指南》—预备知识:grep和sed的进阶用法

2014年11月22日 ⁄ 综合 ⁄ 共 2173字 ⁄ 字号 评论关闭

grep最重要的功能就是进行字符串数据的比对,然后将符合用户需求的字符串打印出来。

(1)几个参数

-A:后面可加数字,为after的意思,除了列出该行外,后续的n行也列出来;

-B:后面可加数字,为befer的意思,除了列出该行外,前面的n行也列出来;
--color=auto可将正确的那个撷取数据列出颜色。

自动加上颜色显示的办法:

$sudo vim ~/.bashrc
alias grep='grep --color=auto'

保存后退出

$source ~/.bashrc

(2)几个重要的符号

^ 符号,在字符集符合(括号[])之内与之外是不同的!!在[]内代表反向选择,在[]之外则代表定位在行首的意义。

注意:在选取“.”也就是句末句号的时候需加上跳脱字符(\)来加以解除其某种特殊意义。

当我们想要取出两个连续或两个以上的相同的字母,我们需要加上:o*,oo*还是ooo*?先看*的含义,它代表重复0个或多个前面的RE字符,因此[o*]代表是拥有空字符或一个o以上的字符,[oo*]代表第一个o肯定必须存在,第二个o则是可有可无的多个o,所以,凡是含有o,oo,ooo,oooo等等,都可以被列出来。

和 
.

g* 代表空字符或一个以上的g,如果是g*g就代表着是g,gg,ggg,gggg等等,所以这样的只要查询的那一行拥有一个以上的g就符合g*g的需求

g...g 代表着中间有三个任意字符,两边都是g的字符串

g.*g我们可以将两者结合起来,形成 g.*g 的形式,分析这个形式的时候,我们先了解这些内容,* 可以是0或者多个重复前面的字符,而 . 是任意一个字符,所以 .* 就代表着0或者多个任意字符。这样我们就可以知道g.*g代表的是两端为g,中间为任意多个的任意字符的字符串。

{},o\{2\} 代表的意思是找出至少有两个o的字符串,显然,google,goooooogle符合此要求,我们可以看出 ooo* 与它的意思是一样的。但是要是我们想要限制o出现的次数呢?
go\{2,4\} 可以限制o的出现次数,它表示g后面连着2-4个o;如果我们再在它后面加上一个g,变成go\{2,4\}g后,满足条件的就只有:goog,gooog,goooog了;将4去掉,变成go\{2,\}g后,就与gooo*g等价了。
(注意:\ 为跳脱字符,它的作用是将特殊符号的特殊意义去除)

应用:当我们把grep用在管道命令中的时候,它将会发挥很大的作用,使工作事半功倍。
例:ls -l | grep -i 'm'   #它将会把你所在目录下的 -l 能显示的文件信息中含有m或M的文件给找出来。

××××××××××××××××××××××××××分隔线×××××××××××××××××××××××××××××××××××××××

(1)运行下面的命令试试:

$sudo nl /etc/passwd | sed '1,4d'


这个命令会将/etc/passwd里面的第一行到第四行的内容删除之后列出此文件的内容,虽然木有真正在文件里删除,它只是在它输入到standin的时候把一到四行的内容截断了。
如果想要把第三行开始的后面所有内容都截断输出该怎么办?想想grep里面的$的用法,只需变为‘3,$d’就可以了。

(2)当我们想要截取这个文件里面的2-5行内容又该怎么办?


我们知道在sed的功能里面 p 可以打印出信息,是不是利用‘2,5p’就OK了呢?在运行这个命令之后,我们会发现文件内容不仅全部输出了,而且在2-5行里每行后面都跟了一个相同行,显然这个命令不是我们想要的。
man sed一下可以知道,如果加上-n 的参数,就可以达到我们想的,具体的-n功能man一下就可以看见。

(3)sed 's/ #the string'll be replace/ #new string/g'

这个命令可以让我们轻易地将输出的文件内容部分被换成我们想的内容。
鸟哥的私房菜中有这么一个经典的例子去说明这个命令的应用:

#取出IP地址

$ /sbin/ifconfig eth0
$ /sbin/ifconfig eth0 | grep 'inet addr'
$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' 
$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' |\
>sed 's/Bcast.*$//g'

这个命令貌似很长,我们可以利用简单的shell来实现它的功能:

$ cat > find_ip
#!/bin/sh -
#This is a shell to find your ip
/sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
^D
$sudo chmod +x find_ip
$./find_ip

(4)危险动作:sed可以直接修改内容


-i:可以允许你直接修改文件内容而不用从屏幕输出
例1:sed -i 's/.$/!/g' regular.txt
如果regular.txt文档中有以 . 结尾的,将被换为 !
例2:sed -i '$a#This is a test' regular.txt
在文末加上“This is a test”。

不需要vi就可以直接对文档做简单的修改,这是一个很棒的功能,但是必须要小心使用,以免把系统整挂了。。。。

抱歉!评论已关闭.