一.grep
grep:全称Global search regular expression and print out the line,全面搜索研究正则表达式并显示出来。grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模式”对目标文本进行匹配检查 , 打印匹配到的行由正则表达式或者字符及基本文本字符所编写的过滤条件。
grep有三种方式:
grep 标准grep命令
egrep 扩展grep,支持基本及扩展的正则表达式
fgrep 允许查找字符串而不是一个模式
grep常见选项:
-c | 只输出匹配行的计数。 |
-i | 不区分大小写(只适用于单字符)。 |
-h | 查询多文件时不显示文件名。 |
-l | 查询多文件时只输出包含匹配字符的文件名。 |
-n | 显示匹配行及行号。 |
-s | 不显示不存在或无匹配文本的错误信息。 |
-v | 显示不包含匹配文本的所有行。 |
正规的 grep 不支持扩展的正则表达式子,竖线是用于表示“或”的扩展正则表达式元字符 , 正规的grep无法识别加上反斜杠,这个字符就被翻译成扩展正则表达式,就像 egrp和grep -E 一样。
grep 的格式
grep + 匹配条件+ 处理文件
grep | root passwd |
grep | ^root passwd |
grep | root$ passwd |
grep -i | root passwd |
grep -E | “root /bash” passwd |
向passwd中加入chroot
grep root passwd ##贪婪模式 chroot也会过滤出来
grep ^root passwd ##以root开头的行
grep bash$ passwd ##以bash结尾的行
grep -E ^root passwd | grep bash$ ##passwd里以root开头,bash结尾的行,grep是单模式的,所以需要用扩展的grep即grep -E
grep -E "^root|bash$" passwd ##passwd里以root开头的或passwd结尾的
cat -b passwd | grep games -2 ##passwd里的有games的行以及这一行的上下两行
cat -b passwd | grep games -A2 ##A=After,后两行
cat -b passwd | grep games -B2 ##B=Before,前两行
测试:
编写脚本,要求:可以查看所有可以登陆的用户。
vim user_show.sh
#!bin/bash
grep -E "sh$" /etc/passwd | cut -d : -f 1
注意:/etc/passwd文件中以sh结尾的都可以登陆。
grep 中的正则表达式
^westos
westos$
‘w…s’
‘w…’
‘…s’
.就相当于占位符
x*y x出现0-任意次
新建一个文件:test
westos
weestos
weees![在这里插入图片描述]()tos
ws
grep ws test
grep w...s test w,s中间三个字符的
grep w....s test w,s中间四个
grep w.....s test
grep -E w?????s test 任意多个?
grep 中字符的匹配次数设定
* | 字符出现 [0- 任意次 ] |
\ ? | 字符出现 [0-1次 ] |
\ + | 字符出现 [1- 任意次 ] |
\ {n\ } | 字符出现 [n次 ] |
\ {m,n\ } | 字符出现 [ 最少出现 m次,最多出现 n次 ] |
\ {0,n\ } | 字符出现 [0-n次 ] |
\ {m,\ } | 字符出现 [ 至少 m次 ] |
\ (xy\ ){n\ }xy | 关键字出现 [n次 ] |
. * | 关键字之间匹配任意字符 |
grep xy test xy挨着的所有行
grep x*y test y前的x出现0-任意次
grep -E x?y test y前的x出现0-1次
grep -E 'x+y' test y和x一起出现1-任意次
grep -E 'x{2}y' test x出现两次,y前的
grep -E 'x{2,3}y' test y前的x出现2次或3次
grep -E 'x{2,}y' test y前的x出现2-无数次
grep -E 'x{,2}y' test y前的x出现0-2次
grep -E '(xy){2,}' test xy出现2-无数次
grep -E 'x.*y' test x和y之间匹配任意字符
grep -E 'x*y' test y前有任意多个x
grep 中字符的匹配位置设定
^ 关键字
关键字 $
< 关键字
关键字 >
< 关键字 >
grep "^root" passwd ##passwd里以root开头的行
grep "nologin$" passwd ##passwd里以nologin结尾的行
grep -E "\<root" passwd ##以root关键字开头的所有root单词,rootch也会被过滤
grep -E "root\>" passwd ##以root结尾的单词
grep -E "\<root\>" passwd ##只过滤root
测试:
编写脚本抓取ip,要求:输入网卡就能得到ip。
二.sed行编辑器
用法:sed用来操作纯 ASCII 码的文本处理时 , 把当前处理的行存储在临时缓冲区中 , 称为“模式空间” (pattern space) 可以指定仅仅处理哪些行sed 符合模式条件的处理 不符合条件的不予处理。处理完成之后把缓冲区的内容送往屏幕,接着处理下一行 , 这样不断重复 , 直到文件末尾。
sed 命令格式
调用 sed 命令有两种形式:
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
具体可用sed --help可以看到常用参数的含义;man sed查看具体的说明手册。
sed对字符的处理
模式 | 含义 |
p | 显示,通常 p 会与参数 sed -n 一起用,即将某个选择的资料印出。 |
d | 删除,因为是删除,所以 d 后面通常不接任何内容 |
a | 添加, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行) |
c | 替换,c的后面可以接字串,这些字串可以取代 n1,n2 之间的行 |
w | 写入 |
i | 插入,i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行) |
s | 取代,可以直接进行替换的工作。通常这个 s 的动作可以搭配正则表达式 |
p模式操作:
cp /etc/fstab /mnt
cat -n fstab 显示文件内容,包括空行
cat -n fstab | sed 5p 非静默模式,第5行显示两次,且全文件内容都显示
cat -n fstab | sed -n 5p 静默模式只显示第五行
cat -n fstab | sed -n 3,5p 3,4,5行
cat -n fstab | sed -n '3p;5p' 3,5行
sed -n '/#/p' fstab 有#的行
sed -n '/#/!p' fstab 没有#的行
sed -n '/^$/!p' fstab 不是空行的行
sed -n '/^$/!p' fstab | sed -n '/^#/!p' 没有空行且没有#
sed -n 4p fstab 第四行
sed -n '4p;6p' fstab 4,6行
sed -n '4,6p' fstab 4-6行
测试:
创建一个文件里面写上若干用户,要求在执行脚本时自动创建文件里所以存在的用户。
方式一:
进阶版(会判定用户是否存在)
d模式操作
sed '/^#/d' fstab 删除有#的行
cat -n fstab | sed '5d' 删除第5行
cat -n fstab | sed '3,5d' 删除3-5行
cat -n fstab | sed '3d;5d' 删除第3,5行
sed '/^UUID/d' fstab 删除以UUID开头的行
a模式操作
sed '/^UUID/ahello westos' fstab 给uuid行后加hello westos
sed '/^UUID/ahello\nwestos' fstab 给uuid行后加hello westos 中间换行
i模式操作
sed '4ihello\nwestos' fstab 给第4行插入hello westos中间换行
sed '4ahello\nwestos' fstab 给第4行的后一行,也就是第5行插入
c模式操作
整行替换是c,单个字符是e
sed '/#/c"""""' fstab 把有#的行都替换为“”“”"
sed '/#/cwestos' fstab 把有#的行都替换为westos
sed '/#/cwestos' -i fstab 把#替换为westos,并插入到文件fstab中,fstab必须存在
-i 插入文件中,文件内容直接改变
cat fstab
测试:
编写脚本,要求:能够将输入的数字直接改为http的端口。首先打开httpd服务
此时selinux=enforcing,改为permission
w模式操作
sed -n '/^UUID/w file' fstab 把fstab中UUID开头的行写入文件file中
cat file
cat -n fstab 查看 加数字 包括空行
cat -b fstab 不包括空行
sed '6r /mnt/file' fstab 把/mnt/file中的内容插入fstab的第6行后,也就是第7行开始
sed '$r /mnt/file' fstab 插入最后一行
cat file >> fstab 效果等于追加,但是追加直接改变了文件的内容
cat fstab
sed '$r/mnt/file' fstab -i test ##把/mnt/file的内容加到fstab最后一行,并把fstab的内容加到文件test中。这的前提是test必须存在
sed '$r/mnt/file' fstab > test ##test可以不存在
cat test
sed的其他用法
1.替换
cp /etc/passwd .
sed 's/sbin/westos/g' passwd 把所有的sbin换成westos
sed '1,5s/sbin/westos/g' passwd 把1--5行的sbin换成westos
sed '/lp/,/halt/s/sbin/westos/g' passwd 关键字,把lp到halt行的sbin换成westos
2.制定规则
cat rule
/^UUID/p
/UUID/=
sed -n -f rule fstab 制定规则
3.其他
sed的其他用法
sed 'G' fstab ##给每一行后面都加一个空行
sed '=' fstab ##给每一行的上面都加一个行号
sed '=' fstab | sed 'N;s/\n/ /g' ##让行号显示在每行的前面,取消换行
其他
sed 's/\///g' passwd 去掉所有的/
sed 's/\//#######/g' passwd 把所有的/换成#######
sed 's@/@#########@g' passwd @=/
sed 's@sbin@westos@g' passwd 把所有的sbin替换为westos
sed 's/sbin/even/g' passwd
sed 's@sbin@westos@g;s/nologin/lee/g' passwd sbin替换为westos,nologin替换为lee
sed -e 's@sbin@westos@g' -e 's/nologin/lee/g' passwd
三.awk
awk报告生成器
awk 处理机制 :awk 会逐行处理文本 , 支持在处理第一行之前做一些
准备工作 , 以及在处理完最后一行做一些总结性质的工作 , 在命令格式
上分别体现如下 :
BEGIN{ }: 读入第一行文本之前执行 , 一般用来初始化操作
{ }: 逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令
快
END{: 处理完最后一行文本之后执行 , 一般用来输出处理结果
awk 基本用法
awk -F : '{print $1}' passwd
awk -F : 'BEGIN{print "hello"}{print $2}' passwd
awk -F : 'BEGIN{print n=1}{print $2,n}' passwd
awk -F : 'BEGIN{n=1}{print $2,n}' passwd
awk -F : 'BEGIN{n=1}{print $2,n++}' passwd
awk -F : 'BEGIN{n=1}{print n++,$1}' passwd
awk -F : 'BEGIN{n=1}{print n++,$1}END'{print "bye"}'' passwd
awk -F : 'BEGIN{n=1}{print n++,$1}END{print "bye"}' passwd
awk -F : 'BEGIN{n=1}{print n++,$1}END{print NR}' passwd
awk -F : 'BEGIN{n=1}{print n++,$1}END{print NF}' passwd
以:为分隔符,打印第一列
以:为分隔符,开头打印hello并打印第二列。
以:为分隔符,打印第二列和n=1
以:为分隔符,打印第二列和n,n从n=1依次累加。
以:为分隔符,n=1,打印n++和第二列并在结尾显示行数。
NF显示列数
awk的其他用法
awk '/bash/{print}' passwd
awk -F : '/bash/{print $1}' passwd
awk -F : 'NR==3{print $1}' passwd ##以:为分隔符打印第三行第一列
awk -F : '/bash/{print}' passwd
awk -F : 'NR>=3&&NR<=7{print $1}' passwd ##以:为分隔符打印三到七行的第一列
awk -F : 'NR==3||NR==7{print $1}' passwd ##以:为分隔符打印第三行或者第七行的第一列
打印以/root/为开头的行;以:为分隔符打印以/root/为开头的行第一列
小实验:统计/etc/passwd文件中交互式登陆的用户的个数,即最后一列是以nologin结尾的。
awk 'BEGIN{a=34;print a+12}'
awk '/^[a-d]/{print}' /mnt/passwd ##打印以a到d开头的所有列
awk '/^[^a-d]/{print}' /mnt/passwd ##打印除a到d开头的所有列
awk '/^r|bash$/{print}' /mnt/passwd ##打印以r开头或者以bash结尾的所有列
awk '/^r/&&/bash$/{print}' /mnt/passwd ##打印以r开头且以bash结尾的所有列
awk '/^r/||/bash$/{print}' /mnt/passwd ##打印以r开头或者以bash结尾的所有列
awk -F : '$6~/bin$/{print}' /mnt/passwd ##第6列以bin结尾的行,贪婪模式,sbin也会过滤
awk -F : '$6~/\<bin$/{print}' /mnt/passwd ##第6列以bin结尾的行,防贪婪模式,sbin不会过滤
awk -F : '$6!~/bin$/{print}' /mnt/passwd ##第6列以bin结尾的行,贪婪模式,sbin也会过滤
awk -F : '$6!~/\<bin$/{print}' /mnt/passwd ##第6列以bin结尾的行,防贪婪模式,sbin不会过滤
小实验:
统计出/etc/passwd里家目录不在home下的,可登陆的系统的用户
编写脚本,要求:抓取网卡ip