day20-sed-find
1.每日复盘与今日内容
1.1复盘
- 基础正则扩展正则:^ $ ^$ .* [] | +
- grep/egrep命令过滤
- awk取行取列
1.2今日内容
- sed
- find
2.sed
- 增删改查
- 核心:查找,替换
sed命令选项 | 作用 |
---|---|
-n | 取消默认输出--不加上sed把文件内容全输出 |
-r | 支持扩展正则 |
命令 | 选项 | 具体处理指令 | 参数 |
---|---|---|---|
sed | -n | p(print)输出 | 文件 |
查找功能 | 1p 1,3p //p //,//p | 文件 | |
替换 | s###g替换 | 文件 | |
删除 | d--delete | 文件 |
2.根据行号范围取行
#2.范围取行,取3-5行
sed -n '3,5p'
3.过滤与正则
#3.过滤passwd文件中包含root的行或oldboy的行
sed -rn '/root|oldboy/p' /etc/passwd
4.范围与日志
- 获取一个范围的内容,比如2025-01-11日到2025-05-01范围的日志.
- 简易版本
#使用命令seq 20生成20行内容,过滤从包含2的行显示到包含9的行
seq 20 | sed -n '/2/,/9/p'
- 过滤日志中指定时间范围的日志
- 进入之前放入的access.log与secure文件
#access.log 过滤 11:05分日志到11:06分日志
#先检查是否存在:
grep '11:05:00' access.log |wc -l
grep '11:06:00' access.log |wc -l
然后过滤
sed -n '/11:05:00/,/11:06:00/p' access.log#secure日志过滤
#12号 12点12分00秒到13号15点15分00秒
grep '12 12:12:00' secure-20161219 | wc -l
grep '13 15:15:00' secure-20161219 | wc -l
然后过滤
sed -n '/12 12:12:00/,/13 15:15:00/p' secure-20161219 |wc -l
- 取出access.log日志中从开头一直到11:30范围日志,取出第一列,统计次数最多的前5
#使用sed
sed -n '1,/11:30:00/p' access.log |awk '{print $1}' | sort | uniq -c |sort -rnk1 |head -5#使用awk
awk 'NR==1,/11:30:00/' access.log |awk '{print $1}' | sort | uniq -c |sort -rnk1 |head -5#从11:02:00 -11:30:00
awk '/11:02:00/,/11:30:00/' access.log |awk '{print $1}'|sort|uniq -c |sort -rnk1|head -5
- 小结
1p,1,3p //p //,//p
2.2 改(替换)
- 可以修改文件内容.
sed 's###g'
#以下也可以,为了防止你真的要写入#
s###g
s@@@g
s///g
s替换 substitute
g整行替换 global
1.基础替换
#1.先进行替换,然后查看效果
sed 's#/sbin/nologin#/bin/bash#g' passwd###2.加上-i选项,修改文件内容,有些危险
sed -i 's#/sbin/nologin#/bin/bash#g' passwd
2.使用正则
给passwd每一行开头加上一个#
sed 's@^@#@g' passwd
3.小技巧:修改前备份
- 修改某个配置文件可以使用,如果修改多个文件实现tar打包备份即可.
sed '1,10s@^#@@g' passwd
sed -i.bak '1,10s@^#@@g' passwd
隐藏功能:反向引用(后向引用)
- 核心:通过正则把我们要处理的内容进行分组,最后在后面通过/数字方式调用。
- 最终目标
原始:
root:x:0:0:root:/root:/bin/bash
目标:
/bin/bash:x:0:0:root:/root:root原始:
22/Nov/2015:11:02:00 +0800
目标:
2015/Nov/22:11:02:00 +0800
- 格式
[root@devops-99-kylin /oldboy]# echo 123456
123456
[root@devops-99-kylin /oldboy]# echo 123456| sed -r 's#(.*)#<\1#g'
<123456
[root@devops-99-kylin /oldboy]# echo 123456| sed -r 's#(.*)#<\1>#g'
<123456>
- 调换位置
#把56和12位置互换,前两个#之间把内容分组,后两个#之间将组排序。
echo 123456 | sed -r 's#(..)(..)(..)#\3\2\1#g'
echo 123456 | sed -r 's#(..)(..)(..)#\3-\2-\1#g'
- 调换paswd第1列和最后1列内容,中间部分保持不变。
sed -r 's#(.*)(:x.*:)(.*)#\3\2\1#g' passwd
sed -r 's#(^.*)(:x.*:)(.*)$#\3\2\1#g' passwd
小结:
- 对行进行复杂加工处理,调换.
- 取列.
2.3 删除
- 按照行为单位进行的.
- 根据行号删除
sed '3d' re.txtseq 10 | sed '3,5d'
- 过滤与正则
sed -r '/^$|#/d' re.txt
2.4 增加
- 类似于追加.
- cia
a append 追加到指定行后
i insert 在指定行上面
c replace 把指定行替换
seq 10 | sed '5a lidao'
seq 10 | sed '5i lidao'
seq 10 | sed '5c lidao'
2.5 sed增删改查小结
排除/删除/etc/ssh/sshd_config文件中空行或注释行(不用真的删除)egrep/sed/awk分别实现.
#过滤(取行),三种方法起步。
egrep -v '^$|#' /etc/ssh/sshd_config
sed -r '/^$|#/d' /etc/ssh/sshd_config
awk '!/^$|#/' /etc/ssh/sshd_config#awk '!//' --输出不包含/内容/的行
sed -rn '/^$|#/!p' /etc/ssh/sshd_config
3.find
- 根据指定的目录找出想要的内容(文件,目录)
1️⃣根据文件名查找
2️⃣根据文件大小查找
3️⃣根据文件时间查找(删除日志使用)
- find与其他命令搭配使用
1️⃣find+tar
2️⃣find+rm
3️⃣find+cp
3.1 find各种找
find 目录 -type f -name "lidao.txt"
目录:1个或多个目录,不写默认是当前目录
-type f 类型 f--file 文件 d-directory 目录
-name 指定文件名
1.找出/etc/下以.conf结尾的文件
find /etc/ -type f -name '*.conf'
2.找出/etc/下大于100k的文件
-size #k小写,M,G
大于+100k
小于—100kfind /etc/ -type f -size +100k
3.找出/var/log/下面以.log结尾的文件7天之前的文件.
find /var/log/ -type f -mtime +7 -name '*.log'
4.查找文件不区分大小写
mkdir -p /oldboy/lidao/
cd /oldboy/lidao/
touch Lidao{01..10}.log
lidao{01..10}.log lIDao{01..10}.log
find -type f -name "lidao*.log"
find -type f -iname "lidao*.log"
5.全局查找文件
首先排除/sys/ /proc/目录,原因--内存目录
3.2 find与其他命令搭配使用
1.find+grep/rm/sed...
在/etc/下找出以.conf结尾的文件,找出这些文件中过滤包含root或oldboy的行
#1.方法1
find /etc/ -type f -name "*.conf" | xargs egrep --color 'root|oldboy'#2.方法2 find + ``或$()
egrep 'root|oldboy' `find -type f -name "*.conf"`
egrep 'root|oldboy' $(find -type f -name "*.conf")#3.方法三 find+ -exec
find /etc/ -type f -name "*.conf" -exec egrep --color 'root|oldboy' {} \;
2.find+tar
find找出来交给tar打包压缩./backup/etc-conf.tar.gz
#1.find+|xargs
find /etc/ -type f -name "*.conf" | xargs tar zcf /backup/etc-conf.tar.gz#查看压缩文件内容
tar tf /backup/etc-conf.tar.gz#2.find ``
tar zcf /backup/etc-conf.tar.gz `find /etc/ -type f -name "*.conf"`#3.find +exec
find /etc/ -type f -name "*.conf" -exec tar zcf /backup/etc-conf.tar.gz {} \;
3.find+cp/mv
find找出文件通过cp复制走
找出/var/log下以.log结尾的文件复制到/backup/目录
#1.方法find+ xargs
find /var/log/ -type f -name "*.log" | xargs cp -t /backup/logs/
#cp -t 是先显示目标目录再显示文件位置#2.cp
cp -t /backup `find /var/log/ -type f -name "*.log"`
cp `find /var/log/ -type f -name "*.log"` /backup#3.find+ exec
find /var/log/ -type f -name "*.log" -exec cp {} /backup/logs/ \;
3.3 find小结
- 找出各种文件.
- find与命令配合sed,grep,rm.
- 有些坑find+tar,find+cp/mv
4.总结
四剑客 | 共同点 | 区别与使用 |
---|---|---|
find | 无 | 查找文件,目录... |
grep/egrep | 过滤 | 仅仅过滤与查看 |
sed | 过滤 | 替换,删除 |
awk | 过滤 | 取列,计算 |