一、grep 文本过滤命令

文本过滤命令:grep是一种文本搜索工具,根据用户指定的“模式”对目标文本进行匹配检查,打印匹配到的行。
  grep:由正则表达式或者字符及基本文本字符所编写的过滤条件。

1、grep 中的正则表达式

-E 扩展正则表达式  |或者  -I忽略大小写  -v反向过滤,把符合信息的内容屏蔽
grep  root  passwd            ##过滤出所有含有root的行
grep  ^root passwd            ##过滤出root字符在第一个的行
grep  root$ passwd            ##过滤出root字符在最后一个的行
grep -i root passwd           ##忽略大小写过滤
grep -E "root|ROOT" passwd    ##过滤出所有有root和ROOT字符的行
grep -i -E -v "^root|root$" passwd   ##过滤出除了首位和尾位为root、ROOT的行
egrep "^root|root$" passwd = grep -E "^root|root$" passwd  ##过滤出首位和尾位为root的行

Charles正则过滤接口 正则表达式过滤_bash


Charles正则过滤接口 正则表达式过滤_Charles正则过滤接口_02

脚本应用一
在系统中找出能登陆系统的用户有哪些

vim show_loginuser.sh

Charles正则过滤接口 正则表达式过滤_Charles正则过滤接口_03


Charles正则过滤接口 正则表达式过滤_sed_04

2、grep 中字符的匹配次数设定

grep 'r...t' test           r和t之间字符出现[3次]
grep 'r..t' test            r和t之间字符出现[2次]
grep -E 'ro*t' test         字符出现 [0- 任意次] 
grep -E 'ro?t' test         字符出现 [0-1 次]
grep -E 'ro{1,}t' test      ro和t之间字符出现[1- 任意次]
grep -E 'ro{1,3}t' test     ro和t之间字符出现[1- 3次]
grep -E '(root){2,}' test   root字符重复出现2次
grep -E 'r*t' test          字符出现 [0- 任意次]
grep -E 'r.*t' test         关键字之间匹配任意字符
grep -E 'r....' test        关键字后字符出现[4次及更多]
grep -E "r....\>" test      关键字后字符出现[4次]
grep -E "....t" test        关键字前字符出现[4次及更多]

部分命令演示如下:

Charles正则过滤接口 正则表达式过滤_bash_05


Charles正则过滤接口 正则表达式过滤_bash_06


Charles正则过滤接口 正则表达式过滤_vim_07

二、sed 行编辑器

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

1、p模式:显示模式

sed -n '/^#/p' fstab         显示有#的行   
sed -n '/^#/!p' fstab        显示没有#的行
sed -n '/0$/p' fstab         显示以0为结尾的行
cat -n fstab |sed -n '2,6p'  显示2到6行
cat -n fstab |sed -ne '2!p;6!p' |uniq -d  显示除了第2行和第6行以外的行

Charles正则过滤接口 正则表达式过滤_vim_08


Charles正则过滤接口 正则表达式过滤_sed_09

脚本应用二
建立用户

vim userfile
vim passfile
vim create_user.sh

Charles正则过滤接口 正则表达式过滤_sed_10


Charles正则过滤接口 正则表达式过滤_vim_11

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;/^#/d' fstab     删除空行和#开头的行
sed -e '/UUID/d' fstab         删除UUID开头的行     
sed -e '/UUID/!d' fstab        删除除了UUID以外的行

Charles正则过滤接口 正则表达式过滤_Charles正则过滤接口_12


Charles正则过滤接口 正则表达式过滤_Charles正则过滤接口_13


Charles正则过滤接口 正则表达式过滤_Charles正则过滤接口_14

3、a模式、i模式:添加模式

a添加在关键字下面
i插入在关键字上面
a模式
vim linux           
sed '/hello/aworld' linux              添加行         
sed 's/hello/hello world/g' linux      修改行
sed '/hello/aworld\nwestos' linux      添加行

Charles正则过滤接口 正则表达式过滤_sed_15

i模式
sed '/hello/iworld\nwestos' linux      添加行

Charles正则过滤接口 正则表达式过滤_vim_16

4、C模式:替换模式

sed '/hello/chello world' linux     改变hello为hello world
sed '/hello/chello\nworld' linux    \n换行

Charles正则过滤接口 正则表达式过滤_vim_17

5、W模式:写入模式

sed '/hello/=;wfile' westos      显示行数和内容
sed '/hello/=' westos 
sed '/hello/=' -i westos         修改文件内容
cat westos(已修改)

Charles正则过滤接口 正则表达式过滤_bash_18

sed '6r westos' fstab            将westos文件内容插入fstab文件第六行下面
sed '$r westos' fstab            将westos文件内容插入fstab文件最下面
sed '1r westos' fstab            将westos文件内容插入fstab文件第一行

Charles正则过滤接口 正则表达式过滤_Charles正则过滤接口_19

6、sed 的其他用法

sed -n '/^UUID/=' fstab                     显示共有总行数   -n 只显示处理结果
sed  '/^UUID/=' fstab                       显示所有行和总行数
sed -n -e '/^UUID/p' -e '/^UUID/=' fstab    -n -e 显示这一行并表明在第几行

Charles正则过滤接口 正则表达式过滤_bash_20

sed 'G' fstab                     每一行下面加空行
sed '$!G' fstab                   删除最后一行下的空行
sed '=' fstab | sed 'N;s/\n/ /g'  =显示行号 N换行符 后面替换
sed -n '$p' fstab                 显示最后一行

Charles正则过滤接口 正则表达式过滤_Charles正则过滤接口_21

sed 's/nologin/westos/g' passwd                 替换全部字符
sed '3,5s/nologin/westos/g' passwd              替换3到5行字符
sed '/adm/,/sync/s/nologin/westos/g' passwd     关键字行字符的替换

Charles正则过滤接口 正则表达式过滤_Charles正则过滤接口_22

vim file
sed -f file passwd        通过文件修改内容(临时)

Charles正则过滤接口 正则表达式过滤_sed_23

cat passwd   临时修改,原文件不生效

Charles正则过滤接口 正则表达式过滤_Charles正则过滤接口_24

sed -f file -i passwd     通过文件修改内容(永久)
cat passwd

Charles正则过滤接口 正则表达式过滤_vim_25


脚本应用三:

通过脚本修改httpd端口

vim install_apache.sh

Charles正则过滤接口 正则表达式过滤_sed_26


Charles正则过滤接口 正则表达式过滤_vim_27

三、awk 报告生成器

awk 处理机制 :awk 会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作,在命令格式上分别体现如下:
   BEGIN{}: 读入第一行文本之前执行,一般用来初始化操作
   {}: 逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令
   END{}: 处理完最后一行文本之后执行,一般用来输出处理结果
awk -F ":" '{print $1}' passwd  
    ##以:为分隔符,打印第1列    
awk '/bash$/{print}' passwd
    ##打印以bash结尾的行
awk -F ":" '/bash$/{print $1}' passwd 
    ##以:为分隔符,打印以bash结尾行的第1列
awk -F ":" 'BEGIN{print "NAME"}{print $1}END{print NR}' passwd 
    ##以:为分隔符,处理前打印 NAME ,打印第1列,处理后打印行数(NR列)

Charles正则过滤接口 正则表达式过滤_bash_28

脚本应用四:

Charles正则过滤接口 正则表达式过滤_sed_29

awk '/^ro/{print}' passwd          以ro开头的全部打印  
awk '/^[a-d]/{print}' passwd       以a-d字母开头的全部打印  
awk '/^[^a-d]/{print}' passwd      以除了a-d字母开头的全部打印

Charles正则过滤接口 正则表达式过滤_bash_30

awk '/^a|nologin$/{print}' passwd    打印以a开头或nologin结尾的行  
awk '/^r/&&/bash$/{print}' passwd    打印以r开头与bash结尾的行   
awk '/^r/||/bash$/{print}' passwd    打印以r开头或bash结尾的行

Charles正则过滤接口 正则表达式过滤_Charles正则过滤接口_31

awk -F ":" '$5~/^a/{print}' passwd   打印以a开头的行 
awk -F ":" '$1!~/^r/{print}' passwd  打印除了以r开头的行

Charles正则过滤接口 正则表达式过滤_bash_32

脚本应用五:

打印能登陆系统且家目录不是/home的用户个数

Charles正则过滤接口 正则表达式过滤_bash_33

脚本应用六:

打印设备eth0的IP

Charles正则过滤接口 正则表达式过滤_bash_34


脚本应用七:

统计文件的行数

Charles正则过滤接口 正则表达式过滤_Charles正则过滤接口_35