Linux下的shell文本处理工具grep、sed和awk

1、grep
全局搜索正则表达式
grep 匹配条件 处理文件
        *      字符出现0到任意次
        \?     字符出现0到1次
        \+     字符出现1到任意次
        \{m,n} 字符出现m到n次
        .*     关键字之间匹配任意字符
[root@desktop mnt]# grep root passwd #过滤除passwd中含root的行
[root@desktop mnt]# grep ^root passwd #^ 表示以root开头行
[root@desktop mnt]# grep root$ passwd # 表示以root结尾行
[root@desktop mnt]# grep -i root passwd #-i 忽略大小写
[root@desktop mnt]# grep -E "root|ROOT" passwd #-E 扩展正则表达式,相当于egrep,|表示或
[root@desktop mnt]# grep -v "root|ROOT" passwd #-v 反向过滤

这里写图片描述

[root@desktop mnt]# grep -E "r...\>" test #不做拓展搜索,精确匹配关键字
[root@desktop mnt]# grep -E "\<r...\>" test
[root@desktop mnt]# grep r...t test #.表示位数,精确指定

这里写图片描述

[root@desktop mnt]# grep -E "ro*t" test ##?表示字符ro出现0到任意次
[root@desktop mnt]# grep -E "ro?t" test #?表示字符ro出现01次
[root@desktop mnt]# grep -E "ro{,2}t" test #"ro{,2}t"表示字符ro出现02次
[root@desktop mnt]# grep -E "(root)?" test #"(root)?"表示字符root出现01

这里写图片描述

[root@desktop mnt]# grep -E "r.*t" test #关键字之间匹配任意字符
[root@desktop mnt]# grep -E "ro{1,}t" test #"ro{1,}t"表示字符ro出现1到任意次
[root@desktop mnt]# grep -E "ro+t" test ##"ro+t"表示字符ro出现1到任意次

这里写图片描述

2、sed
行编辑器
用来操作纯ASCII码的文本,处理时,把当前的行储存在临时缓冲区中,可以指定仅仅处理那些行,符合模式条件的处理,不符合的不予处理。处理完成后将缓存区内容送往屏幕,接着处理下一行。
(1)p显示模式

[root@desktop mnt]# sed -n '/^UUID/p' fstab #显示以UUID开头的行
[root@desktop mnt]# sed -n '/0$/p' fstab #显示以0结尾的行
[root@desktop mnt]# sed -n '/^UUID/!p' fstab #不显示以UUID开头的行
[root@desktop mnt]# cat -n fstab|sed -n '/2,5/!p' fstab #显示2-5行

这里写图片描述

[root@desktop mnt]# cat -n fstab|sed -n -e '2p' -e '6p'#显示26行,多个条件用-e连接
[root@desktop mnt]# cat -n fstab|sed -n -e '2p;6p'#显示26行
[root@desktop mnt]# sed -n '/^$/!p' fstab #不显示空行

这里写图片描述

(2)d删除模式
操作参照p模式
[root@desktop mnt]# sed '/^$/d' fstab #删除空行
[root@desktop mnt]# sed '2d;6d' fstab #删除2和6行

这里写图片描述
这里写图片描述

(3)a添加模式
[root@desktop mnt]# cat test
[root@desktop mnt]# sed '/hello/aworld' test #给test文件hello后加world,添加到下一行
[root@desktop mnt]# sed 's/hello/hello world/g' test #行后添加相当于修改本行
[root@desktop mnt]# sed '/hello/aworld\nwestos' test #插入多行,\n表示换行

这里写图片描述

(4)i插入模式
[root@desktop mnt]# cat test
hello
[root@desktop mnt]# sed '/hello/iworld' test #在test文件hello前插入world
(5)c替换模式
[root@desktop mnt]# sed '/hello/cworld' test #将test文件hello替换为world

这里写图片描述

(6)w写入模式
处理一行写一行,效率高
[root@desktop mnt]# sed -n '/hello/wfile' test #将test中的hello写入file文件,file不存在时会自动创建
[root@desktop mnt]# cat file
[root@desktop mnt]# sed -n '/hello/p' test> file #作用同上

这里写图片描述

[root@desktop mnt]# cat -n fstab|sed '6r test' #将westos文件内容添加到fstab文件第六行下

这里写图片描述

(7)其他用法
[root@desktop mnt]# sed '=' fstab #给fstab每一行添加行号
[root@desktop mnt]# sed '/^UUID/=' fstab #给UUID开头的行添加行号
[root@desktop mnt]# sed -n '/^UUID/=' fstab #查看以UUID开头的行是那一行
[root@desktop mnt]# sed 'G' fstab
显示文件匹配的内容,及其所在的行

这里写图片描述

(8)s替换
[root@desktop mnt]# sed 's/nologin/###/g' passwd #全文替换nologin为###
[root@desktop mnt]# sed '3,5s/nologin/###/g' passwd #3-5行的nologin替换为###

这里写图片描述

[root@desktop mnt]# sed '/adm/,/sync/s/sbin/@@@@@@/g' passwd #从adm到sync的所有sbin替换为@@@@@@
[root@desktop mnt]# sed -e '/adm/,/sync/s/sbin/@@@@@@/g;s/x/HHHHH@/g' passwd #替换从adm到sync的sbin,替换全文
x
[root@desktop mnt]# vim file #编写一个替换规则的文件file
/adm/,/sync/s/sbin/@@@@@@/g
s/x/HHHHH/g
[root@desktop mnt]# sed -f file passwd #-f指定file的规则区替换passwd
[root@desktop mnt]# sed -f file -i passwd #指定file的规则替换passwd,同时输出到passwd更改其内容

这里写图片描述
这里写图片描述

#实验:列出可登陆的用户名称
[root@desktop mnt]# vim show_loginuser.sh
#!/bin/bash
SHELL=$(echo `grep -v nologin /etc/shells`|sed 's/ /|/g')
echo -e "\033[32m\033[4m The following are logged in users\033[0m" #32m绿色,4m下划线
grep -E "$SHELL" /etc/passwd | cut -d : -f 1
#测试:

这里写图片描述

#补充:shell中的颜色、效果设置
(1)命令行格式

这里写图片描述

(2)颜色、效果代码

这里写图片描述

3、awk报告生成器
处理机制:逐行处理文本,支持在处理第一行前做一些准备工作,以及在处理后做一些总结性质的工作,体现如下:
BEGIN{ }:读入第一行文本前执行
{ }:逐行读入文本执行相应处理
{ }:处理完最后一行文本后执行
[root@desktop mnt]# awk '{print NR}' passwd #打印passwd行号
[root@desktop mnt]# awk '{print NF}' passwd #打印passwd列号
[root@desktop mnt]# awk -F ":" 'BEGIN{print "NAME"}{print $1}END{print "END"}' passwd #打印passwd第一列,打印前先打印NAME,打印后再打印END

这里写图片描述

[root@desktop mnt]# awk '/nologin$/{print}' passwd #打印以nologin结尾的行
[root@desktop mnt]# awk -F ":" '/bash$/{print $1}' passwd #打印以bash结尾的行的第一列
[root@desktop mnt]# awk -F ":" 'BEGIN{N=0}/bash$/{N++}END{print N}' passwd #显示以bash结尾的行的数目
[root@desktop mnt]# awk 'BEGIN{N=0}//{N++}END{print N}' passwd #显示passwd文件的行数
[root@desktop mnt]# awk '/^[a-d]/{print}' passwd #打印passwd以a-d开头的行
[root@desktop mnt]# awk '/^[^a-d]/{print}' passwd #打印除a-d开头以外的行

这里写图片描述


[root@desktop mnt]# awk -F ":" '$1~/^r/{print}' passwd #输出第一列以r开头的行
root:x:0:0:root:/root:/bin/bash
[root@desktop mnt]# awk -F ":" '$5~/^a/{print}' passwd #输出第五列以a开头的行
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@desktop mnt]# awk -F ":" '$7!~/bash$/{print}' passwd #不打印第七行以bash结尾的行
[root@desktop mnt]# awk -F ":" '{print NR,$0}' passwd #$0表示打印整行

这里写图片描述

#实验:利用脚本使用用户和密码文件建立系统用户
[root@desktop mnt]# vim userfile
user1
user2
user3
[root@desktop mnt]# vim passfile
123
456
789
[root@desktop mnt]# vim user.sh
#!/bin/bash
MAX_LINE=`wc -l $1|cut -d " " -f 1`
for LINE_NUM in `seq 1 $MAX_LINE`
do
USERNAME=`sed -n "${LINE_NUM}p" $1`
PASSWORD=`sed -n "${LINE_NUM}p" $2`
useradd $USERNAME
echo $PASSWORD | passwd --stdin $USERNAME
done

猜你喜欢

转载自blog.csdn.net/yyyxxxs/article/details/80754200