sed 命令
[root@www ~]# sed [-nefr] [动作] 选项与参数: -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 -e :直接在命令列模式上进行 sed 的动作编辑; -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作; -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法) -i :直接修改读取的文件内容,而不是输出到终端。 动作说明: [n1[,n2]]function n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』 function: a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚; i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
老牛逼啦 找谁干啥
在 sed -i 's###g' 1.txt 在#号之间使用正则
常用:
sed -i 's/原字符串/新字符串/' /home/1.txt sed -i 's/原字符串/新字符串/g' /home/1.txt
example:
sed -i 's/d/7523/' /home/1.txt 执行结果 7523 7523dd #ff sed -i 's/d/7523/g' /home/1.txt 执行结果 7523 752375237523 #ff
&例子:

去掉 “行首” 带“@”的首字母@
sed -i 's/^@//' file


sed -n p


注意p前面的;


pattern + command
pattern
10command 匹配第10行
10,20command 匹配第10-20行
10,+5command 匹配第10-16行
/pattern1/command 匹配pattern1的行。sed -n "/\/spool\//p" /etc/passwd,匹配带有/spool/的行。sed -n "/^daemon/p" /etc/passwd,匹配daemon开头的行
/pattern1/,/pattern2/command 匹配pattern1到pattern2的行结束。sed -n "/^daemon/p" /etc/passwd
10,/pattern1/command 从第10行开始匹配到第一个pattern1的行结束
/pattern1/,10command 连续匹配10行
/10:00/,/11:00/p 范围匹配 日志
command
查询
p 打印
增加
a 行后追加。sed -i "/\/bin\/bash/a this user can login to system" passwd
i 行前追加
c replace
r 外部文件读入,行尾追加
w 匹配行写入外部文件
删除
d 删除不能登录的用户,sed -i "/\/sbin\/nologin/d" passwd。删除从mail开头的行到ftp开头的行,sed -i "/^mail/,/^ftp/d" passwd
例:删除配置文件中的所有空行和注释行。sed -i "/^$/d;/[:blank:]*#/d;/\t/d" nginx.conf,[:blank:]匹配空格,\t匹配tab
例:在配置文件中所有不以#开头的行前面添加*符号(#开头的行不添加)。sed -i "s/^\([^#]\)/\*\1/g" nginx.conf 或者 sed -i "s/^[^#]/*&/g" nginx.conf
更改
s/old/new/ 将行内第一个替换
s/old/new/g 将行内所有替换
s/old/new/2 将行内第二个替换
s/old/new/2g 从第二个开始替换所有的
s/old/new/ig 忽略大小写
例:删掉所有的数字。sed -i "s/[0-9]+//g" sed.txt
其它
= 显示行号。sed -n "/\/sbin\/nologin/=" passwd
反向引用
- & 和 1 引用模式匹配到的整个串(1的时候要替换的模式匹配中的串要用小括号包围起来)
例:sed -i "s/had..p/&s/g" sed.txt 给能匹配到had..p的字符串后面加上s,hadoopx -> hadoopsx sed -i "s/ha\(d..p\)/XX\1/g" sed.txt 给能匹配到had..p的d..p之外的串全替换成上XX,hadoopx -> XXdoopxsed -i "s/\(GATEWAY=\)\S*/\1192.168.0.1/" /etc/sysconfig/network-scripts/ifi-ens0
- 先保护,在使用
echo haha hello | sed -r 's#(h.h.)#<\1>#g'

查看日志不要用vi,cat 吃内存。
用 head tail sed less more
范围匹配:



练习:统计mysql配置文件各配置段的数量
#!/bin/bash
FILE_NAME=/root/script/my.cnf
function get_all_segament {
sed -n '/\[.*\]/p' $FILE_NAME | sed -e "s/\[//g" | sed -e "s/\]//g"
# 查找[开头]结尾的行,并且删除掉[和]
}
function get_all_segament_count {
count=`sed -n "/\[$1\]/,/\[.*\]/p" $FILE_NAME | grep -v "^#" | grep -v "^$" | grep -v "\[.*\]" | wc -l`
# 查找[$1]开头的行到发现[.*]的行结束,去掉#开头和空行,并去掉[.*]的行(即开头和结束的行),统计数量
echo $count
}
index=0
for segament in $(get_all_segament)
do
index=`expr $index + 1`
count=`get_all_segament_count $segament`
echo "$index: $segament $count"
done
输出:
1: client 1
2: mysql 1
3: mysqld 6
4: mysqldump 3
去掉 “行首” 带“@”的首字母@
sed -i 's/^@//' file
特定字符串的行前插入新行
sed -i '/特定字符串/i 新行字符串' file
特定字符串的行后插入新行
sed -i '/特定字符串/a 新行字符串' file
特定字符串的删除
sed -i '/字符串/d' file
1. sed替换的基本语法为:
sed 's/原字符串/替换字符串/'
单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义。
2. 单引号” ‘ ’”是没有办法用反斜线”\”转义的,这时候只要把命令中的单引号改为双引号就行了,格式如下:
# 要处理的字符包含单引号
sed "s/原字符串包含'/替换字符串包含'/"
3. 命令中的三根斜线分隔符可以换成别的符号,有时候替换目录字符串的时候有较多斜线,这个时候换成其它的分割符是较为方便,只需要紧跟s定义即可。
# 将分隔符换成问号”?”:
sed 's?原字符串?替换字符串?'
sed 's#原字符串#替换字符串#'
4. 可以在末尾加g替换每一个匹配的关键字,否则只替换每行的第一个,例如:
# 替换所有匹配关键字
sed 's/原字符串/替换字符串/g'
5. 一些特殊字符的使用
”^”表示行首
”$”符号如果在引号中表示行尾,但是在引号外却表示末行(最后一行)
# 注意这里的 " & " 符号,如果没有 “&”,就会直接将匹配到的字符串替换掉
sed 's/^/添加的头部&/g' #在所有行首添加
sed 's/$/&添加的尾部/g' #在所有行末添加
sed '2s/原字符串/替换字符串/g' #替换第2行
sed '$s/原字符串/替换字符串/g' #替换最后一行
sed '2,5s/原字符串/替换字符串/g' #替换2到5行
sed '2,$s/原字符串/替换字符串/g' #替换2到最后一行
6.批量替换字符串
sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir
8. 多个替换可以在同一条命令中执行,用分号”;”分隔,其格式为:
# 同时执行两个替换规则
sed 's/^/添加的头部&/g;s/$/&添加的尾部/g'
sed -n '1,/^exit 0$/!p' $0 >$path/install.tar.gz
sed -n '1,/^exit 0$/!p' 2.txt
cat 2.txt


sed -n '1,/^a/p' 2.txt

sed -n '1,/^a/!p' 2.txt

sed -n /^df$/p 2.txt

sed -n 1,/^df$/p 2.txt



更改
s/old/new/ 将行内第一个替换
s/old/new/g 将行内所有替换
s/old/new/2 将行内第二个替换
s/old/new/2g 从第二个开始替换所有的
s/old/new/ig 忽略大小写

多个替换 。 p 要与g在一起。
sed :找到匹配时替换整行
sed在文件中找到匹配项时如何用我们的内容替换一行
示例文件:/tmp/file
|
1
2
3
4
|
This is line oneThis is line twoThis is line threeThis is line four |
在这里,我们将搜索字符串为“two”的行,并将整行替换为“your text”
|
1
|
# sed '/two/cyour text' /tmp/file |
|
1
2
3
4
|
This is line oneyour textThis is line threeThis is line four |

参考:
https://www.cnblogs.com/qijiacheng-devops/p/13556020.html
https://www.cnblogs.com/linux-wangkun/p/5745584.html
https://www.cnblogs.com/qijiacheng-devops/p/13556020.html

