zoukankan      html  css  js  c++  java
  • sed文本处理

    1.基本概述

    sed是一个流编辑器, 非交互式的编辑器,它一次处理一行内容. 处理时,把当前处理的行存储在临时缓冲区中,称*
    为“模式空间”(pattern space) 接着用 sed 命令处理缓冲区中的内容,处理完成后, 把缓冲区的内容送往屏幕。 接
    着处理下一行,这样不断重复,直到文件末尾。 文件内容并没有改变,除非你 使用重定向存储输出。 Sed 要用来自
    动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

    2..sed基础语法

    第一种形式:stdout | sed [option] "pattern command"
    第二种形式: sed [option] "pattern command" file

    3..sed常用选项 -i -r

    	sed相关示例文件
    	[root@web01 opt]# cat file.txt
    	I love shell
    	I love SHELL
    	This is test file
    

    1.sed-n、-e选项示例

    #取消默认输出
    [root@web01 opt]# sed -n '/shell/p' file.txt
    I love shell
    

    #编辑多项

    [root@web01 opt]# sed -n -e '/shell/p' -e '/SHELL/p' file.txt
    I love shell
    I love SHELL
    

    2.sed -f 选项示例

    #将pattern写入文件中
    [root@web01 opt]# cat edit.sed
    /shell/p
    [root@web01 opt]# sed -n -f edit.sed file.txt
    

    3.sed -r 选项示例

    [root@web01 opt]# sed -n '/shell|SHELL/p' file.txt
    #扩展正则表达式
    [root@web01 opt]# sed -rn '/shell|SHELL/p' file.txt
    I love shell
    I love SHELL
    

    4.sed -i 选项

    [root@manager sed]# sed  -in '/shell/d'  file.txt
    

    3.sed pattern

    	sed -n '10p' passwd 
    	sed -n '10,20p' passwd 
    	sed -n '1,+5p' passwd 
    	sed -n '/^root/p' passwd 
    	sed -n '/^root/,/^ftp/p' passwd 
    	sed -n '/^[mysql.*/,/^[mysqld_safe]/p' /etc/my.cnf|grep -v "^[.*"
    	sed -n '2,//bin/sync/p' passwd 
    

    1) 打印/etc/passwd中第20行

    sed -n '20p' /etc/passwd
    

    2)打印/etc/passwd中从第8行开始,到第15行结束的内容

    	sed -n '8,15p' /etc/passwd
    

    3)打印/etc/passwd中从第8行开始,然后+5行结束的内容

    	sed -n '8,+5p' /etc/passwd
    

    4)打印/etc/passwd中开头匹配bin字符串的内容

    	sed -n '/^bin/p' /etc/passwd
    

    5)打印/etc/passwd中开头为root的行开始,到开头为ftp的行结束的内容

    	sed -n '/^root/,/^ftp/p' /etc/passwd
    

    6)打印/etc/passwd中第8行开始,到含有/sbin/nologin的内容的行结束内容

    	sed -n '8,//sbin/nologin/p' /etc/passwd
    

    4.sed追加命令

    [root@manager sed]# sed -i '/^root/i server {
    	listen 80;
    	server_name oldxu.com;
    	index index.html;
    	root /code;
    }' passwd
    server {
    	listen 80;
    	server_name oldxu.com;
    	index index.html;
    	root /code;
    }
    

    本章练习示例:

    1) passwd文件第10行后面追加“Add Line”

    	sed -i '10a "Add Line"' passwd
    

    2)passwd文件第10行到第20行,没一行后面都追加 "Test Line"

    sed -i '10,20a "Test Line"' passwd
    

    3)passwd文件匹配到/bin/bash的行后面追加 "Insert Line"

    	sed -i '//bin/bash/a "Insert Line"' passwd
    

    4)passwd文件匹配到以bin开头的行,在匹配的行前追加 "Add Line Before"

    	sed -i '/^bin/i "Add Line Before"' passwd
    

    5)passwd文件每一行前面都追加 "Insert Line Before"

    	sed -i 'i "Insert Line Before"' passwd
    

    6)将/etc/fstab文件的内容追加到passwd文件的第10行后面

    	sed -i '10r /etc/fstab' passwd
    

    7)将/etc/inittab文件内容追加到passwd文件匹配/bin/sync行的后面

    	sed -i '//bin/sync/r /etc/inittab' passwd
    

    8)将/etc/hosts文件内容追加到passwd文件中10行的后面

    	sed -i '10r /etc/hosts' passwd
    

    9)将passwd文件匹配到/bin/bash的行追加到/tmp/sed.txt文件中

    	sed -i '//bin/bash/w /tmp/sed.txt' passwd
    

    10)将passwd文件丛第10行开始,到匹配到nfsnobody开头的所有行内容追加到/tmp/sed-1.txt

    	sed -i '10,/^nfsnobody/w /tmp/sed-1.txt' passwd
    

    5.sed删除命令

    本章练习示例:

    1)删除passwd中的第15行

    sed -i '15d' passwd
    

    2)删除passwd中的第8行到第14行的所有内容

    sed -i '8,14d' passwd
    

    3)删除passwd中以/sbin/nologin结尾的行

    	sed -i '//sbin/nologin$/d' passwd
    

    4)删除passwd中以bin开头的行,到以ntp开头的行的所有内容

    	sed -i '/^bin/,/^ntp/d' passwd
    

    5)删除passwd中第3行到以ftp开头的所有行内容

    	sed '3,/^ftp/d' passwd
    

    6)典型需求:删除Nginx配置文件中所有的注释以及空行

    	sed -ri '/^#|^$| #/d' nginx.conf
    

    6.sed修改命令 s///g <--替换 c 修改

    sed '/^SELINUX=/c SELINUX=disabled'
    

    1.修改passwd文件第1行中第一个root为ROOT

    	sed -i  '1s/root/ROOT/' passwd
    

    2.修改passwd文件中第5行到第10行中所有的/sbin/nologin为/bin/bash

    	sed -i '5,10s//sbin/nologin//bin/bash/' passwd
    ​	sed -i '5,10s#/sbin/nologin#/bin/bash#' passwd
    

    3.修改passwd文件中匹配到/sbin/nologin的行,将匹配到行中的login

    为该大写的LOGIN

    	sed -i '//sbin/nologin/s#login#LOGIN#g' passwd
    	sed -i '//sbin/nologin/s/login/LOGIN#g' passwd
    

    4.修改passwd文件中从匹配到以root开头的行,到匹配到以bin开头行,修改bin为BIN

    sed -i '/^root/,/^bin/s/bin/BIN/g' passwd
    

    5.修改SELINUX=enforcing修改为SELINUX=disabled。(可以使用c替换方式)

    sed -i '/^SELINUX=/c SELINUX=disabled' selinux
    

    6.将nginx.conf配置文件添加注释。 ^ $

    sed -i 's/^/# /' nginx.conf
    

    7.使用sed提取eth0网卡的IP地址

    	ifconfig eth0 | sed -rn '2s/^.*et //p' | sed -rn 's/ ne.*//p' 
    	ifconfig eth0 |sed -nr '2s/(^.*et) (.*) (net.*)/2/p'
    

    7.sed脚本练习

    需求描述:处理一个类似MySQL配置文件的my.cnf文件。

    1.输文件中有几个段,一对 [ ] 为一段。
    2.针对每个段配置文件参数,统计总个数。

    [root@web01 opt]# sh example.sh
    	1: client 2
    	2: server 12
    	3: mysqld 12
    	4: mysqld_safe 7
    	5: embedded 8
    	6: mysqld-5.5 10
    

    1.打印每段的内容

    	sed -n -e '/^[.*]/p' sed.txt | sed 's/[//' | sed 's/]//'
    

    2.统计每段参数的总参个数

    	sed -n '/^[server]/,/^[.*]/p' sed.txt | sed -r '/^[|^#|^$/d'|wc -l
    

    脚本为

    [root@web01 sed]# cat sed.sh 
    #!/bin/bash
    #Author:               rzq
    #QQ:                  0123456789
    #Date:                2019-11-06
    #FileName:            sed.sh
    #URL:                 https://www.jianshu.com
    #Description:         The test script
    #Copyright (C):      2019 All rights reserved
    
    HS () {
    
     	num=$(sed -n '/^[.*]/p' kl.txt|sed 's/[//'|sed 's/]//')
    
    }
    
    GS () {
    
    gs=$(sed -n '/^['$i']/,/^[.*]/p' kl.txt|sed -r '/^[|^#|^$/d'|wc -l)
    
    }
    
    HS
    b=0
    for i in $num
    do
    	let b++
    	GS
    	echo "$b  $i  $gs"
    done
    
    
    

    需求描述: 处理一个ansible的invtory主机清单。

    1.输出主机组,一对 [ ] 为一个主机组。
    2.输出每个主机组下的主机总个数。

    [root@web01 opt]# sh example.sh
    	1: web01: 有 2  台主机
    	2: web02: 有 12 台主机
    [root@web01 sed]# cat ansible.sh 
    #!/bin/bash
    #Author:               rzq
    #QQ:                  0123456789
    #Date:                2019-11-07
    #FileName:            ansible.sh
    #URL:                 https://www.jianshu.com
    #Description:         The test script
    #Copyright (C):      2019 All rights reserved
    
    fu () {
    	FW=$(sed -n '/^[.*]/p' lp.txt|sed  's/[//' | sed 's/]//')
    }
    
    ip () {
    	IP=$(sed -n '/^['$i'/,/^[.*]/p' lp.txt|sed -r '/^[|^$/d'|wc -l)
    }
    
    fu
    num=0
    for i in $FW
    do	
    	let num++
    	ip
    	echo "$num $i $IP"
    done
    

    sed
    	两种语法:
    		sed options '/pattern1/command' file
    
    1、选项options:
    	-i		直接变更文件
    	-r		支持扩展正则表达式
    	-f		将处理命令写入文件中,然后进行调用
    	-e		可以多项编辑操作
    	-n		取消默认文本的输出
    
    2.模式匹配
    	字符串匹配
    	正则表达式匹配
    	从哪里-> 到哪里     '/pattern1/,/pattern2/'
    
    3.命令command
    	增
    		a			#在匹配的行后添加
    		i			#在匹配的行前添加
    		r			#读取某个文件的内容,添加至/pattern1/行的后面
    		w			#将文件的内容写入到某个文件中。  >
    	删
    		d			#对匹配的内容进行删除,但需要配合-i选项才能操作文件。
    	改
    		s///		#替换,将什么替换成什么,需要配合-i选项才能操作文件
    		s///g		#替换,全局替换(替换一个行中所有满足条件的内容)
    		c			#修改,可以使用正则表达式匹配,然后修改  需要配合-i选项才能操作文件
    	查
    		p			#打印输出的效果。默认的动作,必须要添加。通常配合-n一起使用
    
  • 相关阅读:
    .Net vs Java?
    使用HyperV安装Linux系统
    C#调用Lua
    KubernetesService介绍服务发现
    缓存雪崩、缓存击穿和缓存穿透
    10 个开源项目
    minikube cncf.io
    Parallel的使用
    通过Rancher Desktop在桌面上运行K8s
    2021 .NET 开发者峰会顺利在网上落幕,线上直播回看汇总
  • 原文地址:https://www.cnblogs.com/baozexu/p/11809166.html
Copyright © 2011-2022 走看看