shell中的文本处理和正则表达式

grep

Global search regular expression and print out the
line
全面搜索研究正则表达式并显示出来
grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模
式”对目标文本进行匹配检查 , 打印匹配到的行
由正则表达式或者字符及基本文本字符所编写的过滤条件

grep 正则表达式与扩展正则表达式

正规的 grep 不支持扩展的正则表达式子 , 竖线是用于表示”
或”的扩展正则表达式元字符 , 正规的 grep 无法识别
加上反斜杠 , 这个字符就被翻译成扩展正则表达式 , 就像 egrp

grep -E 一样

cp /etc/passwd /mnt  ##将/etc/passwd拷贝到/mnt做实验
grep root passwd    ##找出含有root的行
grep ^root passwd   ###找出以root开头的行

这里写图片描述

grep root$ passwd   ###找出以root结尾的行
grep -i ^root passwd  ###找出以root开头的行(忽略大小写)

这里写图片描述

grep -E "root|ROOT" passwd   ###找出含有root的行(包含大小写)
egrep "root|ROOT" passwd       ###用egrep就不用加E了

这里写图片描述

grep -Ev "root|ROOT" passwd    ###屏蔽root和ROOT

这里写图片描述

grep -v -i -E "^root|root$" passwd | grep root   ###找出root在中间的行

这里写图片描述

grep -E "root|ROOT" passwd |grep -i -E -v "^root|root$" ###找出root在中间的行

这里写图片描述

grep 'r..t' test   ###找出rt间有两个字符的
grep 'r...t' test    ####找出rt间有三个字符的
grep 'r....t' test    ####找出rt间有4个字符的
grep 'rt' test      ###找出rt

这里写图片描述

grep 'r*t' test     ###找出r从0到任意字符的行

这里写图片描述

grep -E 'ro*t' test    ###找出o从0到任意字符的行

这里写图片描述

grep -E 'ro?t' test  ####找出o出现0-1 次

这里写图片描述

grep -E 'ro{1,}t' test  ###找出o出现1到任意字符的行

这里写图片描述

grep -E 'ro{1,3}t' test  ###找出o出现1到3次的行 

这里写图片描述

grep -E 'ro{,3}t' test    ###找出o出现最多出现3次

这里写图片描述

grep -E 'ro{3,}t' test    ###找出o出现至少出现3次

这里写图片描述

grep -E 'ro+t' test      ###找出o出现1到任意 次
grep -E 'ro{1,}t' test 

这里写图片描述

grep -E 'root' test    ###找出有root的  
grep -E '(root){2,}' test  ####找出root至少出现两次的

这里写图片描述

grep -E 'r.*t' test   ###匹配rt之间任意字符

这里写图片描述

grep -E 'r....' test   ###找出r后有4个字符的

这里写图片描述

grep -E 'r...' test    ###找出r后有3个字符的
grep -E 'r...\>' test   ###找出r后只有3个字符的

这里写图片描述

grep -E '...t' test     ###找出t前面有3个字符的
grep -E '\<...t' test    ###找出t前面只有3个字符的

这里写图片描述

ifconfig  eth0 | grep -E "inet\>"  ###过滤出本机的ip的行

这里写图片描述

sed

行编辑器
stream editor
用来操作纯 ASCII 码的文本
处理时 , 把当 前处理的行存储在临时缓冲区中 , 称为“模式空
间” (pattern space) 可以指定仅仅处理哪些行
sed 符合模式条件的处理 不符合条件的不予处理
处理完成之后把缓冲区的内容送往屏幕
接着处理下一行 , 这样不断重复 , 直到文件末尾

sed 对字符的处理(5种模式)

p 显示
d 删除
a 添加
c 替换
w 写入
i 插入

(1)p显示模式

sed -n '/^#/p' fstab 

这里写图片描述

sed -n '/^UUID/p' fstab   ###显示以UUID开头的行  
cat -n fstab | sed -n '2,6p'   ###显示第2行到第6行

这里写图片描述

cat -n fstab | sed -n '2,6!p'  ###不显示第2行到6行
cat -n fstab | sed -n -e '2p;6p'   ###有多个策略时用-e

这里写图片描述

sed -n '/0$/p' fstab   ###显示以0结尾

这里写图片描述

sed -n '/0$/!p' fstab   ###显示不以0结尾的

这里写图片描述

(2)d删除模式

cat -n fstab | sed -e '2d;6d'  ###删除2行和6行

这里写图片描述

cat -n fstab | sed -e '2,6d'  ###删除第2行到第6行

这里写图片描述

sed -e '/^#/d' fstab    ###删除以#开头的行

这里写图片描述

sed -e '/^$/d' fstab     ###删除最开头的第一行

这里写图片描述

sed -e '/^$/d;/^#/d' fstab  ###删除最开头的第一行和以#开头的行

这里写图片描述

sed -e '/UUID/d' fstab   ###删除含有UUID行

这里写图片描述

sed -e '/UUID/!d' fstab  ###不删除有UUID行

这里写图片描述

(3)a添加模式

vim westos
sed '/hello/aworld' westos  ###添加world到hello后

这里写图片描述

sed '/hello/aworld\nwestos' westos ###添加world和westos到hello后并换行 

这里写图片描述

(4)插入模式

sed '/hello/iworld\nwestos' westos  ###插入world和westos到hello前并换行
cat westos

这里写图片描述

(5)更改模式

sed '/hello/chello world' westos    ###将内容进行替换
sed '/hello/cwestos\nworld' westos   ###将内容进行替换并换行

这里写图片描述

(6)写入模式

cp /etc/passwd .
sed -n '/bash$/p' passwd 
sed -n '/bash$/p' passwd > file  ###显示passwd中/bash最后一行,并保存到file中
cat file 

这里写图片描述

rm -fr file 
sed -n '/bash$/wfile' passwd 
cat file 

这里写图片描述

rm -fr file 
sed '/hello/wfile' westos 
cat file  

这里写图片描述

  219  sed '/hello/=' westos         ###给hello加上行号
  220  sed -e '/hello/=;wfile' westos   ###显示hello的行号并写进file中 

这里写图片描述

sed '/hello/=' -i westos   ###将结果导入原文件-i,input
cat westos 

这里写图片描述

sed '/hello/=' westos   ###给westos内容加上行号
echo `sed '=' westos`    ###将行号和内容显示在一行

这里写图片描述

sed '6r westos' fstab      ###将westos内容加到第6行后面

这里写图片描述

sed -n -e '/^UUID/p' -ne '/^UUID/=' fstab  ###将开头是UUID的行加上行号后显示
sed -n -e '/^UUID/p;/^UUID/=' fstab   ###将开头是UUID的行加上行号后显示

这里写图片描述

sed '=' fstab   ###加上行号

这里写图片描述

sed '=' fstab | sed 'N;s/\n/ /g' ###将fstab加行号后,再将换行符全替代成空格
 ##N,表示换行符

这里写图片描述

sed -n '$p' fstab  ###显示最后一行

这里写图片描述

sed 'G' fstab  ###给每行后面加一空行                  
    ####G,表示每行后加入空行                                                

这里写图片描述

sed '$!G' fstab  ###去掉最后一行后加的空行 

这里写图片描述

全文替换

vim passwd 
cat passwd 
sed 's/nologin/westos/g' passwd    ###全文替换

这里写图片描述

sed '3,5s/nologin/westos/g' passwd  ###替换3到5行

这里写图片描述

sed '/adm/,/sync/s/nologin/westos/g' passwd    ####匹配关键字所在行替换

这里写图片描述

sed -e '/adm/,/sync/s/nologin/westos/g;s/sbin/xbw/g' passwd   ###多种策略的替换

这里写图片描述

vim file   ###编辑文件里面写入替换策略
sed -f file passwd    ###-f可以执行替换,不会改变原文件内容 

这里写图片描述

cat passwd   ###查看passwd文件

这里写图片描述

sed -f file -i passwd   ####加上-i原文件内容会改变
cat passwd

这里写图片描述

awk 报告生成器

awk 处理机制 :awk 会逐行处理文本 , 支持在处理第一行之前做一些
准备工作 , 以及在处理完最后一行做一些总结性质的工作 , 在命令格式
上分别体现如下 :
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令

END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果

awk -F ":" '{print $1}' passwd  ###截出passwd中的第一列

这里写图片描述

awk -F ":"  'BEGIN{print "NAME"}{print $1}'  passwd  ###先执行BEGIN中的东西在显示后面的

这里写图片描述

awk  -F ":" 'BEGIN{print "NAME"}{print NR$1}END{print "END"}' passwd
###找出第一列的并加上行数

这里写图片描述

awk  '/bash$/{print}' passwd   ###找出以/bash结尾的行

这里写图片描述

awk -F ":" '/bash$/{print $1}' passwd  ###找出以可以登录的用户

这里写图片描述

awk -F ":"  'BEGIN{N=0}/bash$/{N++}END{print N}' passwd
####统计出以/bash结尾的有几行

这里写图片描述

awk  '/^[a-d]/{print}'  passwd   ###找出以a-d开头的行

这里写图片描述

awk  '/^ro/{print}' passwd  ###找出以ro开头的行

这里写图片描述

awk  '/^r/&&/bash$/{print}' passwd   ###找出以r开头且以/bash结尾的行

这里写图片描述

awk '/^r/||/bash$/{print}'  passwd  ###找出以r开头或者以/bash结尾的行

这里写图片描述

awk  -F ":"  '$5~/^a/{print}'  passwd   ####找出第5列以a开头的行

这里写图片描述

awk -F ":" '$1~/^r/{print}'  passwd   ###找出第一列以r开头的行

这里写图片描述

awk -F ":"  '$1!~/^r/{print}'  passwd  ###找出第一列不是以r开头的行

这里写图片描述

awk -F ":" '$7!~/bash$/{print}'  passwd   ###找出不是以/bash结尾的用户

这里写图片描述

awk -F ":" '{print NR,$0}'  passwd  ###显示每行行号

这里写图片描述

useradd -d /mnt/home hello1  ###指定家目录建立用户
useradd -d /mnt/ hello

这里写图片描述

awk  -F ":"  '$6!~/^\/home/&&/bash$/{print $1}'  /etc/passwd
####找出第6列不是以/home开头且以/bash结尾的用户

这里写图片描述

awk -F ":" '$6!~/^\/home/&&/bash$/{print NR}' /etc/passwd   
###统计出第6列不是以/home开头且以/bash结尾的是哪几行

这里写图片描述

awk -F ":" 'BEGIN{n=0}$6!~/^\/home/&&/bash$/{n++}END{print n}' /etc/passwd
####统计出第6列不是以/home开头且/bash结尾的有几行

这里写图片描述

ifconfig  eth0 | awk '/inet\>/{print $2}'   ##截取出本机的ip
awk 'BEGIN{n=0}{n++}END{print n}'  /etc/passwd  ###显示/etc/passwd中有多少行

这里写图片描述

猜你喜欢

转载自blog.csdn.net/xbw_linux123/article/details/80738318