日期:2014-05-16  浏览次数:20807 次

鸟哥的Linux私房菜-基础学习篇6

36.正则表达式

?#grep [inv] '搜索字符串' filename

例1:搜索特定字符串,显示出行号,反向选择,不考虑大小写

#grep -n 'the' regular_express.txt

#grep -vn 'the' regular_express.txt

#grep -in 'the' regular_express.txt

例2:利用[]来搜索集合字符,集合字符的反向选择[^]

#grep -n 't[ae]st' regular_express.txt

#grep -n '[^g]oo' regular_express.txt

例3:行首与行尾字符^$

#grep -n '^the' regular_express.txt

#grep -n '^[^a-zA-Z]' regular_express.txt

#grep -n '\.$' regular_express.txt? 行尾结束为小数点(.)的一行

去除空行和注释

#grep -v '^$' /etc/syslog.conf | grep -v '^#'

例4:任意一个字符(.)与重复字符(*)

#grep -n 'g..d' regular.txt

#grep -n 'oo*' regular.txt

例5:限定连续重复字符范围{}

#grep -n 'o\{2\}' regular.txt

#grep -n 'go\{2,5\}g' regular.txt

?

37.sed可以分析标准输入(stdin)的数据,然后将数据经过处理后,再将它输出到标准输出(stdout)。它有替换、删除、新增、选取特定行等处理功能。

#sed [-nefr] [动作]?

例1:显示/etc/passwd的内容,需要打印行号,同时将2~5行删除

#nl /etc/passwd | sed '2,5d'

例2:在第二行后加上“drink tea”字样

#nl /etc/passwd | sed '2a drink tea'

例3:在第二行后加入两行字

#nl /etc/passwd | sed '2a Drink tea or ...\

> drink beer ?'

例4:将第2~5行的内容替换为“No 2-5 number”

#nl /etc/passwd | sed '2,5c No 2-5 number'

例5:仅显示第5~7行

#nl /etc/passwd | sed -n '5,7p'

例6:将(^.*)addr:替换为空,将Bcast(.*$)替换为空

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

例7:将#(.*)替换为空,删除空行

#cat /etc/man.config | grep 'MAN' | sed 's/#.*//g' | sed '/^$/d'

?

38.awk倾向于一行中分成数个“字段”来处理

#awk '条件类型1{动作1} 条件类型2{动作2} ...' filename

例1:取出账号与登陆者IP地址,且账号与IP地址之间以[tab]隔开

#last | awk '{print $1 "\t" $3}'

$0代表“一整行”数据的意思,每一行的每个字段都有变量名字,就是$1,$2等变量名字

整个awk的处理流程是:

a)读入第一行,并将第一行的数据填入$0,$1,$2等变量中

b)根据“条件类型”的限制,判断是否需要进行后面的“操作”

c)完成所有的操作与条件类型

d)若还有后续的行数据,重复a~c,直到所有数据都读完为止

awk的内置变量

NF?? 每一行($0)拥有的字段总数

NR?? 当前awk所处理的是“第几行”数据

FS?? 当前的分隔符,默认为空格键

例2:列出当前处理的行数,该行有多少个字段

#last | awk '{print $1 "\t lines: " NR "\t columns: " NF}'

例3:在/etc/passwd中以:来分隔字段的,要查看第三栏小于10以下的数据,并且列出账号与第三栏

#cat /etc/passwd | awk '{FS=":"} $3<10 {print $1 "\t" $3}'

?