首页 文章 精选 留言 我的

精选列表

搜索[技术极客],共10000篇文章
优秀的个人博客,低调大师

'三剑客'之Swarm集群架构、集群管理 、服务管理

1.前言 在看过笔者之前关于Docker的文章后,我相信大家对Docker的内功心法以及对Docker相关武器都有了深刻的认识。在企业玩玩Docker大家也不成问题。但是呢,这些心法和武器往往还是不够了。 因为,在Docker应用越来越深入的时代,把调度粒度停在单个容器上是非常没有效率的。同样地,在提高对Docker宿主机管理效率和利用率的方向上,选择集群化管理方式才是正常的道路。我们是时候从更高的抽象层次上来使用Dokcer了,Swarm和Kubernetes将来满足我们的愿景和需求。 然而,本文的重点内容在于分享Swarm;可能有些朋友会问,为什么不分享一下Kubernetes呢,别着急。常言道:路得一步一步走,饭要一口一口吃。Kubernetes比较难理解,所以咋们先把Swarm玩明白了之后在来玩Kubernetes会顺畅很多。 2.swarm概念 Swram是Docker公司推出的官方容器集群平台,基于go语言实现,代码开源在 https://github.com/docker/swarm .2016年2月对架构进行重新设计,推出了v2版本,支持超过1千个节点。作为容器集群管理器,Swarm最大的优势之一就是100%支持标准的Docker API及工具(如Compose,docker-py等),Docker本身就可以很好地与Swarm进行集成。 我们来看下Swarm做了什么?试想一下目前操作docker集群的方式,用户必须单独对每一个容器执行命令,如下图所示: 有了Swarm后,使用多台Docker宿主机的方式就变成了如下图的形式: 2.1.swarm集群 从上图可以看出,Swarm有两个角色(Manager、agent(也可称为worker)),简单说一下这两个角色的作用: Manager:接收客户端服务定义,将任务发送到agnet节点,维护集群期望状态和集群管理功能以及leader选举。默认情况下manager节点也会运行任务,也可以配置只做管理任务。 agent:接收并执行从管理节点分配的任务,并报告任务当前的状态,以便Manager节点维护每个服务期望状态。 从上图还可以看出,Manager收到的请求可发细分为4大类: 第一类,针对已创建容器的操作,Swarm只是起到一个转发请求到特定宿主机的作用。 第二类,针对Docker镜像的操作。 第三类,创建新的容器docker create这一命令,其中涉及的集群调度会在下面的内容中分享; 第四类,其他获取集群整体信息的操作,比如获取所有容器信息、查看Docker版本等。 2.2swarm集群调度策略 Swarm管理了多台Docker宿主机,用户在这些宿主机上创建容器时,究竟会与哪台宿主机产生交互呢? 2.2.1 Filter Swarm的调度策略可以按照指定调度策略分配容器到节点,但是有时候希望能对这些分配加以干预。比如,让I/O敏感的容器分配到安装了SSD的节点上;让计算敏感的容器分配到CPU核数多的机器上;让网络敏感的容器分配到高带宽的机房上,等等。 这时可以通过过滤器(filter)来实现,,用来帮助用户筛选出符合他们条件的宿主机。目前支持五种过滤器: Constraint Affinity Port Dependency Health 本文为大家介绍前两种过滤器。 1、Constraint过滤器 Constraint过滤器是绑定到节点的键值对,相当于给节点添加标签。可以在启动Docker容器的时候指定,使用swarm启动容器的时候,采用-e constarint:key=value的形式,可以过滤出匹配条件的节点。 下面用个场景为例,我们将分别启动两个容器busybox容器,分别使用过滤器打上红色标签、绿色标签。 #docker service create --replicas 1 -e constraint:color=red busybox ping 127.0.0.1 #docker service create --replicas 1 -e constraint:color=green busybox ping 127.0.0.1 如果目前大家看着上面的命令不太理解,等看完了这篇文章之后,在回过头来看上面的命令就会明白了。 2、Affinity过滤器 Affinity过滤器允许用户在启动一个容器的时候,让它分配到某个已有容器的节点上。 2.2.2 strategy 使用了filter之后,Swarm还提供了strategy(策略)来选出最终运行容器的宿主机,目前swarm已经提供了有如下几种策略: random策略:random就是在候选宿主机中(agnet中)随机选择一台的策略; binpacking策略:binpacking则会在权衡宿主机CPU和内存的占用率之后选择能分配到最大资源的那台候选宿主机; spread策略:spread尝试把每个容器平均地部署到每个节点上。 与此同时,调度策略支持对节点的信任机制,如果一个节点总是处于工作状态,没有失败连接的情况,那么相同条件下,该节点将会优先被选择。目前对宿主机资源的调度策略还在不断开发中,使用filter和strategy这种组合方式,对容器的部署仍然保留了Docker宿主机粒度的操作,已能满足大多数的需求了。 3.swarm集群部署 3.1 集群环境 服务器 角色 docker版本 系统版本 172.18.18.32 Manager docker 17.12.0-ce centos7.4 x64 172.18.18.33 agent01 docker 17.12.0-ce centos7.4 x64 172.18.18.34 agent02 docker 17.12.0-ce centos7.4 x64 说明: Docker版本需要1.12+及以上; 集群节点之间保证TCP 2377(集群管理)、TCP/UDP 7946(容器网络发现)、UDP 4789(overlay网络)端口通信; 3.2 准备环境 1、安装docker:需要在Manager和所有agent节点上都安装docker engine,安装方法不详细介绍,可参考 《docker环境安装(Ubuntu、Centos)》 2、配置iptables,开放相关端口(2379、7946、4789):需要在Manager和所有agent节点都进行配置,如果你没有启动iptables服务,可忽略此步: [root@Manager ~]# iptables -I INPUT -s 172.18.18.0/24 -j ACCEPT [root@agent01 ~]# iptables -I INPUT -s 172.18.18.0/24 -j ACCEPT [root@agnet02 ~]# iptables -I INPUT -s 172.18.18.0/24 -j ACCEPT 由于环境都是内网中,环境比较安全,我这里就直接配置一条策略对172.18.18.0整个网段都开放了,当然,你也可以按照下面的策略逐条的配置: #iptables -I INPUT -s 172.18.18.0/24 -p tcp --dport 2379 -j ACCEPT #iptables -I INPUT -s 172.18.18.0/24 -p tcp --dport 7946 -j ACCEPT #iptables -I INPUT -s 172.18.18.0/24 -p udp --dport 7946 -j ACCEPT #iptables -I INPUT -s 172.18.18.0/24 -p udp --dport 4789 -j ACCEPT 3.3 初始化swarm集群 1、swarm管理节点初始化,在Manager操作,非常简单的一条命令: [root@Manager ~]# docker swarm init --advertise-addr 172.18.18.32 Swarm initialized: current node (jxw920bzistlqnn5webytua87) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-2mkrlpdbxuo00hyf97e91cy7ehxs1hut28hne905d6eq3y0pqp-ct7xdzcda003ceah8xp42brho 172.18.18.32:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. 参数说明:init:初始化swarm集群;--advertise-addr:通告地址,告知其它swarm节点通过172.18.18.32加入swarm集群; 注意:初始化swarm之后,会给出一条命令信息,agent节点通过给出的命令信息加入到swarm集群中:docker swarm join --token SWMTKN-1-2mkrlpdbxuo00hyf97e91cy7ehxs1hut28hne905d6eq3y0pqp-ct7xdzcda003ceah8xp42brho 172.18.18.32:2377 2、agnet节点加入swarm集群: [root@agent01 ~]# docker swarm join --token SWMTKN-1-2mkrlpdbxuo00hyf97e91cy7ehxs1hut28hne905d6eq3y0pqp-ct7xdzcda003ceah8xp42brho 172.18.18.32:2377 This node joined a swarm as a worker. [root@agnet02 ~]# docker swarm join --token SWMTKN-1-2mkrlpdbxuo00hyf97e91cy7ehxs1hut28hne905d6eq3y0pqp-ct7xdzcda003ceah8xp42brho 172.18.18.32:2377 This node joined a swarm as a worker. 通过上面的信息可以看出,agent两个都已加入swarm,是不是swarm集群配置很简单。在Manager上查看一下agnet节点是否加入进来了: [root@Manager ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS jxw920bzistlqnn5webytua87 * Manager Ready Active Leader fjf78k25qr4qchanc63atpn9q agent01 Ready Active 9e69g7gfuptfyiyrjfq41tckv agnet02 Ready Active 通过docker node ls命令可以得到(ID信息、主机名、节点状态、是否可用以及谁是管理节点),一目了然,下面我们来了解一下swarm集群管理的主要命令有哪些。 3.3 swarm集群命令 通过 docker --help来了解一下,swarm常用的有这几选项: docker node:用来管理swarm节点 docker service:用来管理swarm服务(创建服务、查看服务详细信息、删除和升级服务等) docker stack:用来管理swarm堆栈(可以结合compose.yml一起使用) docker swarm:管理swarm(初始化swarm集群、加入swarm集群、离开swarm集群等) 在来通过docker node --help来了解这个选项有哪些命令:命令说明: demote:从集群中降级一个或多个节点; inspect:在一个或多个节点上显示详细信息; ls:列出群中的节点; prromote:将一个或多个节点提升为Manager; ps:列出在一个或多个节点上运行的任务,默认为当前节点; rm:从群中删除一个或多个节点; update:更新节点; 其实,这些命令和管理docker镜像和容器的命令作用都很相似,所以大家如果在管理docker镜像、容器的这些命令比较熟悉,就自然而然的对swarm这些命令用起来顺手。其它几个选项就不挨个介绍了,大家可以通过 --help去查看了解; 4.swarm服务管理 下面通过busybox镜像来创建服务进行演示,当然你也可以用其它镜像操作(比如centos镜像、nginx镜像等)。swarm服务管理是通过 “docker service”命令进行管理的,以下操作只能在Manager节点操作。 4.1 通过docker service create 命令创建服务 [root@Manager ~]# docker service create --replicas 1 --name test01 busybox top 8xvp5453ostkjhzcy0u91ko6g overall progress: 1 out of 1 tasks 1/1: running verify: Service converged 参数数明:--replicas :创建的副本数,我这里先创建1个副本;--name:容器名称取名为test01busybox:这个是docker hub中的一个官方镜像;top:通过busybox镜像运行容器后执行的top命令,因为busybox镜像运行后没有任何进程在跑,如果不在后台跑个进程容器会自动退出,如果你用其它的官方镜像就不需要这种操作,所以我们随便跑个top进程; 4.2 通过docker service ps 查看副本运行情况 [root@Manager ~]# docker service ps test01 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS iwadbu4vyvor test01.1 busybox:latest agnet02 Running Running 4 minutes ago 是不是发现这个服务被分配到了agent02节点上,状态显示也是Running,而且,这个命令和docker ps很相似。但是,你用docker ps是查看不到这个运行test01这个服务。 4.3 显示服务详细信息 [root@Manager ~]# docker service inspect test01 [root@Manager ~]# docker service inspect --pretty test01 上面--pretty参数是以人性化的格式打印信息,不加--pretty参数就是以json打印信息; 4.4 扩展服务数量 接下来,我们来演示一下如何把刚才创建的1个test01副本怎么扩展为3个。 [root@Manager ~]# docker service scale test01=3 test01 scaled to 3 overall progress: 3 out of 3 tasks 1/3: running [==================================================>] 2/3: running [==================================================>] 3/3: running [==================================================>] verify: Service converged 查看一下是否已扩展了: [root@Manager ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS 8xvp5453ostk test01 replicated 3/3 busybox:latest [root@Manager ~]# docker service ps test01 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS iwadbu4vyvor test01.1 busybox:latest agnet02 Running Running 40 minutes ago im6263jsap6l test01.2 busybox:latest agent01 Running Running 2 minutes ago 12r1xk6v8epw test01.3 busybox:latest Manager Running Running 30 seconds ago 从上面可以看出,扩展的服务分别分配到了两台agnet和一台Manager。也就是说Manager它即可以管理agent、也同样承担运行服务的角色。 4.5 更新服务某些项 比如,我想更新一下test01这几个副本的CPU只能使用宿主机50%的CPU资源 [root@Manager ~]# docker service update --limit-cpu=0.5 test01 然后,查看一下是否更新了,在Limits信息栏中可以看到已经更新了: [root@Manager ~]# docker service inspect test01 ... "Resources": { "Limits": { "NanoCPUs": 500000000 }, ... 通过docker service update --help查看帮助信息,里面有所有update更新的选项(dns、memory、mount、user等等),本文就不一一介绍演示了,大家--help一下自己看看。 4.6滚动更新、回滚更新服务版本 docker srvice update有一个比较重要的参数要演示一下,它可以对镜像版本进行更新和回滚,比如先创建一个nginx-1.11.5版本的服务,然后通过docker service update --image选项更新到nginx-1.11.6。 [root@Manager ~]# docker service create --replicas 3 --name web_test -p 80:80 nginx:1.11.5 看一下nginx服务是否运行: [root@Manager ~]# docker service ps web_test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS vz1twcdbpaut web_test.1 nginx:1.11.5 agent01 Running Running 4 minutes ago kmcdo4cifygf web_test.2 nginx:1.11.5 agnet02 Running Running 5 minutes ago ipynj6l9hegu web_test.3 nginx:1.11.5 Manager Running Running 3 minutes ago 接下来,我们通过--image选项把nginx更新到版本1.11.6: [root@Manager ~]# docker service update --image nginx:1.11.6 web_test 查看一下更新后的信息: [root@Manager ~]# docker service ps web_test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS js9tvwk3ffg9 web_test.1 nginx:1.11.6 agent01 Running Running 2 minutes ago vz1twcdbpaut \_ web_test.1 nginx:1.11.5 agent01 Shutdown Shutdown 2 minutes ago mhbd0fdpofq8 web_test.2 nginx:1.11.6 agnet02 Running Running 3 minutes ago kmcdo4cifygf \_ web_test.2 nginx:1.11.5 agnet02 Shutdown Shutdown 4 minutes ago jswemeuox4yk web_test.3 nginx:1.11.6 Manager Running Running about a minute ago ipynj6l9hegu \_ web_test.3 nginx:1.11.5 Manager Shutdown Shutdown about a minute ago 从上面可以看出,DESIRED STATE状态为Shutdown的服务版本为1.15,状态为Running的服务版本为1.16了,说明更新是OK的。 最后,来演示一下通过--rollback选项如何回滚服务版本: [root@Manager ~]# docker service update --rollback web_test web_test rollback: manually requested rollback overall progress: rolling back update: 3 out of 3 tasks 1/3: running [> ] 2/3: running [> ] 3/3: running [> ] verify: Service converged 再来看一下是否回滚: [root@Manager ~]# docker service ps web_test ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS vrwxibtkjhvg web_test.1 nginx:1.11.5 agent01 Running Running 2 minutes ago js9tvwk3ffg9 \_ web_test.1 nginx:1.11.6 agent01 Shutdown Shutdown 2 minutes ago vz1twcdbpaut \_ web_test.1 nginx:1.11.5 agent01 Shutdown Shutdown 6 minutes ago dvcy2q4b3xoy web_test.2 nginx:1.11.5 agnet02 Running Running 3 minutes ago mhbd0fdpofq8 \_ web_test.2 nginx:1.11.6 agnet02 Shutdown Shutdown 3 minutes ago kmcdo4cifygf \_ web_test.2 nginx:1.11.5 agnet02 Shutdown Shutdown 7 minutes ago oxx0lslzzt9h web_test.3 nginx:1.11.5 Manager Running Running 42 seconds ago jswemeuox4yk \_ web_test.3 nginx:1.11.6 Manager Shutdown Shutdown 42 seconds ago ipynj6l9hegu \_ web_test.3 nginx:1.11.5 Manager Shutdown Shutdown 5 minutes ago 是不是状态为Running的nginx又回到了1.15的版本了。那么,我们在实际工作中这种对服务更新和回滚会用到哪呢?大家可以留言一起讨论一下。 本章内容到此结束,喜欢我的文章,请点击最上方右角处的《关注》!!!

优秀的个人博客,低调大师

正则表达式与三剑客的使用技巧

1.正则表达式的基础 ^ ^锚定行的开始如:/^sed/匹配所有以sed开头的行 $ $锚定行的结束 如:/sed$/匹配所有以sed结尾的行 . .匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d ? 代表前趋字符的一次出现 * *匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行 [] 匹配指定范围内的任意单个字符,如/[Ss]ed/匹配sed和Sed [^] 匹配指定范围外的任意单个字符 如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行 /< 锚定单词的开始,如:/\<love/匹配包含以love开头的单词的行 /> 锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行 /( /) 引用标识,可以多次引用,并在后面以/1 /2来引用 x/{m,n/} 代表x的至少m次,至多n次出现 | 用于使用多个正则条件,匹配之一即可 + 与. *类似,表示1个或多个重复字符 () 用于将多个内容组成单元组 \(..\) 保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love** x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个o的行 x\{m,\} 重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行 x\{m,n\} 重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行 2.grep 作用:文本搜索工具,根据用户指定的"模式(过滤条件)"对目标文本逐行进行匹配检查;打印匹配的行模式:有正则表达式的元字符及文本字符所编写的过滤条件 正则表达式引擎:grep [OPTIONS] [PATTERN] [FILE...]grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]常用选项: --color=auto 对匹配到的文本着色后高亮显示 -E 使用正则扩展 -e pattern 使用pattern中的正则 -f file 使用文件中的正则 -i 忽略大小写(性能较差,最好先用tr统一转换成大写或小写) -o 仅显示匹配到字符串本身; -v 反向显示不匹配的行 -V 显示版本号 输出控制选项: -n 输出行号 -q 不显示未匹配的内容 -r 递归方式扫描文件 -l 只输出匹配的文件名 -L 只输出不匹配的文件名 -c 只显示匹配的个数 -A 匹配的到后面几行也显示出来-B 匹配的到前面几行也显示出来-C 上下文,匹配的到前后面几行也显示出来 匹配次数:用在要指定其出现的次数的字符的后面,用户限制其前面字符出现的次数 : 匹配器前面的字符任意次:0,1,多次 例如:grep "xy",abxy aby xxxy yab .* 匹配任意长度的任意字符,贪婪模式,能匹配多长就匹配多长\? 匹配其前面的字符0次或者1次;即其前面的字符可有可无的+ 匹配其前面的字符一次或多次;即其前面的字符出现至少1次{m} 匹配其前面的字符m次{m,n} 匹配其前面的字符至少m次,至多n次{0,n} 至多n次 {m,} 至少m次 位置锚定: ^ 行首锚定;用于模式的最左侧$ 行尾锚定;用于模式的最右侧^PATTERN$ 用PATTERN来匹配整行^$ 空白行^[[:space:]]*$ 空行或包含空白字符的行 单词: 非特殊字符组成的连续字符(字符串)都为单词\< 或 \b 词首锚定,用于单词模式的左侧,例如:grep "\<word"> 或 \b 词尾锚定,用于单词模式的右侧,例如:grep "word>"\<PATTERN> 匹配完整单词分组及引用:() 将一个或多个字符捆绑在一起,当作一个整体进行处理,例如:(xy)*abNote 分组括号中的模式匹配到的内容会被正则表达式引擎自动记录到内部的变量中,这些变量为: \1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符 \2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符 \3:后向引用,引用前面的分组括号中的模式所匹配到的字符 常用示例: 1、显示/etc/passwd文件中不以/bin/bash结尾的行 grep -v "/bin/bash$" /etc/passwd 2、找出/etc/passwd文件中的两位数或三位数 grep "\<[[:digit:]]{2,3}>" /etc/passwd 3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行 grep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg 4、找出"netstat -tan"命令的结果中以"LISTEN"后跟0、1或多个空白字符结尾的行 netstat -tan|grep "LISTEN[[:space:]]*$" 5、grep "(l..e).*\1" lovers.txt He loves his lover. He likes his lover. She likes her liker. She loves her liker. 6、grep -i 'root' /etc/passwd 不区分大小写显示文件中有root的行 7、grep -v '^root' /etc/passwd 显示文件中开关不是root和行 8、grep -n 'root' /etc/passwd 显示文件中含有root的行,且打印此行在文件中的行号 9、grep -lr '$root' /etc 递归查找/etc下包含行结尾为root的文件名 10、grep -Lr 'root' /etc 递归查找/etc下文件中不包含root的文件名 11、grep -c 'root' /etc/passwd 统计文件中root出现的行数 12、grep "hello | world" 1.cpp 匹配包含hello的行和world的行 egrep命令:支持扩展正则表达式实现类似于grep文本过滤功能:grep -E正则表达式引擎:egrep [OPTINS] PATTERN [FILE] 选项:与grep选项相似 -G:支持基本正则表达式扩展正则表达式的元字符:字符匹配:. 匹配任意单个字符[] 匹配指定范围内的任意单个字符[^] 匹配指定范围外的任意单个字符 次数匹配:: 匹配器前面的字符任意次:0,1,多次 .: 匹配任意长度的任意字符,贪婪模式,能匹配多长就匹配多长? 匹配其前面的字符0次或者1次;即其前面的字符可有可无的+ 匹配其前面的字符一次或多次;即其前面的字符出现至少1次{m} 匹配其前面的字符m次{m,n} 匹配其前面的字符至少m次,至多n次{0,n} 至多n次{m,} 至少m次位置锚定:^ 行首锚定;用于模式的最左侧$ 行尾锚定;用于模式的最右侧\<或\b 词首锚定,用于单词模式的锚定>或\b 词尾锚定,用于单词模式的锚定 分组及引用:() 分组;括号内模式匹配到的字符会被记录到正则表达式引擎的内部变量中 后向引用:\1,\2....或:a|b a或bC|cat C或cat(c|C)at cat或Cat 常用示例: 1、找出/proc/meminfo文件中,所有以大写或小写S开头的行;至少有三种实现方式 grep "^[sS]" /proc/meminfo grep -i "^sS" /proc/meminfo grep -E "^(s|S)" /proc/meminfo grep -E "^s|^S" /proc/meminfo2、显示当前系统上root、centos或者user1用户的相关信息 grep -E "^(root|centos|user1>)" /etc/passwd 3、找出/etc/rc.d/init.d/functions文件中某单词后跟一个小括号的行 grep -Eo '_[[:alnum:]]+()' /etc/rc.d/init.d/functions 4、使用echo命令输出一绝对路径,使用egrep取出基名 echo "/root/ssf/erou/dfjl" | egrep -o "\<[[:alpha:]]>$"echo "/root/ssf/erou/dfjl" | grep -Eo "[^/]+/?$" 5、找出ifconfig命令结果中的1-255之间的数值 ifconfig | grep -oE "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>" 6、添加用户bash, testbash, basher以及nologin(其shell为/sbin/nologin) 而后找出/etc/passwd文件中用户名同shell名的行 grep -E "^([^:]+>).\1$" /etc/passwd 3.sed sed命令行格式为:sed [-nefri] ‘command’ 输入文本/文件 常用选项: -f 指定过滤脚本文件名 -e 后跟匹配表达式 -n 不显示默认输出 -r sed 的动作支援的是延伸型正则表达式的语法-i 直接修改读取的文件内容,而不是由屏幕输出 常用命令: a ∶ 新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)c ∶ 取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行d ∶ 删除,因为是删除,所以 d 后面通常不接任何内容i ∶ 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)p∶ 列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起用s∶ 取代,可以直接进行替换的工作。通常这个 s 的动作可以搭配正则表达式。例如 1,20s/old/new/g sed脚本上的命令: sed'/root/a/text'/etc/passwd 在文件的root那一行后增加新行text sed '/root/c/text' /etc/passwd 在文件的root那一行替换为text sed '/root/i/text' /etc/passwd 在匹配行前插入text sed '/root/d'/etc/passwd 删除文件中含有root的那一行 h/H 复制或附加模式缓冲区到一个buffer g/G 从buffer中取出并复制或附加到当前模式缓冲区 sed -e '/root/{h;d;}' -e '$g' /etc/passwd 将root行放在最后一行 p 打印行 sed -n '/root/{n;p;}' /etc/passwd 打印root行的下一行 sed '1,3y/abcdef/ABCDEF/' /etc/passwd 映射1-3行的小写为大写 s/xxx/yyy/g 文本替换 sed定址: sed -n '1,3p' /etc/passwd 打印文件1-3行 sed -n '/root/,/sshd/p' /etc/passwd 打印文件root行与sshd行之间的行 sed -n '5,/^northeast/p' file 实例分享: 1、复制/etc/inittab文件至/tmp/目录,替换/tmp/inittab文件中的"id:3:initdefault"一行数字为5 #cp/etc/inittab/tmp/#sed's/id:3:initdefault/id:5:initdefault/'/tmp/inittab 2、复制/etc/rc.d/init.d/functions文件至/tmp目录,删除/tmp/functions文件的空白行 #cp/etc/rc.d/init.d/functions/tmp/#sed'/^[[:space:]]*$/d'/tmp/functions 3、复制/boot/grub/grub.conf文件至/tmp/目录,删除/tmp/grub.conf文件中行首的空白字符 #cp/boot/grub/grub.conf/tmp/#sed's@^[[:space:]]\+@@'/tmp/grub.conf 4、echo一个路径给sed,通过sed取出其路径名 例如echo"etc/sysconfig/network-scripts/" | sed,返回路径名/etc/sysconfig/ #echo"/etc/sysconfig/network-scripts/"|sed's@[^/]\+/\?$@@' 4.awk awk命令主要用于文本内容的分析处理 如果对处理的数据需要生成报告之类的信息,或者处理的数据是按列进行处理的,最好使用awk awk读入有’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域 $0则表示所有域,$1表示第一个域,$n表示第n个域 awk是一个报告生成工具,旨在把文件中读取到的每一行的每个字段分别进行格式化 而后进行显示,awk支持使用变量、条件判断、循环、数组 比如说,以”:”分隔filename文本的每一行并且打印第一列 awk-F':''{print$1}'filename 通用格式:gawk 'pattern {action}' file cmd | gawk 'pattern {action}' 工作原理:awk 扫描一行,放入变量$0中,然后行被分隔成各个域 以指定的分隔符进行分离,默认为空格,可以通过参数FS指定。各个域都存于变量$i中,至多100个域 sed和awk定制化显示举例 这里,我们可以制作一个文本my.txt,内容为: This is my cat, my cat's name is bettyThis is my dog, my dog's name is frankThis is my fish, my fish's name is georgeThis is my goat, my goat's name is adam 需要显示的结果为: cat:bettydog:frankfish:georgegoat:adam 如果采用sed,可以输入 sed 's/This is my \(.*\),.*is \(.*\)/\1:\2/g' my.txt 如果采用awk,则有两种方法 awk -F '[ ,]' '{print $4,$10}' OFS=":" my.txt awk -F '[ ,]' '{printf("%s:%s\n",$4,$10)}' my.txt 1.显示GID小于500的组 awk -F : '$3<500{print $1}' /etc/group 2.显示默认的shell为nologin的用户 awk -F : '$7~/nologin$/{print $1}' /etc/passwd 3.显示eth0网卡文件的配置信息,注意,只显示等号后面的值 awk -F = '{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0 4.显示/etc/sysctl。conf文件中定义的内核参数:只显示名称 awk -F =' !/^#|^$/{print $1}'/etc/sysctl.conf 5.显示eth0网卡的ip地址,通过ifconfig命令结果进行过滤 ifconfig eth0 |awk '/inet addr/{print $2}' |awk -F : '{print $2}'

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册