shell中的文本处理(grep,sed,awk)

一.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![在这里插入图片描述](https://img-blog.csdnimg.cn/20190606200221340.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDg4OTYxNg==,size_16,color_FFFFFF,t_70)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
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44889616/article/details/91049869