shell文本处理三剑客(awk sed grep)
一.grep:文本过滤器
根据正则表达式来工作,由正则表达式或者字符及基本的文本字符所编写的过滤条件
tr 'a-z' 'A-Z' < file ###把passwd中的小写转换为大写
^x ###以x开头的
x$ ###以x结尾的
-v ###反选
grep nologin$ -v passwd ###显示能登陆的用户
-E ^root|root$ ###root在开头的或者在结尾的,|或运算时扩展的要加上-E,用法和grep一样
grep -n3 root ###搜索root前后各3行
grep -A3 root ###搜索root所在行的后三行
grep -B3 root ###搜索root所在行的前三行
grep -i root ###忽略大小写
grep x..y ###x和y之间有两个字符的
* ###字符出现任意次
? ###字符出现0到1次
+ ###字符出现1到任意次
{n} ###字符出现n次
{m,n} ###字符最少出现m次最多出现n次
{0,n} ###字符出现0到n次
{m,} ###字符至少出现m次
(xy){n} ###xy出现n次
grep \<关键字\> ##搜索关键字
二.sed:文本编辑器
用来操作纯ASCII码的文本,把当前处理的行存储在临时缓冲区,可以仅仅处理指定的行,符合条件的处理,不符合的不处理,完成后把缓冲区的内容输出到屏幕,紧接着处理下一行,直到文件结束
p ##显示
d ##删除
a ##添加
c ##替换
w ##写入
i ##插入
-n ##安静模式,只有经过sed处理的那行才会显示出来
(1)p ##显示
sed -n '2,6!p' passwd ##2行和6行不显示
(2)d ##删除
sed '2,6!d' passwd ##2到6行的不删除
(3)c ##替换
-i ###修改完成之后就保留在原文件里
替换httpd默认端口的脚本
(4)a ##添加
(5)w ##写入
sed '1r test' passwd ##把test的内容添加到passwd文件的第二行
sed -n '/root/=' passwd ##把root所在行行号打印出来
(6)sed的其他用法
sed -f rule test ###把策略写在rule文件中直接修改文加test
sed '=' passwd | sed 'N;s/\n//g' ###给每一行标号,并且删除换行符
sed -n '$p' test ###输出最后一行
sed -n '1p' test ###输出第一行
sed -e '=;!G' test v ##-e同时执行两个策略,加行号,并且把每行分开
三.awk
awk:文本报告生成器,逐行处理文本,支持在处理第一行之前,做一些准备工作,以及在处理完后做一些总结性质的工作
BEGIN{ }:读入第一行文本之前执行,一般用来初始化操作
{ }:逐行读入进行处理
END{ }:处理完最后一行后执行,一般由来输出处理结果
awk -F : '$7~/bash$/{print $0}' /etc/passwd ###第7列是以bash$结尾的输出这行($0 ##表示输出此行)
awk -F : '$7~/bash$/{print $1}' /etc/passwd ###第7列是以bash$结尾的输出第一列,并且统计能登陆用户的个数
awk -F : 'BEGIN{i=0}/bash$/{i++;print $1}END{print i}' passwd ###查找用户是否能登录,并输出登录用户的用户名和个数
awk 'NR>=3&&NR<=5{print}' /etc/passwd ##输出在第3行到第5行之间的行
awk -F : 'BEGIN{i=0}$7~/bash$/{i++;print}END{print i}' passwd ###查找用户是否能登录,并输出登录用户的信息和个数
awk 'BEGIN{a=4;print a+2}' ##awk也可以做运算
awk -F : 'NR==1{print}' /etc/passwd ###恒定输出第一行
抓取IP:
awk -F : '{print $1," is readlly"}' /etc/passwd ##添加输出的字符串
补充:
fmt -s -w 10 <<EOF ##一行只能输出10个字符,否则自动换行
tail -n 10 -f /var/log/messages ##动态查看日志
awk grep sed其三者的应用丰富多样,文本处理是比较灵活的,只要符合规则,可以任意组合;面对不同的问题,写出多样的,符合实际情况的策略