前提
LANG=C
alias grep=‘grep —color=auto'
背诵下来
[:alnum:] [:alpha:] [:upper:] [:lower:] [:digit:]
显示带有 the的行
[root@bird ~]# grep -n 'the' regular_express.txt
显示不带 the的行
[root@bird ~]# grep -vn 'the' regular_express.txt
显示带有无论大小写 the的行
[root@bird ~]# grep -in 'the' regular_express.txt
搜寻 test 或 taste 这两个单字( t?st)
[root@bird ~]# grep -n 't[ae]st' regular_express.txt
搜寻带有oo 且前边不是g的
[root@bird ~]# grep -n '[^g]oo' regular_express.txt
oo前边不是小写字母的行
[root@bird ~]# grep '[^[:lower:]]oo' regular_express.txt
行首有the的行
[root@bird ~]# grep -n '^the' regular_express.txt
小写字母开头的行
[root@bird ~]# grep -n '^[[:lower:]]' regular_express.txt
不是英文字母开头的行
[root@bird ~]# grep -n '^[^[:alpha:]]' regular_express.txt
不要空白行和开头是#的行
[root@bird ~]# grep -v '^$' anaconda-ks.cfg | grep -v '^#'
字符串 开头结尾都是g 中间至少包含一个o的 行
[root@bird ~]# grep -n 'goo*g' regular_express.txt
字符串 开头结尾都是g 当中的字节可有可无(零个或多个任意字节)
[root@bird ~]# grep -n 'g.*g' regular_express.txt
找出两个到五个 o 的连续字串
[root@bird ~]# grep -n 'o\{2,5\}' regular_express.txt
字符串 开头是g 接着是至少两个o 然后再接一个g
[root@bird ~]# grep -n 'go\{2,5\}g' regular_express.txt
字符串 开头是g 接着是至少两个o
[root@bird ~]# grep -n 'go\{2,\}g' regular_express.txt
. (小数点):代表『一定有一个任意字节』的意思;
* (星星号):代表『重复前一个字节, 0 到无穷多次』的意思,为组合形态
sed工具
-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 就是啦!
将 /etc/passwd 的内容列出并且列印行号,同时,
将第 2~5 行删除!
[root@bird ~]# nl /etc/passwd | sed '2,5d'
将第 3~最后一行删除
[root@bird ~]# nl /etc/passwd | sed '3,$d'
在第二行后 加上 ‘drink tea'
[root@bird ~]# nl /etc/passwd | sed '2a drink tea'
在第二行前 加上 ‘drink tea'
[root@bird ~]# nl /etc/passwd | sed '2i drink tea'
在第二之前 添加多行
[root@bird ~]# nl /etc/passwd | sed '2a drink tea\
> drink beer?'
将2-5行取代成No2-5 number
[root@bird ~]# nl /etc/passwd | sed '2,5c No2-5 number'
只取出5-7行
[root@bird ~]# nl /etc/passwd | sed -n '5,7p'
sed ’s/原内容/新内容/g'
[root@bird ~]# ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
取出只含有MAN的行 并且去掉#注释行和空白行
[root@bird ~]# cat /etc/man.config | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'
直接修改文件内容
[root@bird ~]# sed -i 's/\.$/\!/g' regular_express.txt
延伸正则写法
去除空白行和行首是#的行
[root@bird ~]# egrep -v '^$|^#' regular_express.txt
一个或以上的o
[root@bird ~]# egrep -n 'go+d' regular_express.txt
零个或一个o
[root@bird ~]# egrep -n 'go?d' regular_express.txt
[root@bird ~]# egrep --color=auto 'g(la|oo)d' regular_express.txt
[root@bird ~]# echo 'AxyzxyzxyzxyzD' | egrep 'A(xyz)+D'