20、find(文件查找)
- 格式
find pathname -options [-print -exec -ok …]
命令 | 说明 | 举例 |
---|---|---|
-name | 按照文件名查找文件。 | find . -name “1.txt” |
-perm | 按照文件权限来查找文件。 | find . -perm 660 |
-user | 按照文件属主来查找文件。 | |
-group | 按照文件所属的组来查找文件。 | |
-mtime -n +n | 按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内, +n表示文件更改时间距现在n天以前。 find命令还有-atime和-ctime 选项,但它们都和-m time选项。 | |
-atime | 访问时间 | |
-ctime | 创建时间 | |
-nogroup | 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。 | |
-nouser | 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。 | |
-newer file1 ! file2 | 查找更改时间比文件file1新但比文件file2旧的文件。 | |
-type | 查找某一类型的文件 b - 块设备文件。 d - 目录。 c - 字符设备文件。 p - 管道文件。 l - 符号链接文件。 f - 普通文件。 s - socket文件 | |
-size | 查找文件大小 | |
-exec |
#查找当前目录下名称为aa.sh的文件路径
find . -name "aa.sh"
find . -name "*.txt*"
#查找当前目录下3天之内被更改的文件
find . -mtime +3
find . -mtime -3
find . -atime -3
#当前目录下5天之内创建的文件
find . -ctime 5
#查找普通文件
find . -type f
#查找有哪些目录
find . -type d
find . -type p
find . -type l
#查找文件大小为7个字节的文件
find . -size 7c
1、exec
- 举例1
find . -name "*.txt" -exec gzip {} \;
说明:查找当前目录下的txt文件,并且将他打包成gzip文件
每找到一个文件,就会执行exec后面的命令
{}的作用是:将*.txt会替换到{}的位置
\;:标识当前语句的结束
- 举例2
find . -name “*.txt” -exec cp -r {} ./mvDir/div/ ;
查找当前文件下的txt文档,并且复制到指定的目录下
2、ok(确认是否操作)
find . -name "*.txt" -ok rm {} \;
说明:查找当前目录下的txt文件,确认是否删除,确认的话输入y否则删除n
跟-exec用法一样,但是每找到一个符合的文件执行前需要用户是否确认
21、xargs(将标准输入的参数整齐的拼凑在一行)
将标准输入的参数整齐的拼凑在一行
单独使用该命令没什么用,要配合其他命令来使用
docker ps -aq | xargs docker stop
docker ps -aq | xargs docker rm -f
- 说明:
1、将docker启动的所有容器id拼接起来,然后执行docker stop命令
2、然后再将所有的容器id拼接起来,执行docker rm -f的删除容器操作
移动文件目录
find . -name "*.sh" | xargs cp -r /shFold/
find . -name "*.sh" | xargs \cp -r /shFold \;
#将当前目录的所有sh文件,复制到shFold目录下
# 1、-I{}表示替换用的字符串
# 2、{}表示将查询到的sh文件放到{}里面 然后将{}里面的文件移动到shFold文件夹下
find . -name "*.sh" | xargs -I{} mv {} shFold/
# 将当前目录查询到的sh文件复制到上层目录
find . -name "*.sh" | xargs -I{} \cp -r {} ../
-I{} 指定一个替换字符串作为参数替换
22、sed(处理文本)
文本1 -> sed + 脚本 -> 文本2
编辑器的演变历史ed 编辑器 -> sed -> vim
sed option ‘script’ file1 file2 … sed 参数 ‘脚本(/pattern/action)’ 待处理文件
sed option -f scriptfile file1 file2 … sed 参数 –f ‘脚本文件’ 待处理文件
命令 | 说明 |
---|---|
p:print | 打印 |
a:append | 追加 |
i:insert | 插入 |
d:delete | 删除 |
s:substitution | 替换 |
#将 "在第二行之后插入内容"字符插入到第二行
sed '2i 在第二行之后插入内容' sed.txt
#将sources.list文件里面所有mirrors.ustc.edu.cn的代码替换成mirrors.aliyun.com 's 开始 /g结束 正则表达式
sed 's/mirrors\.ustc\.edu\.cn/mirrors\.aliyun\.com/g' /etc/apt/sources.list
#替换文本里面的html标签
sed 's/<.*>//g' sed.txt
sed 's/<[^>]*>//g' sed.txt
23、awk(文本处理)
awk ‘条件1 {动作 1} 条件 2 {动作 2} …’ 文件名
条件类型 | 条 件 | 说 明 |
---|---|---|
awk保留字 | BEGIN | 在 awk 程序一开始,尚未读取任何数据之前执行。BEGIN 后的动作只在程序开始时执行一次 |
awk保留字 | END | 在 awk 程序处理完所有数据,即将结束时执行?END 后的动作只在程序结束时执行一次 |
关系运算符 | > | 大于 |
< | 小于 | |
>= | 大于等于 | |
<= | 小于等于 | |
== | 等于。用于判断两个值是否相等。如果是给变童赋值,则使用"=” | |
!= | 不等于 | |
A~B | 判断字符串 A 中是否包含能匹配 B 表达式的子字符串 | |
A!~B | 判断字符串 A 中是否不包含能匹配 B 表达式的子字符串 | |
正则表达式 | /正则/ | 如果在“//”中可以写入字符,则也可以支持正则表达式 |
命令 | 说明 |
---|---|
NF | 字段个数,(读取的列数) |
NR | 记录数(行号),从1开始,新的文件延续上面的计数,新文件不从1开始 |
FNR | 读取文件的记录数(行号),从1开始,新的文件重新从1开始计数 |
FS | 输入字段分隔符,默认是空格 |
OFS | 输出字段分隔符 |
RS | 输入行分隔符,默认为换行符 |
ORS | 输出行分隔符,默认为换行符 |
1、准备数据
vim awk.txt
张三 100-kg 20-age 176-height
李四 98-kg 23-age 178-height
王五 70-kg 43-age 157-height
赵六 80-kg 63-age 130-height
王二 90-kg 12-age 140-height
谢哥 140-kg 65-age 180-height
#最常见的过滤那一列
xxx | awk '{print $2}'
#打印第一列的信息 $1表示第一列 $2标识第二列
awk '{print $1}' awk.txt
#匹配 将第二列带有-kg的打印出来
awk '{print $2}-kg' awk.txt
awk '/王/{print $1}' awk.txt
awk '/^王/{print $1}' awk.txt
#打印第二列和第四列
awk '{printf $2 "\t" $4 "\n"}' awk.txt
#查看磁盘占用情况(总共容量大小 可用大小 使用百分比)
df -h | awk '{print $2 "\t" $4 "\t" $5}'
#
top | awk '{print "\t PID=" $1 "\t cpu=" $8 "\t mem=" $9}'
2、docker中实际用例
springboot项目构建docker镜像需要
1、先停止之前启动的镜像,然后删除容器,
2、再删除镜像。
3、重新构建镜像
#查找前缀名称为tomcat的所有启动着的容器,返回第一列(即id的那一列)
containerTomcat=$(docker ps | grep "tomcat*" | awk '{print $1}')
#如果不为空
if [ -n "$containerTomcat" ]
then
docker stop $cid #停止该容器
docker rm -f $cid #删除该容器
else
echo "no such container"
fi
#查找前缀名称为tomcat的所有的容器,返回第一列(即id的那一列)
docker ps -a | grep "tomcat*" | awk '{print $1}'
#查找前缀为tomcat的镜像名称,并打印出镜像id
containerImage=$(docker images | grep "tomcat*" | awk '{print $3}')
if [ -n "$containerImage"]
then docker rmi $containerImage #删除容器
else
then "no such images"
fi
3、筛选磁盘使用率超过指定数值
#$1,$2表示输出的第几列
df -hT | awk -v I=${1} '{if(NR!=1) {split($6,a,"%");if(a[1]>10){print $1 "\t"$6,$7}}}'
#cpu使用前10的进程信息
ps -eo user,pid,pcpu,pmem,args --sort=-pcpu |head -n 10
#内存占用前10排序
ps -eo user,pid,pcpu,pmem,args --sort=-pmem |head -n 10
#删除掉java的相关进程
ps -ef | grep java | awk '{print $3}' | xargs kill -9
24、crontab(系统定时器)
系统定时器位置:
/etc/crontab
- 表达式:m h dom mon dow user command
命令 | 参数说明 | 参数范围 |
---|---|---|
m | minute | 0-59分钟 |
h | hour | 0-23小时 |
dom | day or month | 1-31(日) |
mon | month | 1-12(月) |
dow | day or week | 0-7(0、7都表示周日) |
user | 用户 | 那个用户去执行localuser、root、… |
command | 要执行的命令 | 可以是系统命令,也可以是自己编写的脚本文件。 |
说明:
- 17 * * * * root cd / && run-parts --report /etc/cron.hourly
表示每个小时的17分钟 root用户 去执行后面的指令 - 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
每天的6点25分 去执行操作 - 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
每周星期日的6点47分 去执行 - 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
每个月的1号的6点52分去执行
命令 | 参数说明 |
---|---|
cron.hourly | 每小时 |
cron.daily | 每天 |
cron.weekly | 每周 |
cron.monthly | 每月 |
举例
vim printDate.sh
#!/bin/bash
curPath=$(cd `dirname $0` ;pwd)
date >> "$curPath/date.txt"
- 添加到定时任务中
chmod 777 /usr/local/software/cronDate/printDate.sh
vim /etc/crontab
#每分钟执行一次该文件
1-59 * * * * localuser /usr/local/software/cronDate/printDate.sh