Shell 脚本系列 | shell三剑客

目录

    • 1、三剑客介绍
    • 2、三剑客之—grep
      • 1. 常用参数
      • 2. 常用示例
        • 1.过滤以#开头的行和空白行
        • 2.找出所有的mp3文件包含艺术家jayZ,不包含remix
        • 3.计算匹配项的数目
        • 4.在匹配字符串周围打印出行
        • 5.匹配显示所有IP
    • 3、三剑客之一sed
      • 1.常用参数
      • 2.常用示例
        • 1. 奇数行后增加
        • 2. 删除注释的行
        • 3.插入
        • 4.替换
    • 4、三剑客之一awk
      • 1.常用参数
      • 2.常用示例
        • 1.自定义输出内容
        • 2.显示文件的第n行
        • 3.通过管道符、双引号调用shell命令
        • 4.BEGIN,END模式

1、三剑客介绍

"Shell三剑客"是指在Linux/Unix系统下使用最广泛的三个命令行工具:grep、sed和awk。它们都是文本处理工具,可以用于快速搜索、替换和处理大量文本数据。

命令特点使用场景
grep擅长查找过滤快速查找过滤
sed擅长取行和替换需要快速进行替换/修改文件内容
awk擅长取列、统计计算文件取列、数据切片、对比/比较和统计

shell三剑客通常要与正则表达式一起使用
下面是一些常用的正则表达式元字符:

.:匹配任意单个字符(除了换行符)。
*:匹配前面的字符0次或多次。
^:匹配行的开头。
$:匹配行的结尾。	
[ ]:匹配方括号中的任何一个字符。例如,[abc]匹配"a"、"b"或"c"。
[^ ]:匹配不在方括号中的任何字符。例如,[^0-9]匹配任何非数字字符。
{n,m}:最少匹配n次,最多匹配m次
|:或者。匹配|前后的任意一项。

2、三剑客之—grep

1. 常用参数

-n:显示行号;
-i:忽略大小写;
-o:精准匹配;
-f:从文件每一行获取匹配模式;
-c:统计匹配的行数;
-w:匹配 整个单词;
-E:使用扩展正则表达式,相当于egrep;
-F :相当于fgrep,就是将pattern视为固定字符串。
-v:反转查找,显示不被 pattern 匹配到的行,相当于[^] 反向匹配;
-A:后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;
-B:后面可加数字,为 before 的意思,除了列出该行外,前面的 n 行也列出来;
-C:后面可加数字,为context 的意思,除了列出该行外,前后的n行也列出来。

2. 常用示例

1.过滤以#开头的行和空白行
egrep -v "^#|^$"   文本文件  
2.找出所有的mp3文件包含艺术家jayZ,不包含remix

//要找出艺术家jayZ的所有mp3格式的音乐文件,里面也不要有任何混合音轨-remix

find . -name ".mp3" | grep -i JayZ | grep -vi "remix"
3.计算匹配项的数目
#类似于将grep输出的结果用管道传送给计数器(wc程序)
cat /etc/passwd| grep -c nologin

在这里插入图片描述

4.在匹配字符串周围打印出行
cat /etc/passwd| grep -A 2 mail #打印出前面匹配的n行
cat /etc/passwd| grep -B 2 mail #打印出后面匹配的n行
cat /etc/passwd| grep -C 2 mail #打印出两个方向都匹配的n行

在这里插入图片描述

5.匹配显示所有IP
ip a|egrep  -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"

在这里插入图片描述

3、三剑客之一sed

1.常用参数

 -n:不打印模式空间;-e:执行脚本、表达式来处理;-f:执行动作从文件读取执行;-i:修改原文件;-r:使用扩展正则表达式。动作说明:
a:新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c:取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d:删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i:插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p:打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s:取代,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 。

2.常用示例

1. 奇数行后增加
echo -e "1\n2\n3\n4\n5" | sed "1~2 a www"
#1~2奇数,1~2!偶数

在这里插入图片描述

2. 删除注释的行
echo -e "#todo\ndef s\nputs 'b'\nend" | sed "/^#/d"

在这里插入图片描述

3.插入

i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)

echo -e "1\n2\n3\n4\n5" | sed "1 i aaa"

每一行插入 ‘

sed -i "s/^/\'/g"   test.txt
4.替换
替换每行第一个is 为was:
sed 's/is/was/1' pets.txt
替换每行全部is为was 
sed 's/is/was/g' pets.txt
替换偶数行 is为was 
sed '1~2! s/is/was/g' pets.txt
覆盖原文件 
sed -i '1~2! s/is/was/g' pets.txt

4、三剑客之一awk

1.常用参数

-F	指定分割字段符
-v	定义或修改一个awk内部的变量
-f 	从脚本文件中读取awk命令

内建变量

FS:列分隔符。指定每行文本的字段分隔符,默认为空格或制表位,与“ -F ”作用相同OFS:输出分隔符。指定输出字段间的分隔符。RS:行分隔符。awk从文件读取资料时,将根据RS的定义把资料切割为多条记录,
awk一次仅读取一条记录,以进行处理,预设值为 \n (换行符)NF:当前处理行的字段个数NR:当前处理行的行号FNR:awk当前读取的记录数,其变量值小于等于NR
(比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件$0:当前处理行的整行内容$n:当前处理行的第 n 个字段(第 n 列)FILENAME:被处理的文件名

2.常用示例

1.自定义输出内容
awk,必须外层单引号,内层双引号内置变量$1、$2都不得添加双引号,否则会识别文本,尽量别添加引号awk -F: '{print "第一列",$1,"第二列",$2}' /etc/passwd

在这里插入图片描述

2.显示文件的第n行
#显示文件2-5行内容
awk 'NR==2,NR==5' passwd

在这里插入图片描述

#显示文件2-5行且输出行号
awk 'NR==2,NR==5 {print NR,$0}' passwd 

在这里插入图片描述

#显示文件的第一列,倒数第二和倒数第三列
awk '{print $1,$(NF-1)}' test.txt 
awk '{print $1,$(NF-1),$(NF-2)}' test.txt

在这里插入图片描述
3.结果指定分隔符

#输出第1和第3个字段,输出结果默认以 空格 分隔
awk -F ":" '{print $1,$3 }' passwd
awk -F ":" '{print $1","$3 }' passwd
awk -F ":" '{print $1"=="$3 }' passwd

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.通过管道符、双引号调用shell命令

1.统计行数

awk -F ":" '/bash$/{print}' passwd 
root:x:0:0:root:/root:/bin/bash
y:x:1000:1000:y:/home/y:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
#调用 wc -l 统计使用bash的行数
awk -F ":" '/bash$/{print|"wc -l"}' passwd 
3

2.查看当前内存使用百分比

#查看当前内存使用百分比
free -m | awk '/Mem:/{print int($3/($3+$4)*100)"%"}'
87%

3.查看当前cpu空闲率

# -b -n 1 表示只需要1次输出结果
top -b -n 1 | grep Cpu
%Cpu(s):  2.9 us,  2.9 sy,  0.0 ni, 96.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 
#输出cpu空闲率的字段
top -b -n 1 | grep Cpu | awk -F "," '{print $4}'
96.9 id
#输出Cpu空闲率
top -b -n 1 | grep Cpu | awk -F "," '{print $4}' | awk '{print$1}'
96.9
4.BEGIN,END模式

BEGIN模式:在处理指定文本之前,需要先执行BEGIN模式中的指定的操作。

END模式:在处理指定文本结束后,需要执行END模式中的指定操作
在这里插入图片描述

#统计以 e 结尾的行
awk 'BEGIN{x=0}; /e$/{x++};END{print x}'

在这里插入图片描述


#统计以冒号分隔的文本段落数,END{}语句块中,往往会放入打印结果等语句
echo $PATH | awk 'BEGIN{RS=":"}{print NR,$0};END{print NR}'

在这里插入图片描述
过滤文本中重复行数

cat b.txt
aaa
bbb
ccc
aaa
aaa
aaa
bbb
bbb
ccc
#将文本的内容作为数组下标,a[$1]++表示出现相同的行,就自加1
awk '{a[$1]++}END{for (i in a){print i,a[i]}}' b.txt
aaa 4
ccc 2
bbb 3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/695586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

http协议工具:apache详解

目录 一、常见的http服务程序 1、 Apache HTTP Server 介绍 1.1 apache 概念 1.2 apache 功能 1.3 apache 特性 2、MPM(multi-processing module)工作模式 2.1 prefork 2.2 worker 2.3 event 二、Apache HTTP Server安装和相关文件 1、安装方…

MySQL|MySQL基础(求知讲堂-学习笔记【详】)

MySQL基础 目录 MySQL基础一、 MySQL的结构二、 管理数据库1)查询所有的数据库2)创建数据库3)修改数据库的字符编码4)删除数据库5)切换操作的数据库 三、表的概念四、字段的数据类型4.1 整型4.2 浮点型(float和double)…

Linux密码重置不求人:三种方法教你轻松搞定普通用户密码更改

在Linux服务器管理中,为普通用户设置和管理密码是一项基础且重要的任务。通过为普通用户设置登录密码,可以确保系统的安全性和用户访问的合法性。本文将详细介绍在Linux系统中,如何通过三种不同的方法为普通用户设置登录密码。 Linux下&…

基于 java springboot+layui仓库管理系统

基于 java springbootlayui仓库管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…

c++类和对象新手保姆级上手教学(下)

目录 前言: 初始化列表: explicit关键字: static成员: 友元函数: 友元类: 内部类: 匿名对象: 前言: 类和对象下篇中剩余的部分较为简单易理解,认真记住…

PC端封装侧边导航

PC端封装侧边导航 template <div v-if"showBox false" class"leftShow" click.stop"toggleBox"></div><div class"container" :class"{ show: showBox, fixed: fixedBox }"><div class"arrow&qu…

《C++ Primer Plus》《7、函数——C++的编程模块》

文章目录 前言1复习函数的基本知识1.1定义函数1.2函数原型和调用函数 2函数的参数和按值传递2.1多个参数2.2另一个接受两个参数的函数 3函数和数组3.1函数如何用指针来处理数组3.2将数组作为参数意味着什么3.3更多的数组函数示例3.4使用数组区间的函数3.5指针和const 4函数和二…

【实时渲染】图形处理单元

介绍 早期的图像加速技术是使用三角形扫描&#xff0c;将这些扫描的颜色通过插值显示在屏幕上&#xff0c;而且也拥有访问数据的能力&#xff0c;将这些访问的数据通过插值显示在屏幕上 程序内部又加上了许多的可见性的像素检查&#xff0c;如深度测试等&#xff0c;由于这些过…

Java集合1——Collection

集合是一种容器&#xff0c;用来装数据&#xff0c;类似于数组&#xff0c;但是集合的大小可变&#xff0c;开发中也经常能用到&#xff0c;为了满足不同的业务场景需求&#xff0c;JAVA还提供了不同特点的集合。 集合体系结构&#xff1a;单列集合(Collection)每个元素只包含…

uni-app 经验分享,从入门到离职(四)——页面栈以及页面跳转的 API(开发经验总结)

文章目录 &#x1f4cb;前言⏬关于专栏 &#x1f3af;什么是页面栈&#x1f9e9;页面跳转方法&#x1f4cc; uni.navigateTo(OBJECT)&#x1f4cc; uni.redirectTo(OBJECT)&#x1f4cc; uni.reLaunch(OBJECT)&#x1f4cc; uni.switchTab(OBJECT)&#x1f4cc; uni.navigateBa…

前端基础自学整理|HTML + JavaScript + DOM事件

目录 一、HTML 1、Html标签 2、Html元素 3、基本的HTML标签 二、CSS 样式 层叠样式表 三、JavaScript 使用示例 四、HTML DOM 通过可编程的对象模型&#xff0c;javaScript可以&#xff1a; window document 1、查找HTML元素 2、操作HTML元素 获取元素的属性 四…

跨境电商本土化运营:深度融合本地市场,提升用户体验与市场份额

随着全球经济的不断发展&#xff0c;跨境电商在国际贸易中扮演着越来越重要的角色。然而&#xff0c;单一地面对全球市场可能并不足以满足用户的多样化需求&#xff0c;因此&#xff0c;跨境电商需要与本地市场深度融合&#xff0c;实现本土化运营。本文Nox聚星将和大家探讨跨境…

Java Web演化史:从Servlet到SpringBoot的技术进程及未来趋势

引言 在快速演进的IT世界里&#xff0c;Java Web开发始终屹立不倒&#xff0c;它不仅承担着历史的厚重&#xff0c;也始终面向未来。 自诞生之日起&#xff0c;Java Web技术就在不断地进化&#xff0c;以适应不同时代的需求。 本文将回顾Java Web开发的重要里程碑&#xff0c;…

Java 后端面试指南

面试指南 TMD&#xff0c;一个后端为什么要了解那么多的知识&#xff0c;真是服了。啥啥都得了解 MySQL MySQL索引可能在以下几种情况下失效&#xff1a; 不遵循最左匹配原则&#xff1a;在联合索引中&#xff0c;如果没有使用索引的最左前缀&#xff0c;即查询条件中没有包含…

我国硅胶出口量有所下降 市场集中度有望不断提升

我国硅胶出口量有所下降 市场集中度有望不断提升 硅胶又称为硅酸凝胶、氧化硅胶等&#xff0c;是一种高活性吸附材料&#xff0c;在常温常压下多表现为一种具有开放多孔结构的透明或乳白色粒状非晶态物质。相较于其它化工材料&#xff0c;硅胶具有柔软、耐高温、耐腐蚀、绝缘性…

【C++练级之路】【Lv.8】【STL】list类的模拟实现

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C语言》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、结点二、迭代器2.1 成员变量与默认成员函数2.2 operator*2.3 operator->2.4 operator2.5 operator- …

Git详解及 github与gitlab使用

目录 1.1 关于版本控制 1.1.1 本地版本控制 1.1.2 集中化的版本控制系统 1.1.3 分布式版本控制系统 1.2 Git简介 1.2.1 Git历史 1.3 安装git 1.3.1 环境说明 1.3.2 Yum安装Git 1.3.3 编译安装 1.4 初次运行 Git 前的配置 1.4.1 配置git 1.4.2 获取帮助 1.5 获取 G…

C#知识点-15(匿名函数、使用委托进行窗体传值、反射)

匿名函数 概念&#xff1a;没有名字的函数&#xff0c;一般情况下只调用一次。它的本质就是一个方法&#xff0c;虽然我们没有定义这个方法&#xff0c;但是编译器会把匿名函数编译成一个方法 public delegate void Del1();//无参数无返回值的委托public delegate void Del2(s…

React快速入门(二)组件与函数

React快速入门&#xff08;二&#xff09;组件与函数React脚手架React组件化开发setState原理React更新机制使用ref受控/非受控组件高阶函数Portals/fragment/StrictMode React快速入门&#xff08;二&#xff09;组件与函数 React脚手架 脚手架让项目从搭建到开发&#xff0…

《游戏引擎架构》--学习3

内存管理 优化动态内存分配 维持最低限度的堆分配&#xff0c;并且永不在紧凑循环中使用堆分配 容器 迭代器 Unicode