科普文:Shell编程三剑客:grep+sed+awk

        shell三剑客是grep、sed和awk三个工具的简称,因功能强大,使用方便且使用频率高,因此被戏称为三剑客,熟练使用这三个工具可以极大地提升运维效率。

三剑客的特点:

命令

特点

使用场景

grep

擅长查找过滤

快速查找过滤

sed

擅长取行和替换

需要快速进行替换/修改文件内容

awk

擅长取列、统计计算

文件取列、数据切片、对比/比较和统计

grep:

  grep 是 Linux 系统中一个非常强大的文本搜索工具,它能够快速地在文件中搜索指定的字符串或模式,并输出匹配的行。grep 是 "Global Regular Expression Print" 的缩写,意味着全局正则表达式打印。

        grep 可以匹配一个或多个正则表达式。 它快速、灵活,是文本搜索的标准工具。 grep 支持多种选项,如忽略大小写、递归搜索目录、使用正则表达式等。 常用于快速查找文件中包含特定文本的行。

语法结构

grep [OPTIONS] PATTERN [FILE...]

  • OPTIONS:可选的命令行选项。

  • PATTERN:要搜索的模式,可以是简单的字符串或复杂的正则表达式。

  • FILE:要搜索的文件或目录,如果不指定文件,默认为标准输入。

常用选项

  • -i:忽略大小写差异,使得搜索不区分大小写。

  • -v:显示不包含匹配文本的行。

  • -n:显示匹配行的行号。

  • -c:仅显示匹配行的数量,不显示行内容。

  • -r 或 -R:递归地在指定目录下的所有文件中搜索。

  • -e:允许同时搜索多个模式。

  • -l:仅显示包含匹配文本的文件名。

  • --color=auto:将匹配的文本以彩色显示,便于区分。

示例

创建测试用例文件

cat >> file.txt << EOF
> this is my first file
> print "hello world !"
> list = {1,2,3,4,5,6,7,8,9,10}
> print(list[1])
> print "HELLO WORLD !"
> List={1,2,3,4,5,6,7,8}
> x=List[1]
> y=List[2]
> EOFcat file.txt
this is my first file
print "hello world !"
list = {1,2,3,4,5,6,7,8,9,10}
print(list[1])
print "HELLO WORLD !"
List={1,2,3,4,5,6,7,8}
x=List[1]
y=List[2]

grep 搜索操作

搜索单个文件中的字符串:grep "hello" file.txt搜索多个文件中的字符串:grep "hello" file1.txt file2.txt同时搜索多个模式:grep -e "hello" -e "world" file.txt显示匹配行号:grep -n "hello" file.txt显示不匹配的行:grep -v "hello" file.txt递归搜索目录中的字符串:grep -r "hello" directory/只显示包含匹配文本的文件名:grep -l "hello" directory/统计匹配的行数:grep -c "hello" file.txt使用正则表达式搜索(假设 PATTERN 是一个正则表达式):grep -E "regexp" file.txt高亮显示匹配的文本:grep --color=auto "hello" file.txt

sed:

        sed(Stream Editor)是一个流编辑器,用于对文本数据进行过滤和转换。 它按照指定的模式执行编辑命令,如插入、删除、替换和转换。 sed 脚本可以非常简洁,适合进行简单的文本替换和模式匹配。 常用于自动化文本编辑任务。

语法结构

sed [OPTIONS] 'COMMANDS' [FILE...]

  • OPTIONS:可选的命令行选项。

  • COMMANDS:要执行的 sed 命令序列,通常用单引号括起来。

  • FILE:要处理的文件或文件列表,如果不指定,sed 会从标准输入读取。

常用命令

  • s:替换指定模式。

  • d:删除指定行。

  • i:在指定行前插入文本。

  • c:替换指定行。

  • y:字符转换。

  • p:打印行。

  • a:在指定行后追加文本。

  • q:退出 sed

选项

  • -i:直接修改文件,而不是输出到标准输出。

  • -n:仅打印经过 sed 命令处理的行。

  • -e:执行一个 sed 命令脚本。

示例

替换文件中的指定字符串:
sed 's/hello/world/' file.txt删除文件中的指定行:
sed '3d' file.txt在文件中指定行后插入指定字符串:
sed '2i\hello world' file.txt替换文件中指定行的内容:
sed '3c\hello world' file.txt在文件中指定行后追加文本:
sed '2a\
This is a new line added after line 2\
' file.txt打印文件中匹配的行:
sed -n '/world/p' file.txt字符转换:
sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' file.txt使用正则表达式进行替换:
sed 's/[0-9]/& /g' file.txt  # 将数字后添加空格使用模式匹配进行删除:
sed '/^$/d' file.txt  # 删除空行直接修改文件:
sed -i 's/old/new/' file.txt多命令执行:
sed -e 's/old/new/' -e 's/yes/no/' file.txt打印不匹配的行:
sed -n '/old/!p' file.txt

awk:

        awk 的名称来源于其作者 Alfred V. Aho、Peter J. Weinberger 和 Brian W. Kernighan 的姓氏首字母。awk 是一个强大的文本处理工具,它不仅能够格式化和过滤文本数据,还能进行复杂的计算和数据处理,特别适合用来处理结构化数据,如表格数据。 它能够读取文件,并对数据进行模式扫描和处理。 awk 支持复杂的条件语句、循环、数组等编程结构。 常用于数据的提取、排序、计算等。

语法结构

awk [OPTIONS] 'PROGRAM' [FILE...]

  • OPTIONS:可选的命令行选项。

  • PROGRAM:awk 程序,包含模式和要执行的动作,通常用单引号括起来。

  • FILE:要处理的文件或文件列表,如果不指定,awk 会从标准输入读取。

常用选项

  • -F:设置输入字段分隔符。

  • -v:向 awk 程序传递外部变量。

  • --field-separators:设置字段分隔符。

  • --record-separators:设置记录分隔符。

基本元素

  • PATTERN:可以是特定的文本、正则表达式或空(表示所有记录)。

  • ACTION:当模式匹配时执行的命令或代码块。

示例

打印文件中的所有行:
awk '{print}' file.txt打印文件中第二列的内容:
awk '{print $2}' file.txt计算文件中所有数字的总和:
awk '{sum += $1} END {print sum}' file.txt打印文件中包含指定字符串的行:
awk '/hello/ {print}' file.txt在文件中指定列后面添加指定字符串:
awk '{$3 = $3 "hello"} {print}' file.txt使用字段分隔符:
awk -F":" '{print $1}' /etc/passwd条件判断:
awk '{if ($1 > 100) print $0}' file.txt循环结构:
awk '{for (i = 1; i <= NF; i++) print $i}' file.txt格式化输出:
awk '{printf "%-15s %-10s\n", $1, $2}' file.txt使用外部变量:
awk -v var="value" '{print var}' file.txt多模式匹配:
awk '/pattern1/,/pattern2/' file.txt自定义函数:
awk '{func()} {print} function func() {print "This is a custom function"}'处理多个文件:
awk '{...}' file1.txt file2.txt

三个工具的常用用法以及组合用法

          Input Data│▼+---------------------------------------------------+|                                                   ||    grep                                           |  -> 过滤行/查找模式|  - Search using regex                             ||  - Invert match (-v)                              ||  - Count matches (-c)                             ||  - Show line numbers (-n)                         ||  - Recursive search (-r)                          ||  - Extended regex (-E)                            ||  - File pattern exclusion (--exclude)             ||  - Color matched output (--color)                 ||                                                   |+---------------------------------------------------+│▼+---------------------------------------------------+|                                                   ||    sed                                            |  -> 文本替换/编辑|  - Replace text (s/old/new/g)                     ||  - Delete lines (d)                               ||  - Insert lines (i)                               ||  - Append lines (a)                               ||  - Modify in-place (-i)                           ||  - Multiline operations (N, D, P)                 ||  - Back references (\1, \2...)                    ||  - Conditional execution (/pattern/ cmd)          ||  - Case insensitive match (I)                     ||                                                   |+---------------------------------------------------+│▼+---------------------------------------------------+|                                                   ||    awk                                            |  -> 文本分析/格式化输出|  - Parse fields ($1, $2, ...)                     ||  - Pattern-action pairs                           ||  - Built-in functions (length, substr, split...)  ||  - Conditional patterns (BEGIN, END)              ||  - Arithmetic ops (+, -, *, /)                    ||  - String concatenation                           ||  - User-defined functions                         ||  - Associative arrays                             ||  - Built-in variables (NF, NR, FS...)             ||                                                   |+---------------------------------------------------+│▼Output Data

示例

1. 过滤并格式化日志行: 假设我们想从一堆日志中找出包含 "ERROR" 或 "WARNING" 的行,并且只获取这些行的日期和消息内容,同时为其加上一个前缀。

   grep -E "ERROR|WARNING" log.txt | sed 's/\(\[.*\]\).*/\1/' | awk '{ print "Log Alert: " $0 }'
  • grep -E "ERROR|WARNING" log.txt: 使用扩展正则表达式搜索包含 "ERROR" 或 "WARNING" 的行。
  • sed 's/\(\[.*\]\).*/\1/': 使用捕获组捕获日期格式(例如:[2023-01-01 12:00:00]),并替换整行为该日期。
  • awk '{ print "Log Alert: " $0 }': 在每一行前加上 "Log Alert: "。

2. 提取特定范围的日志: 提取在两个时间戳之间的所有日志,并从中删除所有的DEBUG行,然后格式化输出。

   sed -n '/2023-01-01 00:00:00/,/2023-01-01 23:59:59/p' log.txt | grep -v "DEBUG" | awk '{ $1=""; $2=""; print $0 }'

sed -n '/2023-01-01 00:00:00/,/2023-01-01 23:59:59/p' log.txt: 提取日志中指定日期范围内的行。

  • grep -v "DEBUG": 排除包含 "DEBUG" 的行。
  • awk '{ $1=""; $2=""; print $0 }': 删除每一行的前两个字段。

3. 统计每种日志级别的数量: 提取所有的日志级别,并计算它们出现的次数。

  grep -oE "(ERROR|WARNING|INFO|DEBUG)" log.txt | sed 's/DEBUG/DEBG/' | awk '{count[$0]++} END { for (i in count) print i ": " count[i] }'
  • grep -oE "(ERROR|WARNING|INFO|DEBUG)" log.txt: 提取出每行的日志级别。
  • sed 's/DEBUG/DEBG/': 将 "DEBUG" 替换为 "DEBG"。
  • awk '{count[$0]++} END { for (i in count) print i ": " count[i] }': 使用数组统计每种日志级别的数量,并在结束时打印。

4. 从配置文件中提取和转换数据: 假设配置文件中有很多键值对,格式为 `key=value`,我们要找到所有以 "config" 开头的键,然后将其值修改为大写。

   grep "^config" config.txt | sed 's/\(config[^=]*\)=\(.*\)/\1=\U\2/' | awk -F '=' '{print $1 " is set to " $2}'
  • grep "^config" config.txt: 查找以 "config" 开头的行。
  • sed 's/\(config[^=]*\)=\(.*\)/\1=\U\2/': 捕获等号前后的内容,并将等号后的值转换为大写。
  • awk -F '=' '{print $1 " is set to " $2}': 打印格式化的输出。

5. 处理CSV文件: 假设你有一个CSV文件,你想找到所有名字中包含"John"的行,并将其年龄加10。

   grep ",John," data.csv | sed 's/\(,John,[^,]*,\)\([0-9]*\)/\1/' | awk -F ',' '{ $4 = $4 + 10; print $0 }'
  • grep ",John," data.csv: 查找名字为 "John" 的行。
  • sed 's/\(,John,[^,]*,\)\([0-9]*\)/\1/': 捕获John后的年龄字段。
  • awk -F ',' '{ $4 = $4 + 10; print $0 }': 将年龄字段增加10并打印。

6. 提取并转换XML数据: 如果你有一个XML文件,你想找到所有`<name>`标签,并更改其内容。

   grep "<name>.*</name>" data.xml | sed 's/<name>\(.*\)<\/name>/\1/' | awk '{ print "Name tag contains: " $0 }'
  • grep "<name>.*</name>" data.xml: 查找包含 <name> 标签的行。
  • sed 's/<name>\(.*\)<\/name>/\1/': 提取 <name> 标签内的内容。
  • awk '{ print "Name tag contains: " $0 }': 打印格式化的输出。

7. 网络分析: 假设你有一个包含网络请求的日志,你想找到所有的404错误,并从中提取请求的URL。

   grep " 404 " access.log | sed 's/.*GET \([^ ]*\) .*/\1/' | awk '{ print "Failed request to: " $0 }'
  • grep " 404 " access.log: 查找所有的404错误。
  • sed 's/.*GET \([^ ]*\) .*/\1/': 提取GET请求的URL。
  • awk '{ print "Failed request to: " $0 }': 打印格式化的输出。

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

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

相关文章

智慧城市可视化页面怎么做?免费可视化工具可以帮你

智慧城市是一个综合性的概念&#xff0c;广泛应用于各个领域&#xff0c;如基础设施建设、信息化应用、产业经济发展、市民生活品质等。 可视化页面的制作也是一个综合性的过程&#xff0c;需要确定展示内容、数据收集与处理、设计可视化元素等多个环节紧密配合。 1. 明确展示…

download failed after attempts=6: dial tcp 108.160.169.178:443: i/o timeout问题解决

添加公开的docker加速代理(可能会失效)&#xff1a; vim /etc/docker/daemon.json{"registry-mirrors":["https://docker.mirrors.sjtug.sjtu.edu.cn","https://docker.m.daocloud.io","https://noohub.ru","https://huecker.io…

序列化Serialization

介绍 序列化&#xff08;Serialization&#xff09;是将对象的状态转换为可存储或传输的格式的过程。通过序列化&#xff0c;可以将对象保存到文件中、数据库中&#xff0c;或者通过网络传输到远程系统。相应地&#xff0c;反序列化&#xff08;Deserialization&#xff09;是…

从零开始开发视频美颜SDK:实现直播美颜效果

因此&#xff0c;开发一款从零开始的视频美颜SDK&#xff0c;不仅可以节省成本&#xff0c;还能根据具体需求进行个性化调整。本文将介绍从零开始开发视频美颜SDK的关键步骤和实现思路。 一、需求分析与技术选型 在开发一款视频美颜SDK之前&#xff0c;首先需要进行详细的需求…

python对点云可视化设置颜色

1、背景介绍 点云分类/分割时&#xff0c;常需要对分类结果进行可视化&#xff0c;其中给点云赋予不同颜色是一种最直接方法。介绍基于python中matplotlib进行点云颜色渲染显示。 2、点云颜色渲染 2.1 有限种颜色渲染 matplotlib在点云颜色渲染时&#xff0c;使用表示颜色的关…

如何让接口请求,页面不刷新加载,页面加载中 不显示

check(data, config) {return request(Object.assign({url: dicEquPurpose/queryList,data: packQuery(data),noLoading:true }, config || {})) }, 加上 noLoading:true 即可

Spring开发实践(五)

接口幂等性 接口幂等性&#xff08;Idempotency&#xff09;是指在网络请求中&#xff0c;无论一个操作被执行多少次&#xff0c;产生的结果都是相同的。换句话说&#xff0c;幂等操作的多次执行不会改变系统的状态&#xff0c;或者说多次执行的结果与单次执行的结果是一样的。…

C++知识点总结(41):广度优先搜索

广度优先搜索 一、广度优先搜索1. 意义2. 分析3. 基本程序 二、例题1. 最短路径模板2. 跳跃的马2.1 审题2.2 思路2.3 参考答案 3. 今天就上 200 200 200 层3.1 审题3.2 参考答案 三、DFS VS. BFS *注&#xff1a;如果还没有学过 结构体 或者 栈/队列/优先队列 的同学请仔细看完…

【代码随想录】【算法训练营】【第65天】 [卡码94]城市间货物运输I

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 65&#xff0c;周四&#xff0c;继续ding~ [卡码94] 城市间货物运输I 题目描述 卡码94 城市间货物运输I 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 Be…

ubuntu文件夹加密

veracrypt 安装 wget https://launchpad.net/veracrypt/trunk/1.24-update7/+download/veracrypt-1.24-Update7-setup.tar.bz2tar -jxvf veracrypt-1.24-Update7-setup.tar.bz2 uname -m sudo ./veracrypt-1.24-Update7-setup-console-x64 # 选1 # 一直回车 选yes安装成功创…

快递查询|阿里云实现调用API接口

整体请求流程 介绍&#xff1a; 本次解析通过阿里云云市场的云服务来实现程序中对快递包裹实时监控&#xff0c;首先需要准备选择一家可以提供快递查询的商品。 https://market.aliyun.com/apimarket/detail/cmapi00065859#skuyuncode5985900001 步骤1: 选择商品 如图点击…

网站外链还有没有作用

前言 还记得“内容为王&#xff0c;外链为皇”这句话吗&#xff1f;在以前网站外链是网站优化中非常主要的环节。那时候做一个网站&#xff0c;只要不停的发外链&#xff0c;收录就不会差&#xff0c;于是大部分站长都使劲发外链。 有市场就有商场&#xff0c;大家都看到外链…

【国内超大型智能算力中心建设白皮书 2024】_智算中心算力规划

文末有福利&#xff01; 智算中心建设通过领先的体系架构设计&#xff0c;以算力基建化为主体、以算法基建化为引领、以服务智件化为依托&#xff0c;以设施绿色化为支撑&#xff0c;从基建、硬件、软件、算法、服务等全环节开展关键技术落地与应用。 一、体系架构 &#xf…

基于扩散的生物打印策略,控制可打印性和结构特性

基于扩散的生物打印策略&#xff0c;控制可打印性和结构特性 在生物打印中&#xff0c;将生物材料和细胞按特定设计逐层堆积&#xff0c;构建具有复杂结构和功能的三维组织结构。微挤出生物打印是最常用的方法&#xff0c;其核心是生物墨水&#xff0c;它由聚合物材料和细胞组…

国漫推荐02

童年经典 1.《雷速登闪电冲线》赛车、竞赛 2.《雷速登之翼飞冲天》直升机、竞赛 3.《纳米神兵》该剧进述11岁少年小光如何用自己的善良和热忱感化原本企图侵略地球的外星族群&#xff0c;并带领他们一同对抗其他邪恶的外星人&#xff0c;由此一步步成长为拯救地球和人类的英雄…

在线绘图小工具

在线绘图小工具 文章说明程序源码功能展示源码下载 文章说明 本文主要是在看了袁老师的canvas绘图小视频后所写&#xff0c;记录一个简单的canvas绘图功能&#xff0c;并学习一下较为传统的JavaScript事件写法&#xff0c;同时了解一下拖拽事件的更合理写法&#xff0c;等待后续…

C++相关概念和易错语法(18)(array、模板)

1.array &#xff08;1&#xff09;普通数组的劣势 当我们直接越界修改值时&#xff0c;一般会在编译时就被拦截 但是越界访问&#xff0c;只要访问距离不算特别大&#xff0c;那么也可以越界访问 当我们不直接越界修改或访问&#xff0c;间接去访问和修改能越界非常远 这里的…

翻牌器单独设置前后缀样式

翻牌器单独设置前后缀样式 <template><div :style"[fontStyle,styleBackGroundColor]"><!-- <span style"color: #1d1d1d"> {{optionData}}</span>--><!-- 设置前缀样式 --><span class"prefix" …

【面试题】MySQL(第四篇)

1.详细说一下一条 MySQL 语句执行的步骤 Server 层按顺序执行 SQL 的步骤为&#xff1a; 客户端请求 -> 连接器&#xff08;验证用户身份&#xff0c;给予权限&#xff09; 查询缓存&#xff08;存在缓存则直接返回&#xff0c;不存在则执行后续操作&#xff09; 分析器&a…

怎么样的主食冻干算好冻干?品质卓越、安全可靠的主食冻干分享

当前主食冻干市场产品质量参差不齐。一些品牌过于追求营养数据的堆砌和利润的增长&#xff0c;却忽视了猫咪健康饮食的基本原则&#xff0c;导致市场上出现了以肉粉冒充鲜肉、修改产品日期等不诚信行为。更令人担忧的是&#xff0c;部分产品未经过严格的第三方质量检测便上市销…