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[动作行为] 』

functiona :新增, 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 -> XXdoopx

    sed -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 one
This is line two
This is line three
This is line four

在这里,我们将搜索字符串为“two”的行,并将整行替换为“your text”

1
# sed '/two/cyour text' /tmp/file
1
2
3
4
This is line one
your text
This is line three
This 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

posted @ 2022-02-23 20:15  redrobot  阅读(461)  评论(0编辑  收藏  举报