grep文本过滤器

grep
Global search rgular expression and print out the line

全面搜索研究正则表达式并显示出来 文本搜索工具,根据用户指定的“模式”对目标文本进行匹配检查,打印匹配到的行 由正则表达式或者字符及基本文本字符所编写的过滤条件

grep 匹配条件 处理文件

例如

grep root passwd 搜索含root的项

grep ^root passwd 搜索以root开头的项

grep root$ passwd 搜索以root结尾的项

grep -i root passwd 不分大小写搜索含root的项

grep -E "root|bash" passwd 搜索含root以及ROOT的项(= egrep "root|bash" passwd)

grep中正则表达式

grep中的位置及范围设定

.           ###代表任意一个字符
    ^           ##表示以……开头
    $           ##表示以……结尾
    \<  \>      ##表示不做任何拓展
    []          ##匹配中括号内范围的任意字符
    [^]         ##匹配不在括号范围内的任意字符

'r...'   r后面有三个任意字符的匹配项
'..r'    r前面有两个任意字符的匹配项
'r..w'   r后面w前面有两个任意字符的匹配项

grep中的匹配次数设定

*        	    #字符出现0-任意次
?             	#字符出现0-任意次          
+              	#字符出现1-任意次   
{n}            	#字符出现n次
{m,n}          	#字符出现最少m次,最多n次  
{0,n}         	#字符出现0-n次
{m,}           	#字符出现至少m次
{,n}           	#字符出现最多n次  
(row){m,n}   	##关键字row出现m-n次
.*            	#关键字之间匹配任意字符

grep中的常用字符

-i        ##忽略字母大小写
  -v	    ##条件取反
  -c	    ##统计匹配行数
  -q       	##静默,无任何输出
  -n       	##显示匹配结果所在的行号
  -b       	##显示匹配结果的字符串所在的行号
  -c       	##显示有多少行匹配
  --color 	##将显示的字符用不同颜色标出
  -e    	##一个-e后跟一个正则表达式,指定多个正则表达式
  -w     	##查找一个词
  -m  	    ##最多匹配几个
  -R 	    ##搜索子目录
  -o	    ##只打印匹配内容
  -A 1      ##查找所有匹配行,显示匹配行前一行
  -B 1      ##查找所有匹配行,显示匹配行前一行
  -C 1      ##查找所有匹配行,显示匹配行前一行,后一行
  -E        ##(=egrep)为一个可扩展的正则表达式

实验

[root@des ~]# cp /etc/passwd /mnt/
[root@des ~]# vim /mnt/passwd
###删除部分内容 
[root@des ~]# cd /mnt/
[root@des mnt]# grep root passwd 
###筛选包含root的项

grep日志过滤_grep日志过滤


grep日志过滤_vim_02

[root@des mnt]# cat /mnt/passwd | grep games -2
###筛选包含game项的行并显示这一行的上两行及下两行
[root@des mnt]# cat /mnt/passwd | grep games -A2
###筛选包含game项的行并显示这一行的上两行
[root@des mnt]# cat /mnt/passwd | grep games -B2
###筛选包含game项的行并显示这一行的下两行

grep日志过滤_grep日志过滤_03


grep日志过滤_sed_04

[root@des mnt]# grep -E "sh$" /etc/passwd | cut -d : -f 1
###筛选以/etc/passwd中sh结尾的项,并输出以:为分隔符的第一列

grep日志过滤_vim_05

[root@des mnt]# vim test
[root@des mnt]# grep ws test 
ws
###筛选ws
[root@des mnt]# grep w*s test 
westos
###出现任意次w(0-任意),+s
[root@des mnt]# grep w.....s test 
[root@des mnt]# grep w......s test 
wessstos
weeestos
###ws中间有6个字符

grep日志过滤_grep日志过滤_06


grep日志过滤_vim_07

[root@des mnt]# vim xy
[root@des mnt]# grep xy xy
###显示xy项
[root@des mnt]# grep x*y xy
###显示xy相间项(x出现0-任意次)
[root@des mnt]# grep -E 'x?y' xy
###显示含x或y项
[root@des mnt]# grep -E 'x+y' xy
###显示X出现任意次+y项
![在这里插入图片描述]()
![在这里插入图片描述]()


[root@des mnt]# grep -E 'x{2}y' xy
###指定两个x+y
[root@des mnt]# grep -E 'x{2,3}y' xy
###指定两或三个x+y
[root@des mnt]# grep -E 'x{2,}y' xy
###指定最少两个x
[root@des mnt]# grep -E 'x{,3}y' xy
###指定至多三个x
[root@des mnt]# grep -E '(xy){,3}' xy
###指定最多三个xy
![在这里插入图片描述]()

[root@des mnt]# grep ^root passwd 
###筛选指定以root开头
[root@des mnt]# grep root$ passwd 
###筛选指定以root结尾的项

grep日志过滤_搜索_08


sed行编辑器

sed 可依照脚本的指令来处理、编辑文本文件。 sed 一次处理一行内容,处理时,把当前的行存储在临时缓冲区,处理完后,输送到屏幕 Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等

一般格式: sed [参数] ‘命令’ fileame

常用参数含义:

p 显示


d 删除


a 添加


c 替换


w 写入


i 插入

常用选项

-n  仅显示指定信息
-i  表示更改原文件内容
-b  表示显示时添加行号
-e  表示进行多个动作
-f  指定脚本名称
-h  显示帮助

实验

p模式

[root@des mnt]# cat fstab -n | sed 5p
###加入一个第5行
[root@des mnt]# cat fstab -n | sed -n 5p
###指定输出第5行

grep日志过滤_grep日志过滤_09

[root@des mnt]# cat fstab -n | sed -n 3,5p
###指定输出第3~5行

grep日志过滤_vim_10

[root@des mnt]# cat fstab -n | sed -n '3p;5p'
###指定输出第三、第五行
cat fstab -n
###显示fstab,并显示行号

grep日志过滤_grep日志过滤_11

[root@des mnt]# sed -n '/^$/!p' fstab 
###不显示空行
[root@des mnt]# sed -n '/^$/!p' fstab | sed -n '/^#/!p'
###不显示空行同时不显示#开头的行

grep日志过滤_sed_12

按照userfile文件建立用户,反馈列表中以存在用户

[root@des mnt]# seq 1 10

grep日志过滤_搜索_13

[root@des mnt]# vim creste_usr.sh 
#!/bin/bash
[ -z "$1" ] && {
        echo "Error!Please input userfile following script"
        exit
}
[ ! -e "$1" ] && {
        echo "$1 is not exit"
        exit
}
Max_Num=`wc -l $1 | cut -d " " -f 1`
for Line_Num in `seq 1 $Max_Num`
do
        USERNAME=`sed -n ${Line_Num}p $1`
        id $USERNAME &> /dev/null && {
                echo $USERNAME is exist!
        } || {
        useradd $USERNAME
        }
done


[root@des mnt]# vim userfile 
[root@des mnt]# sh creste_usr.sh userfile 
[root@des mnt]# cat userfile

grep日志过滤_grep日志过滤_14

d模式

[root@des mnt]# sed '/^UUID/d' fstab 
###删除以UUID开头的行
[root@des mnt]# cat fstab

grep日志过滤_grep日志过滤_15

[root@des mnt]# sed '/^#/d' fstab 
###删除#开头的行
[root@des mnt]# sed '/^$/d' fstab 
###删除空行
[root@des mnt]# sed '1,4d' fstab 
###删除1到4行
[root@des mnt]# sed '/^UUID/!d' fstab 
###只不删除UUID行

grep日志过滤_grep日志过滤_16


grep日志过滤_vim_17


a模式

[root@des mnt]# sed '/^UUID/ahello\nwestos' fstab 
###在UUID行后一行加hello,在下一行加westos(\n指换行)

grep日志过滤_vim_18


w模式

[root@des mnt]# sed -n '/^UUID/w file' fstab 
###将UUID行输入到文件file中
[root@des mnt]# cat file

grep日志过滤_vim_19

[root@des mnt]# sed  '$=' fstab 
###显示fstab并在最后显示行号
[root@des mnt]# sed -n '$=' fstab 
###只显示行号
[root@des mnt]# wc -l fstab | cut -d " " -f 1
###同效
[root@des mnt]# sed '6r /mnt/file' fstab

grep日志过滤_grep日志过滤_20


c模式

[root@des mnt]# sed "/#/cwestos" -i fstab 
###将fstab中一#开头的行换为westos
[root@des mnt]# cat fstab

grep日志过滤_grep日志过滤_21

利用脚本改变http端口

[root@des mnt]# vim http_port.sh
[root@des mnt]# sh http_port.sh 8080

#!/bin/bash
[ -z "$1" ] && {
        echo "Error:please input number following script"
        exit
}
sed "/^Listen/clisten $1" -i /etc/httpd/conf/httpd.conf
systemctl restart httpd

[root@des mnt]# vim /etc/httpd/conf/httpd.conf

grep日志过滤_vim_22


grep日志过滤_sed_23


grep日志过滤_搜索_24

awk报告生成器

对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能。在命令行中使用,但更多是作为脚本来使用

变量参数

NR ##输出当前操作的行号

NF ##输出当前字段个数

print ##打印文件内容

FILENAME ##输出文件名

BEGIN{} #读入第一行文本之前执行,一般用来初始化操作

{} #逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令块

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

实验

awk '{print FILENAME}' passwd
awk -F : '{print $1}' passwd  只显示第一列

grep日志过滤_grep日志过滤_25


grep日志过滤_sed_26

awk -F : 'BEGIN{print "hello"}{print $1}' passwd 显示第一列并在第一行加入hello

grep日志过滤_sed_27

awk -F : 'BEGIN{n=1}{print $2,n}' passwd 显示第二列并在每一行后加入1

##

grep日志过滤_vim_28

awk -F : 'BEGIN{n=1}{print $2,n++}' passwd 显示第二列并随着行数的增加n也不断加一(行数统计)

grep日志过滤_grep日志过滤_29

awk -F : 'BEGIN{n=1}{print n++,$2}' passwd 将行数统计放在前面

grep日志过滤_grep日志过滤_30

awk -F : 'BEGIN{n=1}{print n++,$2}END{print "over"}' passwd 统计行数并显示第二列内容并在结尾行输入over

grep日志过滤_sed_31

awk -F : 'BEGIN{n=1}{print n++,$2}END{print NR}' passwd 统计行数并显示第二列内容,在结尾行显示行数

##

grep日志过滤_sed_32

awk -F : 'BEGIN{n=1}{print n++,$2}END{print NF}' passwd 统计行数并显示第二列内容,在结尾行显示列数

grep日志过滤_搜索_33

awk -F : 'NR==3{print}' passwd 输出第三行的全部内容

grep日志过滤_grep日志过滤_34

awk -F : 'NR==3{print $1}' passwd 输出第三行第一列的全部内容

grep日志过滤_sed_35

awk -F : 'NR>=3&&NR<=6{print}' passwd 搜索3~6行的内容

grep日志过滤_搜索_36

awk -F : 'NR==3||NR==6{print}' passwd 搜索第三行以及第六行的内容
awk -F : '/bash/{print}' passwd 搜索所有含有bash的行

grep日志过滤_搜索_37

awk -F : 'BEGIN{a=34;print a+12}'计算34+12

grep日志过滤_vim_38

awk -F : '/^ro/{print$1,$6}' passwd 搜索以ro开头的行并输出它的第一、六行

grep日志过滤_sed_39

awk -F : '/^[a-d]/{print$1,$6}' passwd 搜索以a\b\c\d开头的行并输出它的第一、六行

grep日志过滤_grep日志过滤_40

awk -F : '/^root|nologin$/{print $1,$7}' passwd 搜索以root开头或nologin结尾的行并输出它的第一、七行

grep日志过滤_搜索_41

awk -F : '$6~/bin$/{print $1,$6}' /etc/passwd 搜索第六列以bin结尾的行并输出1、6列

grep日志过滤_grep日志过滤_42

awk -F : '$6!~/bin$/{print $1,$6}' /etc/passwd搜索第六列不以bin结尾的行并输出1、6>列

grep日志过滤_sed_43