文本处理工具
grep
grep [Globally search a Regular Expression and Print]
grep是搜索关于正则表达式的表达式,并且将其打印出来
正则表达式分为通配符类和扩展类
grep 通配符类
grep -E=egrep 扩展类
grep匹配的格式是贪婪模式,只要中间包含你所搜索的,都会过滤出来
-
grep格式
grep 匹配条件 处理文件 grep root passwd ##过滤root关键字 grep ^root passwd ##过滤以root 开头 grep root$ passw d ##过滤以root 结尾 grep -i root passwd ##过滤root,忽略大小写 grep -E "\<root" passwd ##root字符之前不能有字符 grep -E "root\>" passwd ##root字符之后不能有字符 grep -E "\<root\>" passwd ##root前面和后面都不能有字符 grep -数字 ##显示过滤行以及上面几行和下面几行 grep -n ##显示匹配的行所在行号 grep -A ##显示过滤行以及下面几行 grep -B ##显示过滤行以及上面几行 grep -v ##反向过滤 grep 字符数量匹配规则 w...s ##w开头s结尾,中间有三个任意字符 ....s ##s结尾前面有4个任意字符 * ##字符出现任意 ? ##字符出现0到1次 + ##字符出现1次到任意次 {n} ##字符出现n次 {m,n} ##字符出现m到n次 {0,n} ##字符出现0-n次 {,n} ##字符出现0-n次 {m,} ##字符出现最少m次 (lee){2} ##lee字符串出现2次
-
实验
cat /etc/passwd -b | head -n 14 /mnt/westos ##导入文件做实验素材 head -n 14 /etc/passwd > /mnt/passwd grep root passwd grep -E "\<root" passwd ##root前面不能有字符 grep -E "\<root\>" passwd ##root前面后面都不能有字符 grep -iE "\<root\>" passwd ##root前面后面都不能有字符,且不论大小写都过滤 grep -inE "\<root\>" passwd ##root前面后面都不能有字符,且不论大小写都过滤,且显示行号 grep lp westos ##过滤lp字符 grep -3 lp westos ##过滤lp这一行和上三行下三行 grep -A3 lp westos ##显示lp这一行和下面三行 grep -B3 lp westos ##显示lp这一行和上面三行 vim westos grep ws westos grep w..s westos ##开头为w,结尾为s,中间有两个任意字符 grep "w.*s" westos ##开头为w,结尾为s,中间任意字符 grep -E "w.{3}s" westos ##开头为w,结尾为s,中间有三个字符 grep -E "w.?s" westos ##开头为w,结尾为s,中间有0或1个字符 grep -E "w.+s" westos ##开头为w,结尾为s,中间有一个及以上字符 grep -E "w.{2,}s" westos ##开头为w,结尾为s,中间有两个以上字符 grep -E "w.{2}s" westos ##开头为w,结尾为s,中间有两个字符 grep -E "w.{,2}s" westos ##开头为w,结尾为s,中间最多有两个字符 grep -E "wa{1,3}s" westos ##开头为w,结尾为s,中间a有1到3个字符 grep -E "wa{,2}s" westos ##开头为w,结尾为s,a的字符有最多两个 grep -E "wa{2,}s" westos ##开头为w,结尾为s,a的字符有最少两个 grep -E "w.{1}s|w.{3}s" westos ##开头为w,结尾为s,中间字符为一个或者三个 grep -E “w(ae){,3}s”westos ##开头为w,结尾为s,ae这个组合的个数最多三个
-
sed
显示文件中符合条件的行或者对文件内容进行替换
-
命令格式:
sed 参数 命令 处理对象 sed 参数 处理对象 -f 处理规则文件 cp /etc/fstab /mnt ##做实验素材
-
p显示
cat -b fstab | sed 5p ##第五行多显示一次 cat -b fstab | sed -n 5p ##只显示第五行 cat -b fstab | sed -n 5,7p ##显示5-7行 cat -b fstab | sed -ne '5p;7p' ##显示5和7行 cat -b fstab | sed -ne '5,$p' ##显示第五行之后所有 sed -ne '/^#/p' fstab ##显示以#开头的 sed -ne '/^#/!p' fstab ##显示不是以#开头的
-
d删除
sed 5d fstab ##删除第五行 sed '/^#/d' fstab ##把#开头的行删除 sed '/^UUID/!d' fstab ##把除了UUIS以外的行都删除 sed -e '5,$d' fstab
-
a添加,添加在某一行的下面
cat -b fstab > westos ##westos中的文件有行号 sed '5a hello' westos ##在第五行的下面添加hello sed '$a hello' westos ##在最后一行的下面添加hello sed '/#/a hello' westos ##给每个#号那一行的下面添加
-
i插入。插入在某一行的上面
sed '5i hello' westos ##给第五行上面插入 sed '/#/i hello' westos ##给所有带有#号的那一行的上面插入
-
c 更改
sed '/^#/c hello' fstab ##更改有#号的所有行 sed '5c hello' fstab ##更改第五行
-
w 把符合的行写到指定文件中
sed -n ‘/UUID/w file’ fstab ##将UUID开头的行写入文件file
-
r 整合
sed '2rwestos' westos.new ##wstos中的文件整合到westos.new文件的第二行的后面 sed '$rwestos' westos.new ##wstos中的文件整合到westos.new文件的最后一行的后面
-
sed字符替换
cp /etc/passwd . ##生成实验资源 sed 's/sbin/###/g' passwd ##显示passwd文件,将全文的sbin改为### sed '1,5s/sbin/###/g' passwd ##显示passwd文件,将1-5行的sbin改为### sed '/lp/,/halt/s/sbin/###/g' passwd ##显示passwd文件,将lp和halt字符之间的sbin改为### sed 's/\//###/g' passwd ##显示passwd文件,将全文的/改为### sed 's@/@###@g' passwd vim rule ##编辑规则,写''中间的 sed -f rule passwd ##显示passwd文件,且按照这个规则的要求 sed -f rule -i passwd ##按照rule规则把passwd文件修改
awk 报告生成器
格式:
awk -F 分隔符 BEGIN{}{}}END{} FILENAME
NR ##行数
NF ##列数
FILENAME ##文件名称本身
westos ##westos变量值
“westos” ##westos字符串
/bash$/ ##条件
/条件1/条件2/ ##条件1或者条件2
/条件1/||/条件2/ ##条件1或者条件2
/条件1/&&/条件2/ ##条件1并且条件2
$0 ##所有的列
$1 ##第一列
$2 ##第二列
awk -F : '$6!~/home/&&/bash$/{print}' /etc/passwd ##文件的第六列没有home关键字并且以bash结尾的行
awk -F : '{print $1}' passwd ##打印文件第一列
awk -F : '{print $1 " " $2}' passwd ##打印文件第一第二列
awk -F : '{print $0}' passwd ##打印全文
awk -F : 'BEGIN{print "QIAN"}{print $1}END{print "HOU"}'
##打印第一列,在第一列的前面加上QIAN在第一列的后面加上HOU
awk -F : '{print FILENAME}' /mnt/passwd ##打印文件的名称
awk -F : '{print NF}' /mnt/passwd ##打印文件的列数
awk -F : 'BEGIN{linux=4}{print linux}' /mnt/passwd ##打印变量值
awk -F : 'BEGIN{linux=4}{print "linux"}' /mnt/passwd ##打印字符串
awk -F : '/gin$/&&/^d/{print $1}' /mnt/passwd ##文件中gin结尾并且d开头的那一行的第一列
awk -F : '/gin$/||/^ha/{print $1}' /mnt/passwd ##文件中gin结尾或者ha开头的哪一行文件的第一行打印出来
awk -F : '$7~/\/bash$/||/\/halt/{print $1}' passwd ##文件第七列/bash结尾或者/halt结尾的行的第一串字符
练习题:
统计在系统中能su切换的并且用户家目录不在/home下的用户数量。
awk -F : 'BEGIN{N=0}/bash$|sh$/&&$6!~/^\/home/{N++}END{print N}' /etc/passwd
显示出主机的地址是什么?
ifconfig ens160 | awk '/inet\>/{print $2}'
统计/mnt/passwd中有多少行?
awk 'END{print NR}' /mnt/passwd
将/mnt/passwd中最后一行的shell找出来
awk -F : 'END{print $NF}' /mnt/passwd