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

複製代碼
相關文章
相關標籤/搜索