【shell脚本2】文本处理三剑客—grep、sed、awk

一.grep

grep简易搜索
grep -E = egrep高级搜索

1、简介

grep命令是一个Linux文本处理工具,它与egrep命令属于同一系列,这些命令都是用于对文件和文本执行重复搜索任务的工具。我们可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。grep是全局搜索正则表达式并打印出匹配的行,其抓取数据是贪婪模式,即不会漏掉过滤内容,但准确性会相对降低。

2、grep 格式

grep匹配条件 处理文件解释
greproot passwd过滤root关键字
grep-i root passwd省略大小写
grep -E "\<root"passwd root字符之前不能有字符
grep -E "root\>"passwd root字符之后不能有字符
grep-数字显示过滤行以及上面几行和下面几行
grep-n显示匹配的行所在行号
grep-A显示过滤行以及下面几行
grep-B显示过滤行以及上面几行
grep-v反向过滤
 grep -i root /etc/passwd
 grep -E "\<root" /etc/passwd
 grep -E "root\>" /etc/passwd
 grep -2 "root\>" /etc/passwd
 grep -n root /etc/passwd
 grep -A 3 root /etc/passwd
 grep -B 3 root /etc/passwd
 grep root /etc/passwd -v

3、grep字符数量匹配规则

^westos以westos开有
westos$以westos结尾
w…sw开头s结尾中间4个任意字符
…ss结尾前面5个任意字符
*字符出现任意
?0到1次
+1次到任意次
{n}n此
{m,n}m到n次
{0,n}0-n次
{,n}0-n次
{m,}最少m次
(lee){2}lee字符串出现2次

在这里插入图片描述

  grep c...k
  grep c...k test
  grep c.*k test                         表示.的个数任意
  grep -E c.?k test                	     表示.的个数为0到1个
  grep -E c.{4}k test
  grep -E 'c.{4}k' test
  grep -E 'c.{1,4}k' test                表示.的个数为1-4个
  grep -E 'c.+k' test                    表示.的个数为无数个

练习题:找出/etc/passwd里面root不在句首和句末位置的行

利用反过滤

grep root /etc/passwd | grep -E "^root|root$" -v      |表示并列的意思

在这里插入图片描述

练习题:找出可以用su切换的用户

在这里插入图片描述
建立脚本

vim su.sh
grep -E "/bin/bash|/bin/sh$" /etc/passwd |cut  -d : -f 1 

在这里插入图片描述

二、sed

命令格式:

sed参数 命令处理对象
sed参数 处理对象-f 处理规则文件

1)p #显示

sed -n 5p westos显示第五行
sed -n 3,5p westos显示3到5行
sed -ne ‘3p;5p’ westos显示3和5行
sed -ne 1,5p westos1-5行
sed -ne ‘5,$p’ westos5到最后以行
sed -n ‘/^#/p’ fstab显示以#开头的行
  sed -n 5p westos 
  sed -n 3,5p westos 
  sed -ne '3p;5p' westos 
  sed -ne '3,5p' westos 
  sed -ne '5,$p' westos 
  sed -ne '/^#/p' /etc/samba/smb.conf

2)d #删除

sed 5d westos##删除第五行
sed ‘/^#/d’ westos把#开头的行删除
sed ‘/^UUID/!d’ westos除了UUID以外的行都删除

在这里插入图片描述

  sed '/^#/d' westos                  删除以#开头的行
  sed '/kkk/d' westos             
  sed '/KKK/d' westos 
  sed '/KKK/!d' westos 
  sed '1d;3d' westos                 删除以1,3两行

3) a #某行下添加

sed '$a hello world' westos最后一行下添加hello
sed '$a hello\nworld' westos最后一行下添加hello,换行添加world
sed '/^#/a hello world' westos最后一行下添加hello world

在这里插入图片描述

4) i #某行上插入

sed ‘5ihello westos’ westos在第5行上插入hello westos

在这里插入图片描述

5) c #替换

sed ‘/^#/c hello world’ westos以*开头的行换为westos
sed ‘5c hello world’ westos把第5行换为hello westos

在这里插入图片描述

6)w #写入另一个文件

sed ‘/^UUID/w westofile’ westos把westos中UUID开头的行写入westosfile中

在这里插入图片描述

7)r #整合

sed ‘5r haha’ westos把文件haha插入到westos的第5行
sed ‘5r haha’ -i westos把文件haha插入到westos的第5行,并保存westos

8)sed #字符替换

sed ‘s/ : /###/g’ westos将所有的:换位###
sed ‘s/ : /###/’ westos将所有行第一次出现:的地方换为###
sed ‘1,5s/ : /###/g’ westos将1到5行所有出现的:换为###
sed ‘1s/ : /###/g’ westos将第1行所有出现的:换为###
sed ‘1s/ : /###/g;5s/ : /###/g’ westos将1和第5行出现的:换为###
sed ‘/lp/,/shutdown/s/ : /###/g’ westos将lp和shutdown之间的:换为###
sed 's/\//####/g' westos将全文的\替换为####(用\对/进行特别声明)
sed ‘s@/@####@g’ westos将/转换为###
sed ‘s@/@####@g’ -i westos把sed处理的内容保存到westos文件中

在这里插入图片描述

练习题:给每一行加行号且不换行

在这里插入图片描述
1、加‘=’发现没有换行

 sed '=' westos  

在这里插入图片描述
2、通过加N表示提前读取下一行,将\n转换为空格。

sed '=' westos | sed ' N;s/\n/ /g' 

在这里插入图片描述
3、加 -i 保存到原文件

sed '=' westos | sed ' N;s/\n/ /g' -i westos 

练习题:编写脚本,给http修改端口

此脚本输入数字则http改为此端口

vim jiaoben.sh


[ -z $1 ] && {
        echo -e '\033[31mERRO:Please input port number following script !!\033[0m'   判断是否存在
        exit
}
netstat -antlupe | grep $1 > /dev/null && {
        echo -e \033[032mERROR:The port is busy !!\033                               判断端口是否占用
        exit
}
sed "/^Listen/cListen $1" -i /etc/httpd/conf/httpd.conf                              替换端口                   
systemctl restart httpd                                                              重启服务
//

3、awk

1、基本简介

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

2、awk的基本格式

awk -F 分隔符 ‘BEGIN{}{}END{} FILENAME’

NR                         行数
NF                         列数
FILENAME                   文件名称本身
westos                     westos变量值
“westos”                   westos字符串
/bash$/                    条件
/条件1|条件2/               条件1或者条件2
`/条件1/&&/条件2/`          条件1或者条件2
`!/条件1/&&/条件2/`         否定条件1,满足条件2的

3、常用练习

1、使用awk命令-F指定以:为分隔符截取显示test文件的第一列
在这里插入图片描述

2、使用awk命令,首先输出显示westos,接着-F指定以:为分隔符截取显示passwd文件的第一列,最后输出显示end
在这里插入图片描述
3、使用awk命令统计test文件行数:给变量N赋初值为0,awk每读取一行文件内容变量N就进行一次自加操作,最后输出变量N的值即为passwd文件的行数
在这里插入图片描述
4、使用awk命令以:为分隔符截取显示passwd文件中以bash结尾的行的第一列;
在这里插入图片描述

5、使用awk命令以:为分隔符截取显示passwd文件中以bash结尾且含有root关键字的行的第一列;
在这里插入图片描述

6、使用awk命令以:为分隔符截取显示passwd文件中以bash结尾且不含有root关键字(!表示不含有)的行的第一列;
在这里插入图片描述

7、使用awk命令以:为分隔符截取显示passwd文件中以bash结尾或含有root关键字的行的第一列
在这里插入图片描述

8、使用awk命令以:为分隔符截取第七列以bash结尾的行的第一列($7~表示指定第七列);使用awk命令以:为分隔符截取第七列不以bash结尾的行的第一列
在这里插入图片描述

练习题1:统计内存的使用量

ps -ax -o %mem|sed 1d|awk 'BEGIN {N=0} {N=N+$1} END{print N}' ##先去除第一行无用的字符,再利用N=N+$1

在这里插入图片描述

练习题2:统计在系统中能su切换的用户并且家目录不在/home下的用户数量

在这里插入图片描述

awk -F : '$6 BGEIN{N=0}!~/\/home/&&/bash$|sh$/{N++}END{print N}' /etc/passwd
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值