天天看点

shell中的文本处理之grep,sed,awk

1 grep文本过滤命令

grep中的正则表达式

grep ^root passwd #过滤以root开头的行
grep root$ passwd #过滤以root结尾的行
grep -i ^root passwd #不区分大小写,过滤以root开头的行
grep -E "^root | root$" passwd #过滤以root开头或root结尾的行,-E表示扩展正则表达式
grep -E -v "^root | root$" passwd # -v 表示反向过滤
grep -E -v "^root | root$" passwd |grep root #过滤root在中间的行
grep -i root passwd | grep -v -i -E "^root | root$" #过滤root在中间的行


grep 'r.t' test #过滤r和t之间只有一个字符
grep 'r..t' test #过滤r和t之间有两个字符
grep 'r...t' test #过滤r和t之间有三个字符
grep 'r*t' test # 过滤r出现的任意次数
grep 'r\**t' test #过滤r,t之间有0个字符
grep 'ro*t' test #过滤r和t之间o出现的任意次数
grep -E 'ro*t' test #过滤r和t之间o出现的任意次数
grep -E 'ro?t' test #过滤r和t之间o出现的0和1次
grep -E 'ro{1,}t' test #过滤r和t之间o出现的1次以上
grep -E 'ro{,3}t' test #过滤r和t之间o出现的3以下的次数


grep -E 'r....' test #过滤r之后出现4个字符
grep -E 'r....\' test#精确匹配
grep -E '\<....r' test #过滤r之前出现4个字符
           

应用: 编写脚本文件,使输出可以登录系统的用户

vim show_loginuser.sh
#!/bin/bash
SHELL=$(echo `grep -v nologin /etc/shells ` | sed 's//|/g')
grep -E "$SHELL" /etc/passwd | cut -d : -f l
           

2 sed 行编辑器

p模式(显示)

sed -n '^:/p' fstab #显示fstab中以:开头的行
sed -n 'UUID$/p' fstab #显示fstab中以UUID结尾的行
sed -n '/^UUID/p' fstab #显示fstab中以UUID开头的行
sed -n '2,6p' fstab #显示fstab中的第二行和第六行
sed -n '2,6!p' fstab #显示fstab中除过第二行和第六行其余的行
           

d模式(删除,只是显示的时候删除,并不删除原文件)

sed '/^UUID/d' fstab #删除以UUID开头的行
sed '/^#/d' fstab #删除以#开头的行
sed '/^$/d' fstab #删除以空格开头的行
sed '/^UUID/!d' fstab #删除不是以UUID开头的行
cat -n fstab | sed '1,4d' #删除1到4行
cat -n fstab | sed  -e '2d,6d' #删除第二行和第六行
           

a模式(添加,默认在最后一行添加)

sed '/^UUID/a\hello' fstab #在以UUID开头的行的前一行添加hello
sed '/^UUID/a\hello' \newstos fstab #在以UUID开头的行的前一行添加hello换行再添加westos
           

i模式(插入)

sed '/^UUID/i\hello' fstab #在UUID的前一行添加hello
           

c模式(替换)

sed '/^UUID/c\hello'  fstab #把以UUID开头的行替换成hello
           

w模式(写入)

sed '/^UUID/wwestos' fstab
sed -n '/^UUID/wwestos' fstab
sed '/^UUID/=' fstab #显示以UUID开头所在的行号
sed '6r westos' fstab
           

3 awk报告生成器

awk处理机制:awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行,做一些总结性质的工作,在命令格式上分别体现如下:

BEGIN{}:读入第一行文本之前执行,一般用来初始化操作
{}     :逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令块
END{}  :处理完最后一行文本之后执行,一般用来输出处理结果


awk -F ":" '{print $1}' passwd #以:为分隔符,显示第一列
awk -F ":" 'BEGIN{print "NAME"}{print $1}' passwd #以NAME开始显示第一列
awk -F ":" 'BEGIN{print "NAME"}{print NR$1}END{print "END"}' passwd #以NAME开始,以END结束,显示第一列并显示行号
awk -F ":" 'BEGIN{print "NAME"}{print NR;print }END{print "END"}' passwd #显示行号并换行
awk -F ":" '/bash$/{print $1}' passwd #sh 结尾的行第一列,$1表示第一列
awk -F ":" 'BEGIN{N=0}/bash$/{N++}END{print N}' passwd #统计passwd中以bash结尾的行数
awk -F '/^ro/{print}' passwd #打印以ro开头的行
awk -F '/^[a-d]/{print}' passwd #打印以a到d开头的行
awk -F '/^a|nologin$/{print}' passwd #打印以a开头或者以nologin结尾的行
awk -F ":"  '$1~/^r/{print}' passwd#打印以r开头的行
awk -F ":" '$1!~/^r/{print}'  passwd#打印不以r开头的行
awk -F ":" '{print NR,$0}' passwd #以:为分隔符打印第一列,并表示行号,$0表示文件一整行的内容
           

应用:

1 计算显示能够登录系统的用户个数

awk -F ":" 'BEGIN{n=0}$5!~/^\/home/&&/bash/{n++}END{print n}' /etc/passwd
           

2 找出系统中可以登录系统,但用户家目录不在/home下

awk -F ":" '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd
           

3 抓取eth0的网卡ip

ifconfig eth0 | awk -F "" '/inet\>/{print $2}'
           

4 统计在系统中可以登录系统的用户

awk -F ":" '$5!~/^\/home/&&/bash/{print $1}' /etc/passwd
           

5 统计文件的行数

awk 'BEGIN{n=0}{n++}END{print n}' /etc/passwd
           

继续阅读