grep 文本过滤
-v(--invert-match) 取反
-i(--ignore-case) 忽略大小写
-c(--count)统计匹配行数
-m(--max-count=NUM )设置最大过滤次数
-q(--quiet)静默输出,一般用于监测,看$?返回值,0匹配,否则不匹配
--color 标红匹配字符串
-E(--extended-regexp) 支持扩展正则
# grep '^r' /etc/passwd #过滤出/etc/passwd文件中以r开头的内容
#grep -E '^(root|daemon)' /etc/passwd #过滤出/etc/passwd文件中以root和deamon开头的内容
#egrep '^(root|daemon)' /etc/passwd #过滤出/etc/passwd文件中以root和deamon开头的内容
(“I”符号为扩展正则中的“与”;因为grep -E与egrep命令效果一致,所以实际使用中,涉及到扩展正则时,通常使用egrep命令,而非grep命令)
# grep '^192.168.4.4' /etc/hosts && echo "YES" || echo "NO"
#过滤出/etc/hosts文件中以192.168.4.4开头的内容,若果有则输出YES否则输出NO
192.168.4.4 svr5.tarena.com svr5
YES
# grep -q '^192.168.4.4' /etc/hosts && echo "YES" || echo "NO"
#判断/etc/hosts文件中是否有以192.168.4.4开头的内容,若果有则输出YES否则输出NO
YES
# egrep -v '^#' /etc/inittab #输出/etc/inittab文件里的非注释内容(#开头的内容为注释行)
# egrep -m10 '/sbin/nologin$' /etc/passwd #统计本地用户中登录Shell为“/sbin/nologin”的用户个数(-m10表示最多过滤前十个有效用户)
# egrep -c '/bin/bash$' /etc/passwd #统计使用“/bin/bash”作为登录Shell的正常用户个数
24
# egrep '/bin/bash$' /etc/passwd | wc -l #统计使用“/bin/bash”作为登录Shell的正常用户个数
24
sed文本处理工具
选项
-n(屏蔽默认输出,默认sed会输出读取文档的全部内容)
-r(让sed支持扩展正则)
-i(sed直接修改源文件,默认sed只是通过内存临时修改文件,源文件无影响)
指令
p 输出(print)
d 删除(delete)
s 替换(separate)
a 追加(add)
i 插入(insert)
c 替换行
正常情况下,sed命令所做的处理只是把操作结果(包括打印、删除等)输出到当前终端屏幕,而并不会对原始文件做任何更改,若希望直接修改文件内容,应添加选项 -i 。
# sed 'd' /etc/passwd #显示删除所有行的结果
# sed -i '1,4d' /etc/passwd #直接删除/etc/passwd的第1~4行
# sed '$d' /etc/passwd #删除最后一行
# sed '/^$/d' /etc/passwd #删除所有空行
# sed -n '3p' /etc/passwd #显示第三行
# sed -n '1~2p' /etc/passwd #显示奇数行
# sed -n ‘2~2p' /etc/passwd #显示偶数行
# sed -n '/root/p' /etc/passwd #显示包含root的行
# sed -n '/bash$/p' /etc/passwd #显示bash结尾的行
# sed -n 'p' /etc/passwd #显示所有行
#sed -n '$=' /etc/passwd #输出文件行数
# sed 's/xml//g' /etc/passwd #删除文件中所有xml(替换为空)
# sed '4,7s/^/#/' /etc/passswd #将4~7行所有内容注释掉
# sed 's/^#an/an/' /etc/passwd #将文件中所有以#an开头的注释行取消注释
# sed '2a XX' a.txt #在第二行后面,追加XX
# sed '2i XX' a.txt #在第二行前面,插入XX
# sed '2c XX' a.txt #将第二行替换为XX
# sed -i '$a 192.168.4.5 svr5.tarena.com svr5' /etc/hosts #追加域名
awk文本处理
格式:awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
[-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
' ' 引用代码块
BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
特殊要点:
$0 表示整个当前行
$1 每行第一个字段
NF 字段数量变量
NR 每行的记录号,多文件记录递增
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
FS BEGIN时定义分隔符
# awk '{print $1,$3}' test.txt #打印文档第1列和第3列
#awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd #输出字段1,3,6,以制表符作为隔符
#awk -F: '{print NF}' helloworld.sh #输出文件每行有多少字段
#awk -F'[:#]' '{print $1,$2,$3,$4,$5,$6,$7}' OFS='\t' helloworld.sh #制表符分隔输出多字段
# awk -F: '/root/' /etc/passwd #输出包含root的行
# awk -F: '/bash$/{print}' /etc/passwd #输出以bash结尾的行
# awk -F: 'NR==3{print}' /etc/passwd #输出第3行(行号NR等于3)的用户记录
# awk -F: '$3>10 && $3<20' /etc/passwd #输出账户UID大于10并且小于20的账户信息
# seq 200 | awk '$1%3==0' #找200以内3的倍数
# df -h | awk '{print $4}' #打印磁盘的剩余空间
# ifconfig eth0 | awk '/RX p/{print $5}' #过滤接收数据的流量
# awk '/Failed/{print $11}' /var/log/secure #根据/var/log/secure日志文件,过滤远程连接密码失败的IP地址
#s -l /home|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",sum/1024,"KB"}' #计算/home目录下,普通文件的大小,使用KB作为单位
# awk -F: 'BEGIN{print "User\tUID\tHome"} {print $1 "\t" $3 "\t" $6} END{print "Total",NR,"lines."}' /etc/passwd #格式化输出passwd文件内容时,要求第一行为列表标题,中间打印用户的名称、UID、家目录信息,最后一行提示一共已处理文本的总行数
# awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}' #数组运算
0 0
1 11
2 22