【Linux编程Shell自动化脚本】03 shell四剑客(find、sed、grep、awk)
文章目录
- 一、find
- 1. 常用expression
- 2. 时间参数
- 3. 其他选项参数
- 3.1 查找深度
- 3.2 执行命令
- 二、sed
- 1. 常用命令选项
- 2. 常用动作脚本命令
- 2.1 s 替换
- 2.2 已匹配字符串标记&
- 2.3 在当前行前后插入文本 a\ 和 i\
- 2.4 p 打印指定行
- 2.5 匹配行的方式
- 2.5.1 以数字形式指定行区间
- 2.5.2 用文本模式指定行区间
- 三、grep
- 1. 常用选项
- 2. 示例
- 四、awk
- 1. 常用选项参数
- 2. 脚本命令
- 3. 脚本命令中常见的内建变量
- 4. 实例
一、find
语法格式
find [path] [expression]
参数说明 :
path 是要查找的目录路径,可以是一个目录或文件名,也可以是多个路径,多个路径之间用空格分隔,如果未指定路径,则默认为当前目录。
expression 是可选参数,用于指定查找的条件,可以是文件名、文件类型、文件大小等等。
1. 常用expression
以下列出最常用expression的部分:
- -name pattern:按文件名查找,支持使用通配符 * 和 ?。
- -type type:按文件类型查找,可以是 f(普通文件)、d(目录)、l(符号链接)等。
- -size [+-]size[cwbkMG]:按文件大小查找,支持使用 + 或 - 表示大于或小于指定大小,单位可以是 c(字节)、w(字数)、b(块数)、k(KB)、M(MB)或 G(GB)。
- -mtime days:按修改时间查找,支持使用 + 或 - 表示在指定天数前或后,days 是一个整数表示天数。
- -user username:按文件所有者查找。
- -group groupname:按文件所属组查找。
2. 时间参数
find 命令中用于时间的参数如下:
- -amin n:查找在 n 分钟内被访问过的文件。
- -atime n:查找在 n*24 小时内被访问过的文件。
- -cmin n:查找在 n 分钟内状态发生变化的文件(例如权限)。
- -ctime n:查找在 n*24 小时内状态发生变化的文件(例如权限)。
- -mmin n:查找在 n 分钟内被修改过的文件。
- -mtime n:查找在 n*24 小时内被修改过的文件。
在这些参数中,n 可以是一个正数、负数或零。正数表示在指定的时间前修改或访问过的文件,负数表示在指定的时间内修改或访问过的文件,零表示在当前时间点上修改或访问过的文件。
例如:-mtime 0 表示查找今天修改过的文件,-mtime -7 表示查找过去一周以内修改过的文件。
关于时间 n 参数的说明:
- +n:查找比 n 天前更早的文件或目录。
- -n:查找在 n 天内更改过属性的文件或目录。
- n:查找在 第 n 天前(指定那一天)更改过属性的文件或目录。
3. 其他选项参数
3.1 查找深度
- -maxdepth levels
Descend at most levels (a non-negative integer) levels of directories below the starting-points. Using -maxdepth 0 means only apply the tests and actions to the starting-points themselves. - -mindepth levels
Do not apply any tests or actions at levels less than levels (a non-negative integer). Using -mindepth 1 means process all files except the starting-points.
3.2 执行命令
- -exec command ;
Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of ‘;’ is encountered. The string ‘{}’ is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a ‘\’) or quoted to protect them from expansion by the shell.
示例:
# 查找当前目录下当天修改过的txt文件并删除
find . -maxdepth 1 -type f -name "\*.txt" -mtime -1 -exec rm -rf '{}' \;
# 查找当前目录下近5天内修改过的txt文件并拷贝到/tmp目录下
find . -maxdepth 1 -type f -name "\*.txt" -mtime -5 -exec cp '{}' /tmp/ \;
Notice that the braces are enclosed in single quote marks to protect them from interpretation as shell script punctuation. The semicolon is similarly protected by the use of a backslash, though single quotes could have been used in that case also.
注意:cp、mv不能直接使用xargs。
示例:$ find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir
此处的xargs将会构建如下命令:
$ mv 1.csv 2.csv 3.csv ... -t some_dir
如果直接使用cp或mv,会导致目标目录无法匹配,因此,需使用-t指定目标目录
二、sed
Vim 采用的是交互式文本编辑模式,可以用键盘命令来交互性地插入、删除或替换数据中的文本。但 sed 命令不同,它采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据。
vim 中一些常用操作:
- gg(命令模式下跳转文件开头)
- G(命令模式下跳转文件结尾)
- :%s/vivian/sky/替换每一行的第一个 vivian 为 sky(底线命令模式)
- :%s/vivian/sky/g替换每一行中所有 vivian 为 sky(底线命令模式)
sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:
- 每次仅读取一行内容;
- 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
- 将执行结果输出。
当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。
1. 常用命令选项
默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容。
命令选项:
- -i:此选项会直接修改源文件,要慎用。
- -n:默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。
- -e:该选项会将其后跟的脚本命令添加到已有的命令列表中,即可以通过-e参数指定多个命令内容。
2. 常用动作脚本命令
2.1 s 替换
此命令的基本格式为:
[address]s/pattern/replacement/flags
其中,address 表示指定要操作的具体行,pattern 指的是需要替换的内容,replacement 指的是要替换的新内容。
此命令中常用的 flags 标记如表所示
flags 标记 | 功能 |
---|---|
n | 1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记; |
g | 对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A; |
p | 会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。 |
示例:
sed 's/192/10/g' test.txt # 把文件里面的192字符替换为10,不修改原文件,替换结果输出到终端
sed -i 's/192/10/g' test.txt # 把文件里面的192字符替换为10,修改原文件
2.2 已匹配字符串标记&
& 表示已匹配的字符串标记
示例:
sed 's/^/& /g' test.txt # 在每行行首增加一个空格
sed 's/$/& id /g' test.txt # 在每行末尾增加一个id字符串
2.3 在当前行前后插入文本 a\ 和 i\
a 命令表示在指定行的后面附加一行,i 命令表示在指定行的前面插入一行,它们的基本格式完全相同,如下所示:
[address]a(或 i)\新文本内容
a\ 和 i\ 后面的\可以省略
示例:
sed '/^test/a\this is a test line' file # 在file文件以 test 开头的行后面追加一行文本
sed '/^test/i\this is a test line' file # 在file文件以 test 开头的行前面插入一行文本
2.4 p 打印指定行
p 命令表示搜索符号条件的行,并输出该行的内容,此命令的基本格式为:
[address]p
示例:
sed -n '/xxx/p' test.txt
用 -n 选项和 p 命令配合使用,可以禁止输出其他行,只打印包含匹配文本模式的行。
2.5 匹配行的方式
默认情况下,sed 命令会作用于文本数据的所有行。如果只想将命令作用于特定行或某些行,则必须写明 address 部分,表示的方法有以下 2 种:
- 以数字形式指定行区间;
- 用文本模式指定具体行区间。
2.5.1 以数字形式指定行区间
sed 会将文本流中的第一行编号为 1,然后继续按顺序为接下来的行分配行号。
在脚本命令中,指定的地址可以是单个行号,或是用起始行号、逗号以及结尾行号指定的一定区间范围内的行。
示例:
sed -n '1p' test.txt # 打印第一行
sed -n '1,5p' test.txt # 打印第1-5行
可以使用分号来分隔需要指定的多个行,示例:
sed -n '1p;$p' test.txt # 打印第一行和最后一行,$符号映射特殊行——最后一行
2.5.2 用文本模式指定行区间
sed 允许指定文本模式来过滤出命令要作用的行,格式如下:
/pattern/command
例如想修改用户 demo 的默认 shell,可以使用 sed 命令,执行命令如下:
sed '/demo/s/bash/csh/' /etc/passwd
输出指定行:
sed -n '/aaa/p' test.txt
sort命令用于将文本文件内容加以排序。
- -n 按算术值对字段进行数字排序
- -r 按倒序排序
三、grep
基本格式:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
1. 常用选项
常用选项及含义:
- -v:列出没有匹配到的行
- -n:在每一匹配行前列出行号
- -E, --extended-regexp:将pattern解释为扩展正则表达式,即强制grep表现为egrep(grep -E等价于egrep)
2. 示例
grep -v "^$" # 排除空行
grep "^10" test.txt # 匹配以10开头的
grep "11$" test.txt # 以11结尾的
grep "[0-9]" test.txt # 匹配数字
grep "[a-z]" test.txt # 匹配字母
cat -n 打印行号
四、awk
和 sed 命令类似,awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。
此命令的设计者有 3 位,他们的姓分别是 Aho、Weingberger 和 Kernighan,awk 就取自这 3 为大师姓的首字母。
基本格式:
awk [选项参数] '脚本命令' 文件名
标准输出 | awk [选项参数] '脚本命令' # 如cat test.txt | awk '{print $1}'
1. 常用选项参数
常用选项及含义:
- -F fs:指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符。
2. 脚本命令
基本格式:
'匹配规则{执行命令}'
这里的匹配规则,和 sed 命令中的 address 部分作用相同,用来指定脚本命令可以作用到文本内容中的具体行,可以使用字符串(比如 /demo/,表示查看含有 demo 字符串的行)或者正则表达式指定。另外需要注意的是,整个脚本命令是用单引号(‘’)括起,而其中的执行命令部分需要用大括号({})括起来。
在 awk 程序执行时,如果没有指定执行命令,则默认会把匹配的行输出;如果不指定匹配规则,则默认匹配文本中所有的行。
3. 脚本命令中常见的内建变量
默认情况下,awk 会将如下变量分配给它在文本行中发现的数据字段:
- $0 代表整个文本行;
- $n 代表文本行中的第 n 个数据字段,字段间由FS分隔。
其他内建变量:
- FS 字段分隔符(默认是任何空格)
- NF 一条记录的字段的数目,$NF表示匹配文本行的最后一个字段
- NR 已经读出的记录数,就是行号,从1开始
4. 实例
awk '{print $1}' test.txt # 打印第一列
awk '{print $NF}' test.txt # 打印最后一列
awk -F: '{print $1}' /etc/passwd # 以:作为分隔符打印第一列,取出系统用户名
awk '{print "01: "$NF}' test.txt # 打印最后一列,awk中可以使用""添加输出内容
df -h 查看磁盘占用的空间
相关文章:
【Linux编程Shell自动化脚本】03 shell四剑客(find、sed、grep、awk)
文章目录 一、find1. 常用expression2. 时间参数3. 其他选项参数3.1 查找深度3.2 执行命令 二、sed1. 常用命令选项2. 常用动作脚本命令2.1 s 替换2.2 已匹配字符串标记&2.3 在当前行前后插入文本 a\ 和 i\2.4 p 打印指定行2.5 匹配行的方式2.5.1 以数字形式指定行区间2.5.…...
java的springboot框架中使用logback日志框架使用RabbitHandler注解为什么获取不到消费的traceId信息?
当使用 Logback 日志框架和 RabbitMQ 的 RabbitHandler 注解时,如果无法获取消费的 traceId 信息,可能是因为在处理 RabbitMQ 消息时,没有正确地将 traceId 传递到日志中。 为了将 traceId 传递到日志中,你可以利用 MDCÿ…...
初探Vue.js及Vue-Cli
一、使用vue框架的简单示例 我们本次的vue系列就使用webstorm来演示: 对于vue.js的安装我们直接使用script的cdn链接来实现 具体可以参考如下网址: https://www.bootcdn.cn/ 进入vue部分,可以筛选版本,我这里使用的是2.7.10版本的ÿ…...
大数据课程K21——Spark的SparkSQL基础语法
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Spark的SparkSQL通过方法来使用; ⚪ 掌握Spark的SparkSQL通过sql语句来调用; 一、SparkSQL基础语法——通过方法来使用 1. 查询 df.select("id","name").show()…...
【实践篇】Redis最强Java客户端(三)之Redisson 7种分布式锁使用指南
文章目录 0. 前言1. Redisson 7种分布式锁使用指南1.1 简单锁:1.2 公平锁:1.3 可重入锁:1.4 红锁:1.5 读写锁:1.6 信号量:1.7 闭锁: 2. Spring boot 集成Redisson 验证分布式锁3. 参考资料4. 源…...
卫星通话过后,卫星导航产业被彻底激活
华为新手机发布后,其主打的卫星通话功能备受热议。在卫星产业链发展的背后,下一个大产业在哪里让人颇为好奇。 目前,卫星导航颇被看好,或将引领下一个技术狂潮。它的特点是产业大、发展快、参与者多。继电动汽车、新能源和芯片产…...
【算法训练-链表 七】【排序】:链表排序、链表的奇偶重排、重排链表
废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【链表的排序】,使用【链表】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&am…...
LGB的两种写法
方法一 import lightgbm as lgb import pandas as pd from sklearn.model_selection import train_test_split, KFold from sklearn.metrics import accuracy_score# 读取训练集和测试集数据 train_data pd.read_csv(train.csv) test_data pd.read_csv(test.csv)# 分割特征和…...
【Unity的HDRP下ShaderGraph实现权重缩放全息投影_(内附源码)】
实现权重缩放全息投影 效果如下 效果如下 顶点位置偏移 链接: 提取码:1234...
透视俄乌网络战之二:Conti勒索软件集团(上)
透视俄乌网络战之一:数据擦除软件 Conti勒索软件集团(上) 1. Conti简介2. 组织架构3. 核心成员4. 招募途径5. 工作薪酬6. 未来计划参考 1. Conti简介 Conti于2019年首次被发现,现已成为网络世界中最危险的勒索软件之一࿰…...
【华为OD机试python】拔河比赛【2023 B卷|100分】
【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 公司最近准备进行拔河比赛,需要在全部员工中进行挑选。 选拔的规则如下: 按照身高优先、体重次优先的方式准备比赛阵容; 规定参赛的队伍派出10名选手。 请实现一个选拔队员的小程序。 输…...
05 CNN 猴子类别检测
一、数据集下载 kaggle数据集[10 monkey] 二、数据集准备 2.1 指定路径 from tensorflow import keras import tensorflow as tf import numpy as np import pandas as pd import matplotlib.pyplot as plttrain_dir /newdisk/darren_pty/CNN/ten_monkey/training/ valid_d…...
【C#】关于Array.Copy 和 GC
关于Array.Copy 和 GC //一个简单的 数组copy 什么情况下会触发GC呢[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]public static void Copy(Array sourceArray,long sourceIndex,Array destinationArray,long destinationIndex,long length);当源和目…...
Vue前端框架08 Vue框架简介、VueAPI风格、模板语法、事件处理、数组变化侦测
目录 一、Vue框架1.1渐进式框架1.2 Vue的版本 二、VueAPI的风格三、Vue开发准备工作四、模板语法文本插值属性绑定条件渲染列表渲染key管理状态 四、事件处理定义事件事件参数事件修饰符 五、数组变化侦测 一、Vue框架 渐进式JavaScript框架,易学易用,性…...
WebStorm使用PlantUML
虽然 WebStorm 没有官方的 PlantUML 插件,但我们可以使用第三方插件 PlantUML Integration 来实现在 WebStorm 中使用 PlantUML。 以下是使用 PlantUML Integration 插件,在 WebStorm 中设计一个 Vue 模块的步骤: 安装 PlantUML Integratio…...
Python做批处理,给安卓设备安装应用和传输图片
场景:几台新安卓平板过来了,需要安4个应用并复制4张图片。手工操作其实也未尝不可,但是能自动化起来,岂不是美哉。 python调用系统命令,我选用了os.system,最简单粗暴,也能有回显,就…...
如何获取springboot中所有的bean
代码 Component public class TestS {Autowiredprivate Map<String, Object> allBean Maps.newConcurrentMap();public void testA(){System.out.println("测试下");}}这段代码是一个使用 Spring Framework 的依赖注入(DI)功能的示例。…...
大数据技术之Hadoop:HDFS存储原理篇(五)
目录 一、原理介绍 1.1 Block块 1.2 副本机制 二、fsck命令 2.1 设置默认副本数量 2.2 临时设置文件副本大小 2.3 fsck命令检查文件的副本数 2.4 block块大小的配置 三、NameNode元数据 3.1 NameNode作用 3.2 edits文件 3.3 FSImage文件 3.4 元素据合并控制参数 …...
用C语言实现牛顿摆控制台动画
题目 用C语言实现牛顿摆动画,模拟小球的运动,如图所示 拆解 通过控制台API定位输出小球运动的只是2边小球,中间小球不运动,只需要固定位置输出左边小球上升下降时,X、Y轴增量一致。右边小球上升下降时,X、…...
如何自己开发一个前端监控SDK
最近在负责团队前端监控系统搭建的任务。因为我们公司有统一的日志存储平台、日志清洗平台和基于 Grafana 搭建的可视化看板,就剩日志的采集和上报需要自己实现了,所以决定封装一个前端监控 SDK 来完成日志的采集和上报。 架构设计 因为想着以后有机会…...
node.js笔记
首先:浏览器能执行 JS 代码,依靠的是内核中的 V8 引擎(C 程序) 其次:Node.js 是基于 Chrome V8 引擎进行封装(运行环境) 区别:都支持 ECMAScript 标准语法,Node.js 有独立…...
mysql 增量备份与恢复使用详解
目录 一、前言 二、数据备份策略 2.1 全备 2.2 增量备份 2.3 差异备份 三、mysql 增量备份概述 3.1 增量备份实现原理 3.1.1 基于日志的增量备份 3.1.2 基于时间戳的增量备份 3.2 增量备份常用实现方式 3.2.1 基于mysqldump增量备份 3.2.2 基于第三方备份工具进行增…...
9月5日上课内容 第一章 NoSQL之Redis配置与优化
本章结构 关系型数据库和非关系型数据库 概念介绍 ●关系型数据库: 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 SQL 语句(标准数据查询语言)就是…...
QT 第四天
一、设置一个闹钟 .pro QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend…...
nrf52832 GPIO输入输出设置
LED_GPIO #define LED_START 17 #define LED_0 17 #define LED_1 18 #define LED_2 19 #define LED_3 20 #define LED_STOP 20设置位输出模式: nrf_gpio_cfg_output(LED_0); 输出高电平:nrf_gpio_pin_set(LED_0); 输…...
MyBatis 动态 SQL 实践教程
一、MyBatis动态 sql 是什么 动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。例如,拼接时要确保添加了必要的空格,还要注意去掉列…...
CSS 斜条纹进度条
效果: 代码: html: <div class"active-line flex"><!-- lineWidth:灰色背景 --><div class"bg-line"><div v-for"n in 30" class"gray"></div></div><div…...
JavaScript(1)每天10个小知识点
目录 1. JavaScript 有哪些数据类型,它们的区别?**2. 数据类型检测的方式有哪些**3. null 和 undefined 区别**4. intanceof 操作符的实现原理及实现**5. 如何获取安全的 undefined 值?**6. Object.is() 与比较操作符 “”、“” 的区别*…...
scanf和scanf_s函数详解
目录 引言: 1.scanf函数的用法: 2.scanf_s函数的用法: 3.scanf和scanf_s的区别: 结论: 引言: 在C语言中,输入函数scanf是非常常用的函数之一,它可以从标准输入流中读取数据并将其…...
基于SSM的在线购物系统
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
国内免费发布产品的平台/太原seo排名公司
【小程序开发】常见的内置组件 文章目录【小程序开发】常见的内置组件写在前面一、Text文本组件二、Button按钮组件2.1 type属性2.2 open-type属性三、View视图组件三、Image图片组件3.1 mode属性3.2 wx.chooseMedia四、ScrollView滚动组件五、组件的共同属性写在前面 …...
免费网页小游戏在线玩/有名的seo外包公司
简历投递入口 中间件开发高级工程师 广州 岗位职责 1.完善以rocketmq为基础的高可用可扩展分布式消息中间件,保证其稳定性,支撑业务的快速发展; 2.推动各条业务线接入消息中间件,打造公司级别的基础服务组件; 3.改进和优化监控,自…...
福州网站设计公司/怎么创建一个网址
原来做的操作viewPanel的按钮在另一行,最近要求在viewPanel的导航栏左边加入按钮,在网上找找还真找到,这里做个记录。 <xp:viewPanel rows"10" id"viewPanel2"viewStyleClass"nobottom table"dataTableStyl…...
html的网站模板/适合成人参加的培训班
一、初始Ajax ajax的写法: $.ajax({url:/host,type:POSTdata:{k1:123,k2:root}success:function(data){}#执行成功后自动触发这个函数})ajax的使用: #在JavaScript中写jquery$(#ajax_submit).click(function(){$.ajax({url:/ajax_text,type:GETdata:{use…...
怎么做QQ信任网站/app推广活动策划方案
题意:开车从起点出发,到终点的路上有一些加油站,不同的加油站油价不同,要求输出到终点时最少花费的钱思路:贪心,在加满油可以走的最大距离内分情况讨论:在范围内存在加油站油价比当前加油站小&a…...
做网站备案地点/seo排名公司
Qt中使用emit发送信号编译报错undefined reference to xxx,一直以为是定义的问题 后来考虑是在构建类时忘记加入Q_OBJECT。 在类中加入Q_OBJECT,重新编译报错undefined reference to vtable for (类名) 点击构建-选择"执行qmake"࿰…...