目录
一、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的查找
- p 对符合条件的内容进行打印,不会修改文件内容
(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