Shell编程6_grep和sed

目录

一、grep命令

二、sed(Stream EDitor)流编辑器

1、Sed的查找

2、Sed的增加

3、Sed的删除

4、Sed的修改和替换


一、grep命令

grep作为一款非常方便且强大的文本搜索工具,其能使用正则表达式搜索文本,并把匹配的行打印出来。

grep语法格式的两种形式:

1.grep [OPTION] [PATTERN] [FILE]

2.command | grep [OPTION] [PATTERN]

grep参数

  • -A:显示模式匹配后的几行
  • -B:显示模式匹配行的前几行
  • -C:显示模式匹配的前后各几行
  • -E:开启正则表达式,相当于使用命令 egrep
  • grep -w 用于字符串精确匹配
  • grep -e 显示文件中符合条件的字符
  • grep -v 排除输出查看过滤字段

相关示例:

—————————————————————————————————————

  • # 多文件中查询 leo

grep leo logs.log logs_back.log

  • # 查找即包含 leo 又包含 li 的行

grep leo logs.log | grep li

  • # 查找匹配 leo 或者匹配 li 的行

grep leo | li logs.log

  • # 显示匹配行前2行

grep leo logs.log -A2

  • # 显示匹配行后2行

grep leo logs.log -B2

  • # 显示匹配行前后2行

grep leo logs.log -C2

  • # 不区分大小写

grep -i leo logs.log

  • # 使用正则表达式

grep -e '[a-z]\{5\}' logs.log

  • # 查找不包含leo的行

grep -v leo logs.log

  • # 统计包含leo的行数

grep -c leo logs.log

  • # 遍历当前目录及所有子目录查找匹配leo的行

grep -r leo .

  • # 在当前目录及所有子目录查找所有java文件中查找leo

grep -r leo . --include "*.java"

  • # 查找并输出到指定文件

grep leo logs.log > result.log

  • # 查找以leo开头的行

grep ^leo logs.log

  • # 查找以leo结尾的行

grep leo$ logs.log

  • # 查找空行

grep ^$ logs.log

  • # 在/data/web目录下,递归所有扩展名为.jsp的文件,排除 .git,vendor,log 这三个目录,查找所有包含字符串'link_params'的文件及文件内容(不区分大小写),并展示相应行的上下5行内容,以及行号

grep -rni -C5 'link_params' --include '*.jsp' --exclude-dir={.git,vendor,log} /data/web 
grep -rni -C5 'link_params' --include={*.jsp,*.js,*.html,*.json,*.lock} --exclude-dir={.git,vendor,log} /data/web

———————————————————————————————————————

二、sed(Stream EDitor)流编辑器

Sed 相较于 grep/awk,其主要功能为对文件进行修改处理,可以对文件或标准输入数据流进行增删改查等操作,尤其适用于大文件或有规律的文件。

Sed的选项

-e:可以连接多条操作命令

// -e拼接多条执行命令
sed -n -e "s/aaa/bbb/g" -e "s/ccc/ddd/g" test.txt

使用静默模式打印文件内容

-n: 静默模式;利用这个参数仅显示 script 处理后的结果,不再默认显示模式空间中的内容,不使用-n会导致打印结果重复。

[root123@localhost /]$ sed -n '/python/p' demo_test.sh  // 匹配python 并'p'打印 
#!/bin/env bash
echo "hello ${ssh1}"
ssh2="hello ssh2"

sed -n -f edit.sed demo_test.sh // -f 从edit.sed文件中查找正则表达式

1、Sed的查找

  • 对符合条件的内容进行打印,不会修改文件内容
(1) sed -n "/^root/p" file          // 打印文件中以root开头的行
(2) sed -n "/^ftp/,/^mail/p" file   // 打印以ftp开头和以mail开头之间的内容
(3) sed -n "17p" file               // 打印file文件中的17行
(4) sed -n "10,20p" file            // 打印file文件中10-20行的内容
(5) sed -n "/^root/,10p" file       // 打印匹配到root开始的行到第10行结束
(6) sed -n "/hello/=" file          // 打印匹配到hello的行所在的行号  使用"="

2、Sed的增加

相关命令——操作

  • a  行后追加
  • i   行前追加
  • r  外部文件读入,行后追加
  • w 匹配行写入外部文件
// 行后追加——在匹配root的行后追加内容“this is add data”
(1) sed -i "/root/a this is add data" file  

// 追加文件内容——在test.txt中匹配到hello的行后追加demo.txt中的内容
(2) sed -i "/hello/r demo.txt" test.txt  

// 把匹配到的行添加到外部文件中——匹配到test中的内容写入到demo.txt中
// 如果demo.txt文件已存在,则覆盖内容,不存在会创建demo.txt
(3) sed -i "/hello/w demo.txt" test.txt     

3、Sed的删除

  • d  删除文件中符合条件的行
// 删除test.txt文件中1-2行的内容
(1) sed -i "1,2d" test.txt

// 根据正则表达式匹配内容进行删除
(2) sed -i "/pattern/d" test.txt           
(3) sed -i "/pattern1/,/pattern2/d" test.txt

4、Sed的修改和替换

  • s/old/new    将行内第一个old替换为new
  • s/old/new/g   将行内的全部old替换为new
  • s/old/new/ig  将行内old全部替换为new,忽略大小写
// 将test.txt中所有的HH都替换成KK
(1) sed -i "s/HH/KK/g" test.txt     

// 反向引用,查找th..k格式的字符串,在其后添加s; "&"保留查到的字符串
(2) sed -i "s/th..k/&s/g" test.txt
(3) sed -i "s/\(th..ks\)/\1P/g" test.txt  // 另一种替换方式跟"&"效果一样


// 对符合条件的行进行替换操作
(4) sed -i "/pattern/s/old/new/g" test.txt

使用"&""\1"区别:

"&"只能把一个字符串作为一个整体,而"\1"可以对字符串的部分进行截取。

如:sed -i "s/\(th\)...../\1inks/g" test.txt   其中括号和"1"需要使用"\"进行转义,把符合"th....."格式的字符串后5个替换为"inks"。

此修改中,需要把保留的部分用括号看括起来

// 替换字符串的部分
sed -i "s/\(th\)...../\1inks/g" test.txt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swadian2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值