shell之grep 文本过滤命令、sed 行编辑器 、awk 报告生成器

1.grep 文本过滤命令

##全面搜索研究正则表达式并显示出来

grep 命令 (Global search regular expression and print out the line)是一种强大的文本搜索工具,根据用户指定的‘模式’对目标文本进行匹配检查,打印匹配到的行。由正则表达式或者字符及基本文本字符所编写的过滤条件


1)grep 的格式:

grep + 匹配条件 + 处理文件

     

例如:  grep  root  passwd                          #过滤passwd中含有root的行并显示出来

           grep  ^root passswd                        #过滤passwd中以root开头行并显示出来

           grep  root$ passwd                          #过滤passwd中以root结尾行并显示出来

           grep -i root passwd                          #过滤passwd中含有root的行且忽略大小写并显示出来

           grep -E "root|ROOT" passwd            #过滤passwd中含有root或者ROOT的行并显示出来


实验:(在虚拟机中)

 cp /etc/passwd /mnt

 ls /mnt

 vim /mnt/passwd       #先删除一些内容,再添加一些新的内容,方便后面的实验观察现象

 cat /mnt/passwd


 cd /mnt

 grep root passwd      #找出passwd中含有root的行


 grep  ^root passwd    #找出passwd中以root开头行


 grep -i ^root passwd  #找出passwd中以root开头的行并且忽略大小写


 grep root$ passwd     #找出passwd中以root结尾的行


 grep -E "^root|root$" passwd   #过滤以root开头或以root结尾的行

 egrep "^root|root$" passwd     #说明 egrep 等同于 grep -E



@@显示passwd里root在中间的行

 grep -i root passwd | grep -i -v -E "^root|root$"   #-i表示忽略大小写


2)grep 中正则表达式:

 ## . 代表一个任意字符

'r..t'           #在r和t之间有2个任意字符

'r....'          #在r的后面有4个任意字符

'..t'            #在t的前面有2个任意字符

3)grep中字符的匹配位置设定:

## ^ 表示以……开头    $ 表示以……结尾    \<   \>  表示不做任何拓展

^root                        #以关键字root开头

root$                        #以关键字root结尾

\<root                      #关键字root之前不做拓展 (精确匹配)

root\>                      #关键字root之后不做拓展

\<root\>                  #关键字root前后不做拓展


实验:

 vim test

 cat test


 grep 'r.t' test


 grep 'rt' test


 grep 'r..t' test


 grep '\<r..t' test


 grep '\<r..t\>' test


4)grep中字符的匹配次数设定:

*                         #字符出现0-任意次

\?                     #字符出现0-1次          ## \可以不写

\+                     #字符出现1-任意次   

\{n\}                 #字符出现n次

\{m,n\}             #字符出现最少m次,最多n次  

\{0,n\}              #字符出现0-n次

\{m,\}               #字符出现至少m次

\(xy\)\{n\}xy     #关键字出现n次

.*                     #关键字之间匹配任意字符

例如

grep -E  'r{0,}t' test   #必须加-E

grep -E  'r.*t'

实验:

  cat test


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


@@只显示ip的这一行

1)ifconfig eth0 | grep -E "inet\>"


2)ifconfig eth0 | grep -E "inet "


@@用脚本显示能登陆的用户

 cat /etc/shells


 grep -v nologin /etc/shells               #过滤掉系统不能的登陆的用户


 echo `grep -v nologin /etc/shells`     #将系统中可登陆的用户输出到一行


 echo `grep -v nologin /etc/shells` | sed 's/ /|/g'


echo `grep -v nologin /etc/shells` | sed 's/ /##/g'


 


 vim show_loginuser.sh

############


注释  sed 's/ /|/g'   #将全文的 空格 替换为 |

 chmod +x show_loginuser.sh

 /mnt/show_loginuser.sh


 vim show_loginuser.sh

###########


 sh show_loginuser.sh


 useradd -s /bin/tcsh haha

 su - haha

 logout

 sh show_loginuser.sh


 useradd -s /bin/csh hai

 su - hai

 ps


 logout

 /mnt/show_loginuser.sh



2. sed 行编辑器

sed对字符的处理:

p   显示                   d     删除                   a   添加

c   替换                   w    写入                    i    插入

(1) 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中除过第二到第六行其余的行

  

实验:

 rm -rf *

 cp /etc/fstab /mnt

 ls

 cat fstab


 sed  -n '/^#/p' fstab    #显示fstab中以#开头的行


 sed  -n '/^#/!p' fstab   #显示fstab中不以#开头的行


 cat -n fstab                          # -n 添加行号


 cat -n fstab | sed -n '2,6p'    #显示第2到第6行


 cat -n fstab | sed -n '2p'      #显示第2行

 cat -n fstab | sed -n -e  '2p'


 cat -n fstab | sed -n '6p'     #显示第6行

 cat -n fstab | sed -n -e  '6p'


 cat -n fstab | sed -n -e '6p' -e '2p'  #显示第2行和第6行

 cat -n fstab | sed -n -e  '2p;6p'

 cat -n fstab | sed -n '2p;6p'


 cat -n fstab | sed -ne '2!p;61!p' | uniq -d   #不显示第2行和第6行


@@用脚本实现自动创建指定用户和密码

 vim userfile

############



 vim passfile

#############



 vim user_create.sh

################


 sh user_create.sh userfile passfile


 id user1


 su - user1

 su - user2

(2) 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'                  #删除第二行和第六行


实验:

cat fstab


sed '/^#/d'  fstab


sed '/0$/d'  fstab


cat -n fstab | sed '1,4d'


cat -n fstab | sed -e '2d;6d'

 

(3) a 模式操作:(添加,默认添在最后边)

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

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


实验:

 vim westos

######

westos

 sed '/hello/aworld'  westos                             #在westos中的hello后添加world

 sed '/hello/aworld\nhappy' westos                 # \n 表示换行

 sed '/westos/a\world' westos

 sed 's/westos/hello world/g' westos  


(4) i 模式:(插入,可插到任意位置)

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

例如:

 sed '/^hello/i\world' westos

 

(5) c 模式:(替换)

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

实验:

 sed '/hello/chello world' westos

 sed '/hello/chello\nworld' westos


(6) w 模式操作:(写入)

sed '/^UUID/w\westos'   fstab    

sed -n '/^UUID/w\westos' fstab

sed '/^UUID/='  fsatb       #显示fsatb文件中以UUID开头所在的行号

sed '6r westos'  fstab

实验:

 sed -n '/bash$/p' passwd > file  #把passwd中以bash结尾的行输入到file中(先处理前面的,之后再执行)

 cat file


 sed -n '/bash$/wfile1' passwd    #把passwd中以bash结尾的行输入到file1中(边处理边执行)

 cat file1


sed '/hello/=;wfile' westos       #把westos中的hello写入到file中,并显示行号


(7)sed的其他用法: 

sed -n '/^UUID/='  fstab  #显示fstab中以UUID开头的行号

sed -n -e  '/^UUID/p' -e '/^UUID/=' fstab #显示fstab中以UUID开头的这一行内容并且输出它的行号(只显示符合条件的) -e 用来连接两个条件

sed -e '/^UUID/p' -e '/^UUID/=' fstab     #(显示全文)

sed 'G'  data          #每行加空行显示data中内容

sed '$!G' data         #每行加空行但最后一行不加空行显示

sed '=' data | sed 'N;s^n//'  #N表示每行多加一个换行符

sed -n '$p' data       #显示文件的最后一行

sed -f rulesfile file  #按照rulesfile的要求显示file但不更改原文件

sed 's/^\//#/' fstab   #将全文的开头的/替换为#

实验:

 cat /etc/shells


 sed -n '/bash$/='  /etc/shells


 sed -n -e '/^\/usr/=' -e  '/^\/usr/p' /etc/shells


 sed  'G'  /etc/passwd


 vim file1

 cat  file1


 sed 'G' file1


 sed '$!G' file1


 sed -e '/^\/usr/=' -e  '/^\/usr/p' /etc/shells


 vim file1

 cat file1


 sed 's/westos/passwd/g' file1


 sed '1,3s/westos/passwd/g' file1


 cat file1


 sed -e '/haha/,/root/s/westos/passwd/g;s/hello/lee/g' file1


 vim file2

#################

sed 's/westos/passwd/g' file1

sed -f file2 file1       #不更改原文件

cat file1


sed -f file2 -i file1    #-i表示更改原文件

cat file1

                 

@@安装apache并自行设定端口号

 vim install_apache.sh

####################


 sh install_apache.sh 8080        #将apache端口号改为8080


 netstat -antlupe | grep 8080   #查看看8080端口


 sh install_apache.sh 80          #将apache端口号改回80

 netstat -antlupe | grep 80


3. awk 报告生成器

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

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

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

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

实验:

 vim passwd

 cat  passwd


 awk -F ":" '{print $1}' passwd                                   #-F 指定分隔符,以:为分隔符,输出第一列


 awk -F ":" 'BEGIN{print "NAME"}{print $1}' passwd             #BEGIN 表示命令执行之前做的操作   


 awk -F ":" 'BEGIN{print "NAME"}{print $1}END{print "END"}' passwd   #END 表示命令执行之后做的操作


 awk -F ":" 'BEGIN{print "NAME"}{print NR;print}END{print "END"}' passwd

#NR 表示添加行号


 awk -F ":" '{print NR,$0}' passwd           #添加行号 且不换行

 

awk '/bash$/{print}' passwd                  #显示以bash结尾的所有行

 awk -F ":" '/bash$/{print $1}' passwd    #显示以bash结尾的第一列


                                  

 awk '/^ro/{print}' passwd                #以ro开头


 awk '/^[a-d]/{print}' passwd           #以a到d中任意字符开头

 awk '/^[^a-d]/{print}' passwd         #不以a-d开头


 awk '/^a|linux$/{print}' passwd      ##以a开头 或者 以linux结尾

 awk '/^a/||/linux$/{print}' passwd


 awk '/^a/&&/linux$/{print}' passwd       #以a开头 并且 以linux结尾


@@显示可以登陆系统的用户的个数

 awk -F ":" 'BEGIN{n=0}/bash$/{n++}END{print n}' /etc/passwd

 


@@统计文件的行数

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


@@显示系统可以登陆但家目录不在/home下的用户名称/个数

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

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


 useradd -d /mnt/home/ westos

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

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


@@只显示eth0的ip

 ifconfig eth0 | awk '/inet/{print}'                       #显示含有inet的一行    

 ifconfig eth0 | awk '/inet\>/{print}'                   #\> 表示向后做任何拓展

 ifconfig eth0 | awk '/inet\>/{print $2}'               #$2表示第二列 \>表示不做拓展


猜你喜欢

转载自blog.csdn.net/love_sunshine_999/article/details/80849896