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

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

 cd /mnt

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

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

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

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

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

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

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

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

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

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

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


@@显示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

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

 grep 'r.t' test

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

 grep 'rt' test

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

 grep 'r..t' test

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

 grep '\<r..t' test

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

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

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

 

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

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

   grep 'r*t' test             #过滤r出现的任意次数

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

   grep  'r\**t' test        #过滤r,t之间有0个字符

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

   grep  'ro*t' test         #过滤r和t之间o出现的任意次数

   grep  -E 'ro*t' test     #过滤r和t之间o出现的任意次数

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

   grep  -E 'ro?t' test      #过滤r和t之间o出现的0和1次

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

   grep  -E 'ro{1,}t' test   #过滤r和t之间o出现的1以上的次数

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

   grep  -E 'ro{,3}t' test   #过滤r和t之间o出现的3以下的次数

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

 

@@只显示ip的这一行

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

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

2)ifconfig eth0 | grep -E "inet "

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

 

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

 cat /etc/shells

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

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

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

 

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

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

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

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

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


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


 vim show_loginuser.sh

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

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

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

 

 chmod +x show_loginuser.sh

 /mnt/show_loginuser.sh

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

 

 vim show_loginuser.sh

###########

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

 

 sh show_loginuser.sh

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

 useradd -s /bin/tcsh haha

 su - haha

 logout

 sh show_loginuser.sh

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

 useradd -s /bin/csh hai

 su - hai

 ps

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

 logout

 /mnt/show_loginuser.sh

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

 


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

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

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

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

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

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

 cat -n fstab                          # -n 添加行号

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

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

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

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

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

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

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

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

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

 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'

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

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

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

 

 

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

 vim userfile

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

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


 vim passfile

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

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


 vim user_create.sh

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

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

 

 sh user_create.sh userfile passfile

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

 id user1

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

 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

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

sed '/^#/d'  fstab

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

sed '/0$/d'  fstab

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

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

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

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

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

 

(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  

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

 

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

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

例如:

 sed '/^hello/i\world' westos

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

 

(5) c 模式:(替换)

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

 

实验:

 sed '/hello/chello world' westos

 sed '/hello/chello\nworld' westos

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

 

(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

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

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

 cat file1

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

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

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

 

(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

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

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

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

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

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

 sed  'G'  /etc/passwd


 vim file1

 cat  file1

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

 sed 'G' file1

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

 sed '$!G' file1

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

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

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

 vim file1

 cat file1

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

 sed 's/westos/passwd/g' file1

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

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

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

 cat file1


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

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

 vim file2

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

sed 's/westos/passwd/g' file1

 

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

cat file1

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

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

cat file1

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

 

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

 vim install_apache.sh

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

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

 

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

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

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

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

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

 netstat -antlupe | grep 80

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

 

 

3. awk 报告生成器

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

 

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

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

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

 

实验:

 vim passwd

 cat  passwd

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

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

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

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

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

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

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

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

#NR 表示添加行号

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

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

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

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

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

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

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

                                  

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

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

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

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

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

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

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

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

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

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

 

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

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

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


@@统计文件的行数

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

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

 

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

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

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

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

 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

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

 

@@只显示eth0的ip

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

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

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

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