日期:2014-05-16 浏览次数:20807 次
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}'
?