Shell中常用的文本处理工具(grep、sed、awk)

1.grep(搜索工具)

grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。

egrep和fgrep都是grep的扩展,grep grep -E = egrep
注意:在某些机器上,要使用 -E参数才能够进行 逻辑匹配

下列规则也应用于 egrep 命令:

  • 一个正则表达式后面带一个 + (加号)会匹配一个或多个的正则表达式。
  • 一个正则表达式后面带一个 ? (问号)会匹配零个或一个该正则表达式。
  • 由 | (竖线)或者换行符隔开的多个正则表达式会匹配与任何一个正则表达式所匹配的字符串。
  • 一个正则表达式可以被包括在“()”(括弧)中进行分组。
    换行符将不会被正则表达式匹配。
    运算符的优先顺序是 [, ], *, ?, +, 合并, | 和换行符

1.1 grep的格式

grep匹配条件需要处理的文件
grep root passwd过滤root关键字
grep ^root passwd以root开头
|     grep root$ 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 | 反向过滤

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


1.2 grep字符数量匹配规则

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

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


1.3 grep的练习脚本

请显示系统中能被su命令切换的用户名称
方法一:(有漏洞)

 #!/bin/bash
grep "/bin/bash" /etc/passwd | cut -d : -f 1

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

在这里插入图片描述


方法二:
在这里插入图片描述

#!/bin/bash
grep -E "bash$|sh$|tcsh$|csh$" /etc/passwd |cut -d : -f 1

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


2.sed

2.1 sed命令格式

sed全称是:Stream EDitor
sed 命令是将需要处理的内容放入模式空间,对模式空间的内容进行逐行处理。
注意:在使用sed命令使常用-n 参数不显示模式空间。

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

在这里插入图片描述


2.2 sed命令对字符的处理

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显示以#开头的行

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


2. d——删除

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

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


3.a——添加

sed -e ‘$a hello world’ fstab在最后一行添加hello world
sed -e ‘$a hello\nworld’ fstab在最后一行添加hello 换行添加world
sed -e ‘/^#/a hello world’ fstab

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


4.c——替换

sed -e ‘/^#/c hello world’ fstab以#开头的行替换为hello world
sed ‘5chello world’ westos替换第5行为 hello world

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

5.w ##把符合的行写到指定文件中

sed ‘/^UUID/w newfile’ fstab把fstab中UUID开头的行写入newfile中

在这里插入图片描述


6.i——插入

sed ‘5ihello hello’ westos在第五行上面插入
sed ‘5ahello hello’ westos在第五行下面插入

在这里插入图片描述


7.r——整合文件

sed '5r haha' westos
在这里插入图片描述


2.3 sed 字符替换

sed  ‘s/ : /#/g’   westos全文的 :替换为#
sed  ‘1s/ : /#/g’  westos全文第一行的:替换成#
sed   ‘s/ : /#/’   westos全文第一列的:替换为#
sed  ‘1,5s/ : /#/g’  westos全文前5行的:替换为#
sed  ‘1s/ : /#/g;5s/ : /#g’  westos全文第1行和第5行的:替换成#
sed  ‘/lp/,/shutdown/s/ : /#/g’  westos全文字符lp到字符shutdown行列的:替换成#
sed  ‘s/ \ //####/g’  westos全文的 \替换为#
sed  ‘s@/@####@g’  westos全文的 \替换为#

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


2.4 把sed处理的内容保存到文件中

sed 's@/@####@g' -i passwd
在这里插入图片描述


2.5 sed练习及脚本

Apache_port.sh 此脚本后介入数字 http的端口就改为此数字 假设selinux为关闭状态
方法一:(有漏洞,行数查看不准确)

#!/bin/bash
[ -z "$1" ] && {
        echo "Error:no port.please input the port number for Apache!"
        exit
}

sed   "45cListen $1"  -i /etc/httpd/conf/httpd.conf

firewall-cmd --permanent --add-port=$1/tcp &>/dev/null
firewall-cmd --reload &>/dev/null
systemctl restart httpd

echo Now the Apache port number has changed to $1 .

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


方法二:

!/bin/bash
[ -z "$1" ] && {
        echo "Error:no port.please input the port number for Apache!"
        exit
}

[ -z "`netstat -antlupe | grep :$1`" ] || {
        echo "Error:$1 is used by system proto!"
        exit
}

[ -e "/etc/httpd/conf/httpd.conf" ] || {
        yum install httpd.x86_64 -y &>/dev/null || {
                  echo "Error:apache not installed and yum repo is not available"
                  exit
        }
}

sed   "/^Listen/c Listen $1"  -i /etc/httpd/conf/httpd.conf

firewall-cmd --permanent --add-port=$1/tcp &>/dev/null
firewall-cmd --reload &>/dev/null
systemctl restart httpd &>/dev/null && {
        echo Now the Apache port number has changed to $1 .
} || {
        echo "Error: can't up httpd service!See "journalctl -xe" for details."
}

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


3.awk

AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。
只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。
awk也支持用逻辑运算符:!(非)、&&;(与)、||(或)和括号()进行多重判断。

3.1 awk格式

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

注意:不加-F的时候默认分隔符为空格
在这里插入图片描述


3.2 awk的内置变量

NR已经读出的记录数(行数)
NF当前记录中的字段个数(列数)
FILENAME当前正在处理的文件名,该变量不能在BEGIN块中使用。
{print hello}hello变量值
{print “hello”}hello字符串
$0 所有的列$1第一列 ($2 #第二列 ;$3 第三列…

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


3.2 awk的运算

awk支持多种运算,这些运算与C语言提供的基本相同:如+、-、*、/、%等等,同时,awk也支持C语言中类似++、–、+=、-=、=+、=-之类的功能。

/bash$/条件
/条件1条件2/
/条件1/II/条件2/条件1或者条件2
/条件1/&&/条件2/条件1并且条件2

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


3.3 awk的练习

统计在系统中能su切换的并且用户加目录不在/home下的用户数量
在rhel8中
在这里插入图片描述

#!/bin/bash
awk -F : '$6!~/home/&&/bash$|sh$/{print}' /etc/passwd | wc -l

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


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

#!/bin/bash
awk -F : 'BEGIN{N=0}$6!~/home/&&/bash$|sh$|tsh$|csh$/{print $1;N++}END{print N}' /etc/passwd

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值