shell-文本处理(grep,sed,awk)

【1】grep

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

grep  ##命令是一种强大的文体搜索工具,根据用户指定的“模式”,
      ##对目标文本进行匹配检查,打印匹配到的行,由正则表达式
      ##或者字符及基本文字字符所编写的过滤条件

grep 的格式

 grep   匹配条件    处理文件
例如:
 grep    root    passwd     ##有root即可
 grep   ^root    passwd    ##以root开头
 grep    root$   passwd    ##以root结尾
 grep -i root    passwd    ##忽略大小写
 grep -E "root|ROOT" passwd   ##-E:多个匹配,root或者ROOT

在这里插入图片描述

将字符显示在中间

 grep -Ei "^root|ROOT$" passwd   ##以root开头,且以root结尾
 ##除了以root开头,ROOT结尾的root   (-v 除了)
 grep -Ei "^root|ROOT$" passwd -v | grep root
 test:root:test

  grep ROOT passwd -n2   ##显示ROOT的上两行和下两行
  grep ROOT passwd -A1   ##显示ROOT及ROOT的下一行
  grep ROOT passwd -B1   ##显示ROOT及ROOT的上一行
  grep ROOT passwd -1    ##显示ROOT的上下行个一行

在这里插入图片描述
在这里插入图片描述
grep 中的正则表达式

 ^westos
 westos$ 
 'w....s' 
 'w.....' 
 '.....s'   

在这里插入图片描述
grep 中字符的匹配次数设定

  *    字符出现 [0- 任意次 ]
  \?    字符出现 [0-1 次 ]
  \+    字符出现 [1- 任意次 ]
 \{n}   字符出现 [n 次 ]
\{m,n}  字符出现 [ 最少出现 m 次,最多出现 n 次 ]
\{0,n}  字符出现 [0-n 次 ]
\{m,}   字符出现 [ 至少 m 次 ]
\(xy)\{n\}xy  关键字出现 [n 次 ]
.* 关键字之间匹配任意字符

在这里插入图片描述
举例:

  grep  y$ westos  ## y 结尾
  grep 'xo'  westos  ##含有xo
  grep -E "\<root" westos       ##以root开头
  grep -E x{2}y westos          ##x两个,这里并不是以y结尾,而是x后面紧跟着y,不能误解
  grep -E "\<x{2}y" westos      ##以开头的连续2个x 
  grep -E "\<x{1,2}y" westos    ##开头的1--2个x
  grep -E "\<x{0,2}y" westos    ##开头的0--2个x 
  grep -E "\<x{2,}y" westos     ##至少2个x开头,紧跟y
  grep -E "\<x{2,}y\>" westos   ##至少2个x开头,y结尾
  grep -E "\<(xy){,2}\>" westos ##xy为一个整体,最多2个
  grep -E "\<x{2}y{1}\>" westos ##2个x开头,1个y结尾
  grep -E "\<x{1,}y{1}\>" westos ##至少1个x开头,且1个y结尾

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 grep 正则表达式与扩展正则表达式
 正规的 grep 不支持扩展的正则表达式子 , 竖线是用于表示”
 或”的扩展正则表达式元字符 , 正规的 grep 无法识别
 加上反斜杠 , 这个字符就被翻译成扩展正则表达式 , 就像 egrp
 和 grep -E 一样

2. sed 行编辑器

 stream editor
用来操作纯 ASCII 码的文本 处理时 , 把当 前处理的行存储在临时缓冲区中 , 称为“模式空 间” (pattern space) 可以指定仅仅处理哪些行 sed 符合模式条件的处理 不符合条件的不予处理
处理完成之后把缓冲区的内容送往屏幕
接着处理下一行 , 这样不断重复 , 直到文件末尾Sed 命令格式

调用 sed 命令有两种形式:

  sed [options] 'command' file(s) 
  sed [options] -f scriptfile file(s)

sed 对字符的处理

p 显示 
d 删除  
a 添加  
c 替换  
w 写入  
i 插入

cp /etc/fstab /mnt/fstab
vim /mnt/fstab

在这里插入图片描述
在这里插入图片描述
p模式操作

 sed -n '/\:/p' fstab  ##显示:
 sed -n '/#/p' fstab  ##显示有#的一行,(注意,并不是以#开头的行)
 sed -n '/U/!p' fstab ##不显示有U的一行
 sed -n '3p' fstab  ##显示第三行
 sed -n '2,3p' fstab  ##显示第2行和第3行
 sed -n '1p;3p' fstab ##显示1到3行
 sed -n '1,3!p' fstab  ##不显示1到3行
 sed -n '/UUID$/p'fstab ##显示以UUID结尾的行
 sed -n '/^UUID/p' fstab  ##显示以UUID开头的行
 sed -n '/1$/p' fstab   ##显示以1结尾的行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

d 模式操作

 sed '/^UUID/d' /etc/fstab   ##删除uuid开头
 sed '/^#/d' /etc/fstab     ##删除以#开头
 sed '/4$/d'/etc/fstab      ##删除以4结尾
 sed '1,4d'/etc/fstab       ##删除1至4行
 sed '1d;4d'/etc/fstab      ##删除1行和4行
 sed  '/^UUID/!d' /etc/fstab  ##除UUID开头外,其余都删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

a 模式操作

 sed '/^UUID/ahello'  /etc/fstab
 sed '/^UUID/ahello\nwestos' /etc/fstab  
 
 1:将hello,换行westos添加到UUID开头的前面:
     sed '/^UUID/ihello\nwestos /etc/fstab    i  插入模式操作
 2:以UUID开头的一行替换为hello,并换行westos
     sed ‘/^UUID/chello\nwestos /etc/fstab    c 替换模式操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
c 替换
在这里插入图片描述
w 模式操作

 sed -n  '/^#/w /mnt/westosfile' /etc/fstab  ##将fstab的内容写入文件westosfile中且不显示操作域
 sed   '/^#/w /mnt/westosfile' /etc/fstab    ## 显示操作域
 sed '4r /mnt/file' /etc/fstab   ##将file文件的内容添加到fstab文件的第4行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
sed 的其他用法

sed -n '/^UUID/=' fstab  ##只显示操作域,即只显示以UUID开头的行号
sed  '/^UUID/=' fstab    ## 显示全文且多显示了UUID的这一行
sed -n -e '/^UUID/p' -e '/^UUID/=' fstab   ##只显示以UUID开头的一行及行号
sed -e '/^UUID/p;/^UUID/='fstab   ##显示全文且显示以UUID开头的一行及行号
sed  's/\// $$ /g' fstab  ##将 / 替换为 $$ 
sed  's/^/\/%/' y   ##在每一行的开头添加 /%
sed 's@/@#####@g'  /mnt/fstab  ## 将 / 替换为#####
sed 's/\//%/'   fstab   ##将首次出现/的替换为%
sed 's/\//%/g/' fstab  ##将全文的\替换为%,可以以图片直接看区别
sed 'G' fstab   ##添加空行
sed '$!G' fstab  ##添加空行除了最后一行
sed  '=' passwd  ##在每一行前添加行号
sed '=' passwd  | sed 'N; s/\n/ /' 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

awk 报告生成器

awk 处理机制:awk 会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作,在命令格式上分别体现如下:
BEGIN{}:读入第一行文本之前执行,一般用来初始化操作
{}:逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令快
END{}:处理完最后一行文本之后执行,一般用来输出处理结果

awk 基本用法

linux 上面默认使用 gawk
awk '{print FILENAME}' passwd
awk '{print 第"NR"行,有"NF"列}'
awk '{print NR}' passwd   ##打印出passwd的行数
awk '{print NF}' passwd   ##打印出passwd的列数
awk -F: '{print NF}' passwd   ##以:为分隔符,打印出每一行的列数
awk  -F : 'BEGIN{print "NAME"}'   ##以:为分隔符,开头打印出NAME
awk -F : 'BEGIN{print "NAME"}{print NR}' passwd  ##开头打印NAME,并打印每一行的列数
awk -F : 'BEGIN{print "NAME"}{print NR}END{print "END"}'  passwd  ##开头打印NAME,结尾打印END,并打印每一行的列数
awk -F : 'BEGIN{print "NAME"}{print $1}END{print "END"}' passwd  ##打印passwd的第一列
awk -F : 'BEGIN{print "NAME"}{print $1}{print NR}END{print "END"}' passwd  ##打印passwd的第一列及其行数
awk -F : 'BEGIN{print "NAME"}{print $1,$7}END{print "END"}' passwd  ##打印passwd的第一列和第七列
awk -F : 'BEGIN{print "NAME"}{print $0}END{print "END"}' passwd  ##打印passwd的第每一列
awk -F : 'BEGIN{print "NAME"}{print $1=""}END{print "END"}' passwd  ##打印空列 
awk -F : 'BEGIN{print "NAME"}{print $1="hello"}END{print "END"}' passwd  ##打印hello 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

awk 的基本用法

awk '/bash$/'  ##以bash结尾
awk -F : '/bash$/{print}' /etc/ passwd  ##打印以bash结尾
awk -F : '!/bash$/{print}' /etc/ passwd  ##除bash结尾以外,打印其他
awk '!/bash$/&&!/nologin{print}' /etc/passwd   ##不以bash结尾,且不打印nologin,
awk '!/bash$/&&!/nologin${print}' /etc/passwd   ##不打印以bash和nologin结尾
抓取可登陆系统的三种方法(以bash结尾的)
(1) awk -F : '/bash$/{print $1}'    /etc/passwd     
(2) awk -F : '/bash$/||/sh$/{print $1}' /etc/passwd 
(3)awk -F : '/bash$/||/sh$/||/tcsh$/||/csh$/{print $1}' /etc/passwd
awk 'BEGIN{n=0}/bash$/{n++}END{print n}' /etc/passwd  ##打印以bash结尾的个数
awk 'BEGIN{a=34;print a+12}'   ##打印出a+12的值=46
awk  '/^r/{print}' /etc/passwd   ##以r开头
awk  '/^s/{print}' /etc/passwd  ##以s开头
awk  '/^r/{print}' /etc/passwd   ##以a-c范围内字母开头的一行
awk -F : '$7~/\<sbin/{print}' /etc/passwd  ##打印出所有第七列含有sbin的一行
awk -F : '$7!~/\<sbin/{print}' /etc/passwd  ##打印出所有第七列 没有sbin的一行
awk -F : '$6~/\<adm/{print}' /etc/passwd  ##打印出所有第6列含有adm的一行
只抓取root:三种方法(方法有很多)
awk -F : 'BEGIN{n=0}/bash$/&&$6!~/^\/home/{print}END{print n}' /etc/passwd  ##打印bash结尾,以及个数且第6列不包含home的内容,
awk -F : 'BEGIN{n=0}/bash$/&&$6!~/^\/home/{print}END{print n;n++}' /etc/passwd
awk -F : 'BEGIN{n=0}/bash$/&&$6!~/^\/home/{print;n++}END{print n}' /etc/passwd

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
练习
抓取etho中的ip:

ifconfig eth0  | awk '/inet\>/{print $2}'  ##以inet为开头的第二列

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值