Linux集群和自动化维2.4.2 sed的用法示例

本文涉及的产品
运维安全中心(堡垒机),企业双擎版|50资产|一周时长
日志服务 SLS,月写入数据量 50GB 1个月
运维安全中心(堡垒机),免费版 6个月
简介:

2.4.2 sed的用法示例       


1. sed的基础用法

1)删除行首空格,有下面几种方法,代码分别如下所示:

sed 's/^[ ]*//g' filename

sed 's/^ *//g' filename

sed 's/^[[:space:]]*//g' filename

2)在行后和行前添加新行。

行后的添加命令如下所示:

sed 's/pattern/&\n/g' filename

行前的添加命令如下所示:

sed 's/pattern/\n&/g' filename

其中,&代表pattern。

3)使用变量替换(使用双引号),代码如下:

sed -e "s/$var1/$var2/g" filename

4)在第一行前插入文本,代码如下:

sed -i '1 i\插入字符串' filename

5)在最后一行插入字符串,代码如下:

sed -i '$ a\插入字符串' filename

6)在匹配行前插入字符串,代码如下:

sed -i '/pattern/ i "插入字符串"' filename

7)在匹配行后插入字符串,代码如下:

sed -i '/pattern/ a "插入字符串"' filename

8)删除文本中的空行、以空格组成的行及#号注释的行,代码如下:

grep -v ^# filename | sed /^[[:space:]]*$/d | sed /^$/d

9)将目录/modules下面所有文件中的zhangsan都修改成list(注意备份原文件),代码如下:

sed -i 's/zhangsan/list/g' `grep zhangsan -rl /modules`

2.巧用vim+sed整理nginxd.txt脚本文件

笔者曾在工作中遇到过一个问题,需要使用Nginx配置脚本来解决,但在复制到服务器中并运行时发现前面的001~100行都有行标识符,外带空格,影响运行和美观。本来想逐行删除的,后来觉得过于麻烦,于是想到了用sed来解决问题,解决方法如下。

1)先在 vim里删除所有行的首数字,命令如下所示:

:%s/^[0-9][0-9]* //

2)然后删除所有行的首空字符,命令如下所示:

sed -i 's/^[[:space:]]*//' nginxd.sh

整个nginxd.txt演示脚本如下,有兴趣的朋友也可以拿来练下手。

001    #!/bin/sh

002    

003    # source function library

004    . /etc/rc.d/init.d/functions

005    

006    # Source networking configuration.

007    . /etc/sysconfig/network

008    

009    # Check that networking is up.

010    [ ${NETWORKING} = "no" ] && exit 0

011    

012    RETVAL=0

013    prog="nginx"

014    

015    nginxDir=/usr/local/nginx

016    nginxd=$nginxDir/sbin/nginx

017    nginxConf=$nginxDir/conf/nginx.conf

018    nginxPid=$nginxDir/nginx.pid

019    

020    nginx_check()

021    {

022        if [[ -e $nginxPid ]]; then

023            ps aux |grep -v grep |grep -q nginx

024            if (( $? == 0 )); then

025                echo "$prog already running..."

026                exit 1

027            else

028                rm -rf $nginxPid &> /dev/null

029            fi

030        fi

031    }

032    

033    start()

034    {

035        nginx_check

036        if (( $? != 0 )); then

037            true

038        else

039            echo -n $"Starting $prog:"

040            daemon $nginxd -c $nginxConf

041            RETVAL=$?

042            echo

043            [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx

044            return $RETVAL

045        fi

046    }

047    

048    stop()

049    {

050        echo -n $"Stopping $prog:"

051        killproc $nginxd

052        RETVAL=$?

053        echo

054        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx $nginxPid

055    }

056    

057    reload()

058    {

059        echo -n $"Reloading $prog:"

060        killproc $nginxd -HUP

061        RETVAL=$?

062        echo

063    }

064    

065    monitor()

066    {

067        status $prog &> /dev/null

068        if (( $? == 0 )); then

069            RETVAL=0

070        else

071            RETVAL=7

072        fi

073    }

074    

075    case "$1" in

076            start)

077                    start

078                    ;;

079            stop)

080                    stop

081                    ;;

082            restart)

083                    stop

084                    start

085                    ;;

086            reload)

087                    reload

088                    ;;

089            status)

090                    status $prog

091                    RETVAL=$?

092                    ;;

093            monitor)

094                    monitor

095                    ;;

096            *)

097                    echo $"Usage: $0 {start|stop|restart|reload|status|monitor}"

098                    RETVAL=1

099    esac

100    exit $RETVA

脚本下载地址:https://github.com/yuhongchun/automation。

此文件还有很多变化,比如空格在开头,序列号在中间,也可以用sed来解决,不过应该写出怎样的sed命令来解决,就留给大家来思考吧!

3. sed结合正则表达式批量修改文件名

笔者曾在工作中遇到了更改文件的需求,原来某文件test.txt中的链接地址为:

http://www.5566.com/produce/2007080412/315613171.shtml

http://bz.5566.com/produce/20080808/311217.shtml

http://gz.5566.com/produce/20090909/311412.shtml

现要求将http://*.5566.com更改为/home/html/www.5566.com,于是用sed结合正则表达式来解决这个问题,命令如下所示:

sed -i 's/http.*\.com/home\/html\/www.5566.com/g' test.txt

如果是用纯sed命令,方法更简单,如下所示:

sed -i 's@http://[^.]*.5566.com@/home/html/www.5566.com@g' test.txt

sed是完全支持正则表达式的,在正则表达式里,[^.]表示为非.的所有字符,换成[^/]也可以;另外,@是sed的分隔符,我们也可以用其他符号,比如/,但是如果要用到/的话就得表示成\/了,所以笔者经常用的方法是采用@作为分隔符。

4.在配置.conf文件时,为相邻的几行添加#号

例如,我们要将test.txt文件中的31~36行加上#号,使这部分内容暂时失效,该如何实现呢?

在vim中,可以执行如下命令:

:31,36 s/^/#/

而使用sed执行更加方便,命令如下所示:

sed -i '31,36s/^/#/' test.txt

反之,如果要将31~36行带#号的全部删除,用sed又该如何实现呢?方法如下:

sed –i ‘31,36s/^#//’ test.txt

许多人习惯在这个方法后面带个g,事实上,如果没有g,则表示从行的左端开始匹配,每一行第一个与之匹配的都会被换掉;如果有g,则表示每一行所有与之匹配的都会被换掉。

5.利用sed分析日志

利用sed还可以很方便地分析日志。例如,在以下的secure日志文件中,想用sed抓取12:48:48至12:48:55的日志:

Apr 17 05:01:20 localhost sshd[16375]: pam_unix(sshd:auth): authentication      failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.37.226  user=root

Apr 17 05:01:22 localhost sshd[16375]: Failed password for root from             222.186.37.226 port 60700 ssh2

Apr 17 05:01:22 localhost sshd[16376]: Received disconnect from 222.186.37.226:  11: Bye Bye

Apr 17 05:01:22 localhost sshd[16377]: pam_unix(sshd:auth): authentication            failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.37.226  user=root

Apr 17 05:01:24 localhost sshd[16377]: Failed password for root from                   222.186.37.226 port 60933 ssh2

Apr 17 05:01:24 localhost sshd[16378]: Received disconnect from 222.186.37.226:        11: Bye Bye

Apr 17 05:01:24 localhost sshd[16379]: pam_unix(sshd:auth): authentication            failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.37.226  user=root

Apr 17 05:01:26 localhost sshd[16379]: Failed password for root from                   22.186.37.226 port 32944 ssh2

Apr 17 05:01:26 localhost sshd[16380]: Received disconnect from 222.186.37.226:        11: Bye Bye

Apr 17 05:01:27 localhost sshd[16381]: pam_unix(sshd:auth): authentication            failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.37.226  user=root

Apr 17 05:01:29 localhost sshd[16381]: Failed password for root from                   222.186.37.226 port 33174 ssh2

Apr 17 05:01:29 localhost sshd[16382]: Received disconnect from 222.186.37.226:        11: Bye Bye

Apr 17 05:01:29 localhost sshd[16383]: pam_unix(sshd:auth): authentication            failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.37.226  user=root

Apr 17 05:01:31 localhost sshd[16383]: Failed password for root from                   222.186.37.226 port 33474 ssh2

Apr 17 05:01:31 localhost sshd[16384]: Received disconnect from 222.186.37.226:        11: Bye Bye

Apr 17 05:01:32 localhost sshd[16385]: pam_unix(sshd:auth): authentication            failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.37.226  user=root

可以利用sed截取日志命令,如下所示:

cat /var/log/secure | sed -n '/12:48:48/,/12:48:55/p'

脚本显示结果如下所示:

Apr 23 12:48:48 localhost sshd[20570]: Accepted password for root from 220.249.72.138    port 27177 ssh2

Apr 23 12:48:48 localhost sshd[20570]: pam_unix(sshd:session): session opened     for user root by (uid=0)

Apr 23 12:48:55 localhost sshd[20601]: Accepted password for root from 220.249.72.138    port 59754 ssh2

sed的用法还有许多,这就要靠大家在日常工作中归纳总结了。有兴趣的朋友还可以多了解下awk的用法,我们在工作中要频繁地分析日志文件,awk+sed是比较好的选择,下面介绍下awk的基本使用方法。

相关文章
|
2天前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
20天前
|
Linux Shell
Linux 10 个“who”命令示例
Linux 10 个“who”命令示例
49 14
Linux 10 个“who”命令示例
|
1月前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
2月前
|
Unix Linux
Linux | Rsync 命令:16 个实际示例(下)
Linux | Rsync 命令:16 个实际示例(下)
45 3
Linux | Rsync 命令:16 个实际示例(下)
|
1月前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
95 3
|
2月前
|
安全 Linux Shell
Linux | Rsync 命令:16 个实际示例(上)
Linux | Rsync 命令:16 个实际示例(上)
89 0
Linux | Rsync 命令:16 个实际示例(上)
|
2月前
|
Ubuntu Linux
Linux的基础用法
Linux的基础用法
24 6
|
3月前
|
Linux Shell
Linux 中 Tail 命令的 9 个实用示例
Linux 中 Tail 命令的 9 个实用示例
127 6
Linux 中 Tail 命令的 9 个实用示例
|
3月前
|
监控 Linux
Linux系统中du命令与df命令的区别与用法
总的来说,`du` 和 `df` 在磁盘管理中互补使用,能够提供全面的磁盘空间使用信息,帮助用户和管理员有效地监控和管理系统资源。
102 3
|
4月前
|
Web App开发 编解码 Linux
使用Selenium自动化测试解决报告生成失败问题及Linux部署指南
这篇文章介绍了使用Selenium自动化测试解决报告生成失败问题的方法,包括Linux环境下的部署指南和代码实现。
55 1
使用Selenium自动化测试解决报告生成失败问题及Linux部署指南