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的项
[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项的行并显示这一行的下两行
[root@des mnt]# grep -E "sh$" /etc/passwd | cut -d : -f 1
###筛选以/etc/passwd中sh结尾的项,并输出以:为分隔符的第一列
[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个字符
[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结尾的项
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行
[root@des mnt]# cat fstab -n | sed -n 3,5p
###指定输出第3~5行
[root@des mnt]# cat fstab -n | sed -n '3p;5p'
###指定输出第三、第五行
cat fstab -n
###显示fstab,并显示行号
[root@des mnt]# sed -n '/^$/!p' fstab
###不显示空行
[root@des mnt]# sed -n '/^$/!p' fstab | sed -n '/^#/!p'
###不显示空行同时不显示#开头的行
按照userfile文件建立用户,反馈列表中以存在用户
[root@des mnt]# seq 1 10
[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
d模式
[root@des mnt]# sed '/^UUID/d' fstab
###删除以UUID开头的行
[root@des mnt]# cat fstab
[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行
a模式
[root@des mnt]# sed '/^UUID/ahello\nwestos' fstab
###在UUID行后一行加hello,在下一行加westos(\n指换行)
w模式
[root@des mnt]# sed -n '/^UUID/w file' fstab
###将UUID行输入到文件file中
[root@des mnt]# cat file
[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
c模式
[root@des mnt]# sed "/#/cwestos" -i fstab
###将fstab中一#开头的行换为westos
[root@des mnt]# cat fstab
利用脚本改变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
awk报告生成器
对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能。在命令行中使用,但更多是作为脚本来使用 |
变量参数
NR ##输出当前操作的行号 |
NF ##输出当前字段个数 |
print ##打印文件内容 |
FILENAME ##输出文件名 |
BEGIN{} #读入第一行文本之前执行,一般用来初始化操作 |
{} #逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令块 |
END{} #处理完最后一行文本之后执行,一般用来输出处理结果 |
实验
awk '{print FILENAME}' passwd
awk -F : '{print $1}' passwd 只显示第一列
awk -F : 'BEGIN{print "hello"}{print $1}' passwd 显示第一列并在第一行加入hello
awk -F : 'BEGIN{n=1}{print $2,n}' passwd 显示第二列并在每一行后加入1
##
awk -F : 'BEGIN{n=1}{print $2,n++}' passwd 显示第二列并随着行数的增加n也不断加一(行数统计)
awk -F : 'BEGIN{n=1}{print n++,$2}' passwd 将行数统计放在前面
awk -F : 'BEGIN{n=1}{print n++,$2}END{print "over"}' passwd 统计行数并显示第二列内容并在结尾行输入over
awk -F : 'BEGIN{n=1}{print n++,$2}END{print NR}' passwd 统计行数并显示第二列内容,在结尾行显示行数
##
awk -F : 'BEGIN{n=1}{print n++,$2}END{print NF}' passwd 统计行数并显示第二列内容,在结尾行显示列数
awk -F : 'NR==3{print}' passwd 输出第三行的全部内容
awk -F : 'NR==3{print $1}' passwd 输出第三行第一列的全部内容
awk -F : 'NR>=3&&NR<=6{print}' passwd 搜索3~6行的内容
awk -F : 'NR==3||NR==6{print}' passwd 搜索第三行以及第六行的内容
awk -F : '/bash/{print}' passwd 搜索所有含有bash的行
awk -F : 'BEGIN{a=34;print a+12}'计算34+12
awk -F : '/^ro/{print$1,$6}' passwd 搜索以ro开头的行并输出它的第一、六行
awk -F : '/^[a-d]/{print$1,$6}' passwd 搜索以a\b\c\d开头的行并输出它的第一、六行
awk -F : '/^root|nologin$/{print $1,$7}' passwd 搜索以root开头或nologin结尾的行并输出它的第一、七行
awk -F : '$6~/bin$/{print $1,$6}' /etc/passwd 搜索第六列以bin结尾的行并输出1、6列
awk -F : '$6!~/bin$/{print $1,$6}' /etc/passwd搜索第六列不以bin结尾的行并输出1、6>列