shell 基本语法第四讲之(find(文件查找)、xargs(字符串拼凑)、sed(处理文本)、awk(文本处理)、crontab(系统定时器))

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支持的主要条件类型
条件类型条 件说 明
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
命令参数说明参数范围
mminute0-59分钟
hhour0-23小时
domday or month1-31(日)
monmonth1-12(月)
dowday or week0-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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值