介绍
- 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
复制代码
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
复制代码
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 外部文件读入,行后追加
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 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
复制代码
[client]
port=3306
socket=/tmp/mysql.socket
[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
[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
[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
[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
[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
复制代码