Shell编程—【07】Linux的sed流编辑器 sed命令

介绍

  • sed(Stream Editor), 流编辑器。 对标准输出或者文件逐行进行处理。

语法格式

  • 标准输出处理
sed [选项]... {脚本} [文件]...
  • 文件处理
stdout | sed [选项]... {脚本}

文件

  • 下面命令将在含有file文件内容如下的目录下进行。
i love python
lovelove python
loooove
I LOVE PYTHON
I LOVE pYtHoN
py.*

sed的选项使用案例

无参数直接使用p(打印)命令

sed "p" file
i love python
i love python
lovelove python
lovelove python
loooove
loooove
I LOVE PYTHON
I LOVE PYTHON
I LOVE pYtHoN
I LOVE pYtHoN
py.*
py.*

-n 取消自动打印模式空

  • 可能大家会有点蒙是什么意思,这句话是centOS7中世界输入sed给的提示。
  • 首先解释一下,使用sed命令时,会先自动打印原来的文本,再输出匹配文本处理结果。
  • -n大家可以简单理解不输出原文本,只输出结果。
  • 示例:
sed -n "p" file
i love python
lovelove python
loooove
I LOVE PYTHON
I LOVE pYtHoN
py.*
  • 打印匹配项
sed -n "/python/p" file
i love python
lovelove python

-e 脚本, 添加“脚本”到程序的运行列表

  • 就是在逐行处理的时候匹配有多种情况,只有一个不用写-e
  • 如 匹配大写的和小写的
sed -n -e '/python/p' -e '/PYTHON/p' file
i love python
lovelove python
I LOVE PYTHON

-r 使用拓展正则表达式

sed -nr "/python|PYTHON/p" file
sed -nE "/python|PYTHON/p" file
# 两种都可以
i love python
lovelove python
I LOVE PYTHON

-f 脚本文件, 添加“脚本文件”到程序的运行列表

-i 操作源文件

sed -i 's/love/like/g' file
# s是替换 love变成like  g是每行的所有匹配字符,
# 如果不加g 则会匹配到第一个符合的字符替换了就结束当前行的替换
  • 没有输出

sed常用的Pattern用法

匹配某行

sed -n "5p" file
I LOVE pYtHoN

从某行开始匹配到某行

sed -n '2,5p' file
lovelove python
loooove
I LOVE PYTHON
I LOVE pYtHoN

从某行开始匹配 并设置一个偏移行数

sed -n '2,+2p' file
  • 处理的行数是从基数开始 偏移量+1 行
lovelove python
loooove
I LOVE PYTHON

处理正则表达式所在的行

sed -n '/^I LOVE/p' file
I LOVE PYTHON
I LOVE pYtHoN

从匹配条件1到的行数开始到 条件2的行 结束

sed -n "/lovelove/,/py\.\*/p" file
lovelove python
loooove
I LOVE PYTHON
I LOVE pYtHoN
py.*

从某行开始到 匹配条件2的行 结束

sed -n "4,/pYtHoN/p" file
I LOVE PYTHON
I LOVE pYtHoN

从匹配条件1到的行数开始到 某行 结束

sed -n "/pYtHoN/, 6s/LOVE/love/gp" file
I love pYtHoN

注意: 如果是行数范围处理,结束条件如果文件中没有那么就会一直处理到最后一行

sed -n "3,/abc/p" file
loooove
I LOVE PYTHON
I LOVE pYtHoN
py.*

sed中的编辑命令

p 打印 print

a 行后追加append

sed '/loooove/a bbbbbbbbbb' file
i love python
lovelove python
loooove
bbbbbbbbbb
I LOVE PYTHON
I LOVE pYtHoN
py.*

i 行前追加

sed '/loooove/i aaaaaaaaa' file
i love python
lovelove python
aaaaaaaaa
loooove
I LOVE PYTHON
I LOVE pYtHoN
py.*

r 外部文件读入,行后追加

  • list文件
1 line
2 line
sed '/lovelove/r list' file 
i love python
lovelove python
1 line
2 line
loooove
I LOVE PYTHON
I LOVE pYtHoN
py.*

w 匹配行写入外部文件

sed -n '/I LOVE/w aaa' file  && cat aaa```
  • 注意aaa可以不存在 如果以存在 里面的内容会被清除
I LOVE PYTHON
I LOVE pYtHoN

d 删除

sed '1,3d' file
  • 执行打印 并不修改源文件 修改源文件需要-i
I LOVE PYTHON
I LOVE pYtHoN
py.*

s/old/new 替换行内第一个old

s/old/new/2 替换行第二个

s/old/new/g 替换行内所有old

s/old/new/2g 替换第二个及后面所有的

s/old/new/ig 替换行内所有的old,忽略大小写

  • 替换命令演示
sed 's/o/AA/i2g' file
i love pythAAn
lovelAAve pythAAn
loAAAAAAve
I LOVE PYTHAAN
I LOVE pYtHAAN
py.*
sed 's/py/&OOO/ig' file
  • & 符号是匹配的内容的引用
i love pyOOOthon
lovelove pyOOOthon
loooove
I LOVE PYOOOTHON
I LOVE pYOOOtHoN
pyOOO.*

sed的应用

  • 处理一个Mysql的配置文件my.conf文本,输入文章有几个段(以 [ ] 为段),每个段有几个配置,
#!/bin/bash
#

FILE_NAME=./my.cnf

function get_all_segments
{
    echo "`sed -n '/\[.*\]/p' $FILE_NAME  | sed -e 's/\[//g' -e 's/\]//g'`"
}

function count_items_in_segment
{
    items=`sed -n '/\['$1'\]/,/\[.*\]/p' $FILE_NAME | grep -v "^#" | grep -v "^$" | grep -v "\[.*\]"`
    
    index=0
    for item in $items
    do
        index=`expr $index + 1`
    done

    echo $index

}

number=0

for segment in `get_all_segments`
do
    number=`expr $number + 1`
    items_count=`count_items_in_segment $segment`
    echo "$number: $segment  $items_count"
done
  • 文本my.conf
# this is read by the standalone daemon and embedded servers
[client]
port=3306
socket=/tmp/mysql.socket

#ThisSegmentForserver
[server]
innodb_buffer_pool_size=91750M
innodb_buffer_pool_instances=8
innodb_buffer_pool_load_at_startup=1
innodb_buffer_pool_dump_at_shutdown=1
innodb_data_file_path=ibdata1:1G:autoextend
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=32M
innodb_log_file_size=2G
innodb_log_files_in_group=2
innodb_max_undo_log_size=4G
innodb_undo_directory=undolog
innodb_undo_tablespaces=95

#thisisonlyforthemysqldstandalonedaemon
[mysqld]
port=3306
socket=/tmp/mysql.sock
basedir=/usr/local/mysql
datadir=/data/mysql
pid-file=/data/mysql/mysql.pid
user=mysql
bind-address=0.0.0.0
sort_buffer_size=16M
join_buffer_size=16M
thread_cache_size=3000
interactive_timeout=600
wait_timeout=600

#ThisSegmentFormysqld_safe
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
max_connections=1000
open_files_limit=65535
thread_stack=512K
external-locking=FALSE
max_allowed_packet=32M

#thisisonlyforembeddedserver
[embedded]
gtid_mode=on
enforce_gtid_consistency=1
log_slave_updates
slave-rows-search-algorithms='INDEX_SCAN,HASH_SCAN'
binlog_format=row
binlog_checksum=1
relay_log_recovery=1
relay-log-purge=1


#usethisgroupforoptionsthatolderserversdon'tunderstand
[mysqld-5.5]
key_buffer_size=32M
read_buffer_size=8M
read_rnd_buffer_size=16M
bulk_insert_buffer_size=64M
myisam_sort_buffer_size=128M
myisam_max_sort_file_size=10G
myisam_repair_threads=1
lock_wait_timeout=3600
explicit_defaults_for_timestamp=1
innodb_file_per_table=1

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容