shell中的文本处理之grep,sed,awk的学习应用

1.grep 文本过滤命令

grep中的正则表达式
 ^westos    #以westos开头
 westos$    #以westos结尾
 'w....s'
 'w.....'
 '.....s'
 grep -E = egrep
应用
 cp /etc/passwd   /mnt
 cd /mnt
 vim /mnt/passwd
添加(为后边的实验效果做准备):
test:test:root
ROOT:test:test
test:root:test

 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在中间的行

这里写图片描述

vim test

这里写图片描述

  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以下的次数

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

vim test 

这里写图片描述

1 grep 'r*t' test   
2 grep -E 'r....' test   #过滤r之后出现4个字符
3 grep -E 'r....\>' test  #精确匹配
4  grep -E "\<r....\>" test
5 grep -E "....r" test
6 grep -E "\<....r" test   #过滤r之前出现4个字符

这里写图片描述

应用:编写脚本文件,使输出可以登陆系统的用户
vim show_loginuser.sh

这里写图片描述

sh  show_loginuser.sh

这里写图片描述

2.sed 行编辑器

p模式(显示)
1 sed -n '^:/p' fstab   #显示fstab中以:开头的行
2 sed -n 'UUID$/p' fstab  #显示fstab中以UUID结尾的行
3 sed -n '/^UUID/p' fstab  #显示fstab中以UUID开头的行
4 sed -n '2,6p' fstab    #显示fstab中的第二和第六行
5 sed -n '2,6!p' fstab    #显示fstab中除过第二和第六行其余的行
实验:
1 cp /etc/fstab  /mnt    
2 sed -n '/^#/p' fstab   #显示fstab中以#开头的行 
3 sed -n '/^#/!p' fstab    #显示fstab中除了以#开头的其余行
4 cat -n fstab | sed -n '2,6p'   #显示fstab中第2到第六行
5 cat -n fstab | sed -n -e '2p' -e '6p'   #显示fstab中的第二和第六行
6 cat -n fstab | sed -n -e '2p;6p' #显示fstab中的第二和第六行
7 cat -n fstab | sed -ne  '2!p;6!p' | uniq -d   #显示fstab中除过第二和第六行其余的行

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

应用:编写一个脚本文件,使得运行脚本自动建立用户并设定密码
vim username

这里写图片描述

vim userpasswd

这里写图片描述

vim user_create.sh

这里写图片描述

sh  user_create.sh  username userpasswd

这里写图片描述
测试:
这里写图片描述

d模式(删除,只是显示的时候删除,并不删除原文件)
1 sed '/^UUID/d'  fstab   #删除以UUID开头的行
2 sed '/^#/d'   fstab     #删除以#开头的行 
3 sed '/^$/d'   fstab     #删除以空格开头的行 
4 sed  '/^UUID/!d'  fstab  #删除不是以UUID开头的行
5 cat -n fstab | sed '1,4d'  #删除1到4行
6 cat -n fstab | sed -e '2d;6d'   #删除第二行和第六行

实验:
这里写图片描述

a模式(添加,默认在最后一行)
1 sed '/^UUID/a\hello'  fstab   #在以UUID开头的行的前一行添加hello
2 sed '/^UUID/a\hello  \nwestos'  fstab  #在以UUID开头的行的前一行添加hello换行再添加westos

实验:

1 vim westos
   hello
2 sed '/hello/aworld'  westos   #在westos中的hello后添加westos
3  sed '/hello/aworld\nwestos'  westos  #在westos中的hello后添加world再换行添加westos
4 sed '/westos/a\world' westos
5 sed 's/westos/hello world/g' westos

这里写图片描述

i 模式(插入)
sed '/^UUID/i\hello'   fstab   #在UUID的前一行添加hello

实验:

1 sed '/^hello/i\world' westos #在hello的前一行添加world
  world
  hello

这里写图片描述

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

实验:

1 sed '/hello/chello world' westos  #把westos中的hello替换成 hello world
2 sed '/hello/chello\nworld' westos #把westos中的hello替换成hello(换行)world 

这里写图片描述

w模式(写入)
1 sed '/^UUID/wwestos'   fstab      
2  sed -n '/^UUID/wwestos' fstab
3 sed '/^UUID/='  fsatb    #显示以UUID开头所在的行号
4 sed '6r westos'  fstab

实验:

1 sed -n '/bash$/p' passwd > file  #把passwd中以bash结尾的行输入到file中
2 cat file
3 sed -n '/bash$/wfile1' passwd  #把passwd中以bash结尾的行输入到file1中
4 cat file1

这里写图片描述
区别:

sed -n '/bash$/p' passwd > file #先处理前面的,之后再执行"> file"
sed -n '/bash$/wfile1' passwd   #边处理边执行

5  sed '/hello/=;wfile' westos  #把westos中的hello写入到file中,并显示行号
6  cat file
   1
   hello
7  echo `sed '/hello/=' westos`    
8  sed '=' westos   #显示行号和内容
9  cp /etc/fstab  /mnt
10 sed '6r westos' fstab  #添加westos中的内容在fstab的第六行后
11 sed '$r westos' fstab  #添加westos中的内容在fstab的最后一行
sed 的其他用法
sed -n '/^UUID/='  fstab
sed -n -e  '/^UUID/p' -e '/^UUID/=' fstab
sed 'G'  data
sed '$!G' data
sed '=' data | sed 'N;s^n//'
sed -n '$p' data
sed -e '/^UUID/p' -e '/^UUID/=' fstab
sed -f rulesfile file
sed 's/^\//#/'    fstab

实验:

1  sed -n '/^UUID/='  fstab  #显示以UUID开头的行号
2  sed -n -e  '/^UUID/p' -e '/^UUID/=' fstab  #-e用来连接''
3  sed '=' fstab | sed 'N'     #N表示每行多加一个换行符
4  sed '=' fstab | sed 's/\n//g'    #显示行号并换行 
5  sed '=' fstab | sed 'N;s/\n/ /g'  #显示行号不换行
6  sed 'G' fstab   #每行加空行显示fstab中内容 
7  sed '$!G' fstab     #每行加空行但最后一行不加空行显示
8  sed -n '$p'  fstab      #显示文件的最后一行
9  sed 's/nologin/westos/g' passwd     #把passwd中以nologin结尾的全部替换为westos
10 sed '3,5s/nologin/westos/g' passwd  #用westos替换passwd中第三行到第五行的nologin
11 sed '/adm/,/sync/s/nologin/westos/g;s/sbin/wang/g' passwd  #用westos替换以adm和sync开头行中的nologin,用wang全文替换sbin

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

1 vim file
2 sed -f file passwd   #用文件替换,不更改原文件内容 
3 cat passwd
4 sed -f file -i passwd  #替换,更改原文件内容,-i表示改变原文件内容 
5 cat passwd
应用:编写一个脚本,显示能登陆系统的用户的个数
vim install_apache.sh

这里写图片描述

1 sh  install_apache.sh 8080
2 sh  install_apache.sh 80

这里写图片描述

3.awk 报告生成器

awk处理机制:awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作,在命令格式上分别体现如下:
BEGIN{}   :读入第一行文本之前执行,一般用来初始化操作
{}        :逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令块
END{}     :处理完最后一行文本之后执行,一般用来输出处理结果
1.awk基本用法:
awk  '{print FILENAME}' passwd
awk  '{print 第"NR"行,第"NF"列}' passwd
awk  'BEGIN {print NAME}'  passwd
awk  'END   {print NAME}'  passwd
awk  -F ":" 'BEGIN{print NAME}{print $1}END{WESTOS}'  passwd
awk  '/bash$/ ' passwd
awk  -F ":" '/bash$/{print $1}'  passwd 
awk  'BEGIN{a=34;print a+12}'
awk  -F '{print FILENMAE}' passwd
awk  '{print FILENMAE}' passwd
awk  -F : '/^ro/{print}'  passwd
awk  -F : '/^[a-d]/{print $1,$6}' passwd
awk  -F : '/^a|nologin$/{print $1,$7}' passwd
awk  -F : '$6~/bin$/{print $1,$6}'
awk  -F : '$7!~/nologin$/{print $1,$7}' passwd

实验:

1 awk -F ":" '{print $1}' passwd  #以:为分隔符,显示第一列
2 awk -F ":" 'BEGIN{print "NAME"}{print $1}'  passwd  #以NAME开始显示第一列
3 awk -F ":" 'BEGIN{print "NAME"}{print NR$1}END{print "END"}'  passwd #以NAME开始,以END结束,显示第一列并显示行号
4 awk -F ":" 'BEGIN{print "NAME"}{print NR;print  }END{print "END"}'  passwd #显示行号并换行
5 awk -F ":" '/bash$/{print $1}' passwd   #sh结尾的行的第一列,$1表示第一列
6 awk -F ":" 'BEGIN{N=0}/bash$/{N++}END{print N}'  passwd  #统计passwd中以bash结尾的行数
7 awk '/^ro/{print}' passwd      #打印以ro开头的行
8 awk '/^[^a-d]/{print}' passwd  #打印以a到d开头的行
9 awk '/^a|nologin$/{print}'  passwd  #打印以a开头或者以nologin结尾的行
10 awk -F ":" '$1~/^r/{print}'  passwd #打印以r开头的行
11 awk -F ":" '$1!~/^r/{print}'  passwd  #打印不以r开头的行
12 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

  vim ip_check.sh

这里写图片描述

sh  ip_check.sh

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

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

5.统计文件的行数

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

这里写图片描述

猜你喜欢

转载自blog.csdn.net/wzt888_/article/details/80822636