利器 | 测试必会之 Linux 三剑客 ( grep / awk / sed )

Linux 给人的印象是黑乎乎的神秘窗口,文本操作和数据处理似乎没有 Windows 窗口界面直观方便。其实Linux 有自己的独特的法宝,称之为三剑客:grep,awk 和 sed。你可以用这三件法宝很方便的处理数据 :查找,分段,修改,而这三个功能对应着我们今天的主角:grep,awk,sed。

形象一点比喻,如果把数据比作人群,那么 grep 就是照妖镜,用来找出妖精;awk 就是尺子,给人群分门别类;而 sed 就是宝剑,用来除掉妖精。当你明白为什么要用三剑客时,就更容易拿这三把剑去斩妖除魔。

1. grep

grep-global regular expression print - 全局正则表达式打印
可用于数据查找定位

先列举出测试工作常用的grep命令和意义:

  1. grep pattern file

  2. grep -i pattern file 忽略大小写

  3. grep -v pattern file 不显示匹配行

  4. grep -o pattern file 只把每个匹配的内容独立的行显示

  5. grep -E pattern file 使用拓展正则表达式

  6. #注意:grep 'a[0-9]\{10\}' 等同于 grep -E 'a[0-9]{10}'

  7. grep -A -B -C pattern file 打印命中数据的上下文

  8. grep pattern -r dir/ 递归搜索

  9. grep -m1 匹配匹配中的第一个

  10. grep -n 顺便输出行号

下面以一个检查首页是否有死链的案例需求来展示 grep 的匹配用法

以目前国内最大的测试社区网站 testerhome 为例,访问 testerhome 主页,找出主页中包含的左右 url,分别进行访问,如果访问成功会返回状态码200,检查所有访问成功的url并打印出来,若没访问成功就打印ERR加上失败的url。

1.先访问 Testerhome 社区主页,利用 grep href 过滤出所有包含 url 的内容。命令:

curl -s https://testerhome.com | grep href

图片

2.从返回的结果中取出 url,观察发现所有的 url 都被包在了双引号之中,那么在利用 grep -o 命令,加上正则表达式匹配,只打印从 http 开始到 url 结束双引号之前的内容。命令:

curl -s https://testerhome.com | grep href | grep -o "http[^\"]*"

在这里插入图片描述

3.从上一步中我们已经取出了完整的 url 了,现在我们需要对每个url进行访问取值判断

3.1. 先用curl -I 看看请求返回的头信息内容。命令:

curl -s -I https://testerhome.com/topics/feed

图片

3.2. 访问成功返回200,这时候我们一行一行去访问,再用grep命令匹配"200 OK"作为判断条件,筛选出成功的url并打印,然后将失败的 url 加上 ERR 标记也一起打印出来。命令

curl -s https://testerhome.com | grep href | grep -o "http[^\"]*" | while read line;do curl -s -I $line | grep 200 && echo $line || echo ERR $line;done

4.最终结果展示

图片

2. awk

awk = “Aho Weiberger and Kernighan” 三个作者的姓的第一个字母
awk 是 Linux 下的一个命令,同时也是一种语言解析引擎
awk 具备完整的编程特性。比如执行命令,网络请求等
精通 awk,是一个 Linux 工作者的必备技能
语法:awk ‘pattern{action}’

awk pattern语法

awk 理论上可以代替 grep

awk ‘pattern{action}’ ,默认以空格分隔

  1. awk ‘BBEGIN{}END{}’ 开始和结束

  2. awk ‘/Running/’ 正则匹配

  3. awk ‘/aa/,/bb/’ 区间选择

  4. awk ‘$2~/xxx/’ 字段匹配,这里指从第2个字段开始匹配包含xxx内容的行

  5. awk ’NR==2’ 取第二行

  6. awk ’NR>1’ 去掉第一行

awk的字段数据处理

-F 参数指定字段分隔符

BEGIN{FS=‘_’} 也可以表示分隔符

  1. $0 代表原来的行

  2. $1 代表第一个字段

  3. $N 代表第N个字段

  4. $NF 代表最后一个字段

下面以一个在nginx.log中查找返回状态码非200的请求响应数目的需求为例,演示awk的基础用法

有一份nginx.log文件,打开后内容格式如下:

  1. 220.181.108.111 - - [05/Dec/2018:00:11:42 +0000] "GET /topics/15225/show_wechat HTTP/1.1" 200 1684 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" 0.029 0.029 .

  2. 216.244.66.241 - - [05/Dec/2018:00:11:42 +0000] "GET /topics/10052/replies/85845/reply_suggest HTTP/1.1" 301 5 "-" "Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)" 0.016 0.016 .

  3. 216.244.66.241 - - [05/Dec/2018:00:11:42 +0000] "GET /topics/10040?order_by=created_at HTTP/1.1" 301 5 "-" "Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)" 0.002 0.002 .

  4. 216.244.66.241 - - [05/Dec/2018:00:11:42 +0000] "GET /topics/10043/replies/85544/reply_suggest HTTP/1.1" 301 5 "-" "Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)" 0.001 0.001 .

  5. 216.244.66.241 - - [05/Dec/2018:00:11:44 +0000] "GET /topics/10075/replies/89029/edit HTTP/1.1" 301 5 "-" "Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)" 0.001 0.001 .

  6. 216.244.66.241 - - [05/Dec/2018:00:11:44 +0000] "GET /topics/10075/replies/89631/edit HTTP/1.1" 301 5 "-" "Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)" 0.001 0.001 .

  7. 216.244.66.241 - - [05/Dec/2018:00:11:45 +0000] "GET /topics/10075?order_by=created_at HTTP/1.1" 301 5 "-" "Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)" 0.000 0.000 .

  8. 216.244.66.241 - - [05/Dec/2018:00:11:45 +0000] "GET /topics/10075?order_by=like HTTP/1.1" 301 5 "-" "Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)" 0.001 0.001 .

  9. 223.71.41.98 - - [05/Dec/2018:00:11:46 +0000] "GET /cable HTTP/1.1" 101 60749 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0" 2608.898 2608.898 .

  10. 113.87.161.17 - - [05/Dec/2018:00:11:39 +0000] "GET /cable HTTP/1.1" 101 3038 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36" 112.418 112.418 .

  11. 216.244.66.241 - - [05/Dec/2018:00:11:46 +0000] "GET /topics/10079/replies/119591/edit HTTP/1.1" 301 5 "-" "Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)" 0.001 0.001 .

  12. 216.244.66.241 - - [05/Dec/2018:00:11:46 +0000] "GET /topics/10089?locale=zh-TW HTTP/1.1" 301 5 "-" "Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)" 0.002 0.002 .

观察log内容,可以发现,以空格为分隔符,状态码在第九个字段位置;这里我们用awk命令从第九个字段位置开始匹配非200的状态码并打印出来。命令:

awk '$9!~/200/{print $9}' nginx.log
  1. [avbxb9efockpz ~]$ awk '$9!~/200/{print $9}' nginx.log301

  2. 301

  3. 301

  4. 301

  5. 301

  6. 301

  7. 301

  8. 301

  9. 301

  10. ......#剩余部分省略

再对取出的数据进行排序->去重->按数字的倒叙进行排列。命令:

awk '$9!~/200/{print $9}' nginx.log | sort | uniq -c | sort -nr

命令含义:

 
  1. sort: 按从小到大进行排序

  2. uniq -c :去重(相邻)

  3. -nr: 按数字进行倒叙排序

  4. -n:按数字进行排序

结果展示:

 
  1. [sqavbxb9efockpz ~]$ awk '$9!~/200/{print $9}' nginx.log | sort | uniq -c | sort -nr

  2. 433 101

  3. 304 301

  4. 266 404

  5. 152 302

  6. 7 401

  7. 5 304

  8. 2 499

  9. 2 422

  10. 1 500

再结合 awk ‘BBEGIN{}END{}’ 命令,以统计当前用户数目的例子来展示命令用法

使用cat /etc/passwd命令来查看本机用户,我们需要提取出用户名称并加上数字序号显示出来,达到这种效果:

 
  1. 1 nobody2 root

  2. 3 daemon

  3. 4 _uucp

  4. 5 _taskgated

  5. 6 _networkd

  6. 7 _installassistant

  7. 8 _lp

  8. 9 _postfix

  9. ......

用户信息:

 
  1. localhost:~ qinzhen$ cat /etc/passwd

  2. ##

  3. # User Database

  4. #

  5. # Note that this file is consulted directly only when the system is running

  6. # in single-user mode. At other times this information is provided by

  7. # Open Directory.

  8. #

  9. # See the opendirectoryd(8) man page for additional information about

  10. # Open Directory.

  11. ##

  12. nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false

  13. root:*:0:0:System Administrator:/var/root:/bin/sh

  14. daemon:*:1:1:System Services:/var/root:/usr/bin/false

  15. _uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico

  16. _taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false

  17. _networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false

  18. _installassistant:*:25:25:Install Assistant:/var/empty:/usr/bin/false

  19. _lp:*:26:26:Printing Services:/var/spool/cups:/usr/bin/false

  20. _postfix:*:27:27:Postfix Mail Server:/var/spool/postfix:/usr/bin/false

  21. _scsd:*:31:31:Service Configuration Service:/var/empty:/usr/bin/false

  22. _ces:*:32:32:Certificate Enrollment Service:/var/empty:/usr/bin/false

  23. _appstore:*:33:33:Mac App Store Service:/var/empty:/usr/bin/false

  24. _mcxalr:*:54:54:MCX AppLaunch:/var/empty:/usr/bin/false

  25. ......#后面的省略

思路:

 
  1. * awk运行前先定义序号索引0,用来递增保存用户

  2. * 利用awk将用户提取出来,按索引分别保存;

  3. * 切片结束后再按行数进行循环,将数字序号与第一步保存的信息拼接打印

  4. * 注意:cat /etc/passwd打印出的结果中,最上方的注释需要处理跳过

cat /etc/passwd | awk -F ':' 'BEGINE{userindex=0}{user[userindex]=$1;userindex++}END{for(i=0;i<NR;i++)print i+1, user[i+10]}' |less

在这里插入图片描述

3. sed

sed:stream editor 根据定位到的数据行修改数据

 
  1. sed [-nefri] [动作]

  2. 参数:

  3. -n :使用安静(slient)模式。只有经过sed特殊处理的那一行(或者操作)才会被列出来。一般与p配合使用

  4. -e :直接在命令行模式上进行sed的动作编辑

  5. -f :直接将sed动作写在一个文件内,-f filename则可以执行filename 内的sed动作。

  6. -r :sed的动作支持的是拓展正则表达式的语法(默认是基础正则表达式的语法)

  7. -i :直接修改读取的文件内容,而不是由屏幕输出

  8. 动作说明:[[n1][,n2]]function

  9. n1,n2 :不见得会存在,一般代表选择进行动作的行数,举例来说,如果我的动作是需要在10到20之间进行的,则“10,20[动作行为]”

  10. function有下面这些参数:

  11. a :新增

  12. d :删除 (比较重要,测试工作中对数据处理时可快速去除无用信息,比如注释行,空白行等)

  13. i :插入

  14. p :打印 (一般与-n配合使用)

  15. s :替换(重中之重!!!,s参数可以说是日常测试工作中对数据用sed清理过滤时使用率最高的了)

sed 修改表达式:sed ‘s/待修改/修改结果/’

注意说明:

表达式单引号中的s表示修改,/ 符号表示分隔,实际上将/换成其他符号也可以,只要能起到分隔作用就OK

 
  1. [16210504@izuf60jasqavbxb9efockpz ~]$ echo "aaa|bbb}|cccbbb" | sed 's/bbb/BBB/'

  2. aaa|BBB}|cccbbb

  3. [16210504@izuf60jasqavbxb9efockpz ~]$ echo "aaa|bbb}|cccbbb" | sed 's#bbb#BBB#'

  4. aaa|BBB}|cccbbb

若想讲目标中所有的字段都替换,需要在命令最后加上g:

 
  1. [16210504@izuf60jasqavbxb9efockpz ~]$ echo "aaa|bbb}|cccbbb" | sed 's/bbb/BBB/g'

  2. aaa|BBB}|cccBBB

sed还可以修改文件中的内容,现在有文件text.txt,内容如下:

 
  1. [16210504@izuf60jasqavbxb9efockpz ~]$ cat text.txt

  2. hello bash world

  3. hi~ tester

  4. go go go go!

用sed ‘s/hello/HELLO/’ text.txt 命令将文件中的hello替换成HELLO:

 
  1. [16210504@izuf60jasqavbxb9efockpz ~]$ sed 's/hello/HELLO/' text.txt

  2. HELLO bash world

  3. hi~ tester

  4. go go go go!

但是此时我们打开源text.txt文件发下源文件内容并未改变:

 
  1. [16210504@izuf60jasqavbxb9efockpz ~]$ cat text.txt

  2. hello bash world

  3. hi~ tester

  4. go go go go!

注意说明:

sed 在修改文件内容时,是另外开辟了一块模式空间,将修改后的内容放入并输出,源文件并未修改;

这时如果想要修改源文件就需要借助-i命令,另外为了防止误操作修改文件,一般可以采取这种写法:sed -i.bak ‘s/hello/HELLO/’ text.txt,这种写法在修改源文件的同时还会生成一份以.bak结尾的备份文件,相较安全。

 
  1. [16210504@izuf60jasqavbxb9efockpz ~]$ sed -i.bak 's/hello/HELLO/' text.txt

  2. [16210504@izuf60jasqavbxb9efockpz ~]$ ls

  3. 1 1.sh Allen_qin nginx.log test text.txt text.txt.bak while_test

  4. [16210504@izuf60jasqavbxb9efockpz ~]$ cat text.txt

  5. HELLO bash world

  6. hi~ tester

  7. go go go go!

  8. [16210504@izuf60jasqavbxb9efockpz ~]$ cat text.txt.bak

  9. hello bash world

  10. hi~ tester

  11. go go go go!

sed -e命令可以直接在命令行模式上进行sed的动作编辑,但看解释比较晦涩,来看一个实例:

需求: 现有一个1.txt的文本,内容如下:

 
  1. a:

  2. b:

  3. c:

  4. d:

要将其中每行末尾的:都替换成@,将a替换成A,并在文本末尾加上“Sed Test”
命令:

 
  1. sed -i -e 's/:/@/g' \

  2. -i -e 's/a/A/' \

  3. -i -e '$a Sed Test' 1.txt

实例演示:

 
  1. [16210504@izuf60jasqavbxb9efockpz ~]$ sed -i -e 's/:/@/g' -i -e 's/a/A/' -i -e '$a Sed Test' 1.txt

  2. [16210504@izuf60jasqavbxb9efockpz ~]$ cat 1.txt

  3. A@

  4. b@

  5. c@

  6. d@

  7. Sed Test

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

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

相关文章

【中间件】docker数据卷

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;中间件 ⛺️稳中求进&#xff0c;晒太阳 1.数据卷&#xff08;容器数据管理&#xff09; 修改nginx的html页面时&#xff0c;需要进入nginx内部。并且因为内部没有编辑器&#xff0c;修改…

Redis - 高并发场景下的Redis最佳实践_翻过6座大山

文章目录 概述6座大山之_缓存雪崩 &#xff08;缓存全部失效&#xff09;缓存雪崩的两种常见场景如何应对缓存雪崩&#xff1f; 6座大山之_缓存穿透&#xff08;查询不存在的 key&#xff09;缓存穿透的原因解决方案1. 数据校验2. 缓存空值3. 频控4. 使用布隆过滤器 6座大山之_…

Java项目:73 ssm档案管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 角色&#xff1a;管理员、用户 用户点击进入到系统操作界面&#xff0c;可以对个人中心、警察信息管理、事故信息管理、申诉信息管理等功能模…

基于java+springboot+vue实现的医院门诊信息管理系统(文末源码+Lw+ppt)23-325

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对医院门诊信息的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而…

微服务高级篇(四):多级缓存:Nginx本地缓存 --- Redis缓存 --- 进程缓存

文章目录 一、多级缓存概念二、准备工作【导入案例&#xff0c;并搭建Nginx反向代理】2.1 导入商品案例2.1.1 安装MySQL2.1.2 导入SQL2.1.3 导入Demo工程2.1.4 启动2.1.5 导入商品查询页面 三、JVM进程缓存【第三级缓存】3.1 本地进程缓存与分布式缓存的区别3.2 本地进程缓存&a…

DC-4靶机

一.环境搭建 1.下载地址 靶场下载地址:https://download.vulnhub.com/dc/DC-4.zip 下载不下来用迅雷下载 2.虚拟机配置 切换为nat模式 开启靶机&#xff0c;遇到所有的错误直接点重试或者是&#xff0c;开启后呈现为下图即可 二.开始渗透 1.信息收集 老规矩&#xff0c;…

【排序算法】插入排序与选择排序详解

文章目录 &#x1f4dd;选择排序是什么&#xff1f;&#x1f320;选择排序思路&#x1f309; 直接选择排序&#x1f320;选择排序优化&#x1f320;优化方法&#x1f309;排序优化后问题 &#x1f320;选择排序效率特性 &#x1f309;插入排序&#x1f320;插入排序实现 &#…

简单了解单例模式

什么是单例模式 对于一个类&#xff0c;只有一个实例化的对象&#xff0c;我们构建单例模式一般有两种&#xff1a;饿汉式和懒汉式 饿汉式 优点是无线程安全问题&#xff0c;类加载就创建对象缺点是占内存 class Singleton01{private static Singleton01 instance new Sing…

【JavaScript】JavaScript 程序流程控制 ⑥ ( while 循环概念 | while 循环语法结构 )

文章目录 一、while 循环1、while 循环概念2、while 循环语法结构 二、while 循环 - 代码示例1、打印数字2、计算 1 - 10 之和 一、while 循环 1、while 循环概念 在 JavaScript 中 , while 循环 是一种 " 循环控制语句 " , 使用该语句就可以 重复执行一段代码块 , …

瑞_Redis_商户查询缓存_什么是缓存

文章目录 项目介绍1 短信登录2 商户查询缓存2.1 什么是缓存2.1.1 缓存的应用场景2.1.2 为什么要使用缓存2.1.3 Web应用中缓存的作用2.1.4 Web应用中缓存的成本 附&#xff1a;缓存封装工具类 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《Redis》的实战篇的商户查询缓…

C语言---------strlen的使用和模拟实现

字符串是以‘\0’作为结束标志&#xff0c;strlen函数的返回值是‘\0’前面的字符串的个数&#xff08;不包括‘\0’&#xff09; 注意 1&#xff0c;参数指向的字符串必须以‘\0’结束 2&#xff0c;函数的返回值必须以size_t,是无符号的 使用代码 ​ #include<stdio.…

学习刷题-13

3.23 hw机试【二叉树】 剑指offer32 剑指 offer32&#xff08;一、二、三&#xff09;_剑指offer 32-CSDN博客 从上到下打印二叉树I 一棵圣诞树记作根节点为 root 的二叉树&#xff0c;节点值为该位置装饰彩灯的颜色编号。请按照从 左 到 右 的顺序返回每一层彩灯编号。 输…

学习vue3第十一节(依赖注入:provide/inject)

本机介绍&#xff1a;provide/inject 注意&#xff1a;大家在看此小节时候&#xff0c;默认大家已经了解一些组件的使用方法 1、依赖注入的用途&#xff1a; 当嵌套层级多的时候&#xff0c;某个子组件需要较远层级的父组件数据时候&#xff0c;如果我们依然使用props 传递数…

关系型数据库mysql(6)备份与恢复

一.数据备份的重要性 &#xff08;1&#xff09;在生产环境中&#xff0c;数据的安全性至关重要 &#xff08;2&#xff09;任何数据的丢失都可能产生严重的后果 &#xff08;3&#xff09;造成数据丢失的原因 程序错误人为操作失误运算错误磁盘故障灾难&#xff08;如火灾…

背景减除(1)--bgslibrary Windows编译和使用

入侵监控领域中&#xff0c;在固定场景下&#xff0c;需要检测和监控的入侵物体种类繁多&#xff0c;无法具体穷尽。传统的CV算法提取的特征应用场景有限&#xff0c;无法完成大量物体的监控&#xff1b;深度学习目标检测方法没法收集到无穷无尽的物体种类&#xff0c;因此监督…

C语言----strcpy和strcat的使用和模拟实现

一&#xff0c;strcpy()函数 strcpy() 函数是 C语言中一个非常重要的字符串处理函数&#xff0c;其功能是将一个字符串复制到另一个字符串中。该函数原型如下&#xff1a; char*strcpy(char*dest,const char*src) 其中&#xff0c;dest 表示目标字符串&#xff0c;即将被复制到…

【HDFS】DatanodeAdminBackoffMonitor退役节点极慢的问题定位

一、现象: 下节点特别慢。10台节点,每台大约需要退役60w个块。但是3个小时才退役了3000多个块。 NN侧如下日志,可以看到30秒只退役了512-494 = 20个块,这要是退役600w个块,得猴年马月? 2024-03-19 14:44:42,952 INFO org.apache.hadoop.hdfs.server.blockmanagement.D…

浅析扩散模型与图像生成【应用篇】(十一)——DDIBs

11. Dual Diffusion Implicit Bridges for Image-to-Image Translation 该文提出一种双扩散隐式桥&#xff08;Dual Diffusion Implicit Bridges&#xff0c; DDIBs&#xff09;方法用于图像转换&#xff0c;其最大的特点在于处理源域图像的模型和处理目标域图像的模型是彼此分…

华为防火墙二层墙(VAN/SVI/单臂路由)

二层墙只能做地址池形式的NAT。 交换机安全策略防火墙二层墙 路由器安全策略防火墙三层墙 交换机的光口是不能直接插线的&#xff0c;光模块&#xff0c;包括进和出 长距离&#xff1a;单模 短距离&#xff1a;多模 防火墙自身的ping流量需要单独配置

一篇复现Docker镜像操作与容器操作

华子目录 Docker镜像操作创建镜像方式1docker commit示例 方式2docker import示例1&#xff1a;从本地文件系统导入示例2&#xff1a;从远程URL导入注意事项 方式3docker build示例1&#xff1a;构建镜像并指定名称和标签示例2&#xff1a;使用自定义的 Dockerfile 路径构建镜像…