文本处理三剑客之sed命令用法

1.sed简介

    sed是一个面向字符流的“非交互式”编辑器,vim编译中手工对文本的操作动作大部分都可以通过sed命令来完成,这样就方便在linux下编译程序批量自动处理文件,例如分析日志文件,修改配置文件等等。


2.sed命令用法

    用法:

        sed [OPTION]...'script'[input-file]


常用选项:

-n :不输出模式空间中的内容至屏幕

-e script, --expression=script: 多点编辑

~]# sed -e 's@^UUID.*@@g' -e '/^[[:space:]]*$/d' /etc/fstab

-f script-file, --file=script-file 每行一个编辑命令

-r, --regexp-extended :支持使用扩展的正则表达式

-i[SUFFIX], --in-place[=SUFFIX] :直接编辑源文件

此操作有风险,请慎用!!!


script:地址定界

(1)空地址:对全文进行处理

(2)单地址:

#:指定行

/pattern/ :被此模式所匹配到的每一行

(3)地址范围:

#,#:从#到#的行

#,+#:

#,/pat1/

/pat1/,/pat2/

$ :最后一行

(4)步进: ~

1~2 :所有奇数行

2~2 :所有偶数行


编辑命令:

d :删除模式空间中的内容

p :显示模式空间中的内容

a \text :在行后面追加文本"text",支持使用\n实现多行追加

i \text :在行前面插入文本"text",支持使用\n实现多行追加

c \text :把匹配到的行替换为此处指定的文本"test"

w /PATH/TO/SOMEFILE :保存模式空间匹配到的行到指定的文件中

= :为模式匹配到的行打印行号

! :条件取反 

            格式: 地址定界!编辑命令

r \PATH/TO/SOMEFILE :读取指定文件的内容至当前文件被模式匹配到的行后面,一般用于文件合并

s/// :查找替换,其分隔符可自行指定,常用的有s@@@,s###等

替换标记:

g :全局替换

                p :显示替换成功的行

w /PATH/TO/SOMEFILE :将替换成功的结果保存至指定文件中


用法示例:

1.在/etc/fstab文件中UUID的行前面加上注释信息

~]# sed  '/^UUID/i \this is UUID' /etc/fstab

2.删除某文件的所有空红

~]# sed '/^$/d' FILE

3.删除/boot/grub2/grub.cfg文件中所有以空白字符开头的行的行首的所有空白字符

~]# sed 's@^[[:space:]]\+@@g' grub.cfg

4.在/etc/fstab文件的行尾追加信息

~]# sed  '$a \sed command end' /etc/fstab

3.高级编辑命令

    h : 把模式空间中的内容覆盖至保持空间中

H :把模式空间中的内容追加至保持空间中

g : 把保持空间中的内容覆盖至模式空间中

G : 把保持空间中的内容追加至模式空间中

x : 把模式空间中的内容与保持空间中互换

n : 覆盖读取匹配到的行的下一行至模式空间中

N : 追加读取匹配到的行的下一行至模式空间中

d : 删除模式空间中的行

D :删除多行模式空间中的所有行


用法示例:

~]# sed -n 'n;p' FILE     :显示偶数行,";"用来分隔多个命令
~]# sed '1!G;h;$!d' FILE   :逆序显示文件的内容
~]# sed '!$d' FILE         : 取出最后一行
~]# sed '$!N;$!D' FILE     : 取出文件后两行
~]# sed '/^$/d;G' FILE     : 删除原有的所有的空白行,而后为所有的非空白行后添加一个空白行
~]# sed 'n;d' FILE         :显示奇数行
~]# sed 'G' FILE           :在原有的每行后方添加一个空白行


4.实战训练

    实现每周备份一次一周内被修改过的/etc/目录下的所有文件

~]# vim /backups/bf.sh
#!/bin/bash
#
#
dir=etc-`date +%F-%H-%M-%S`
mkdir -p /backups/$dir
for file in `find /etc/* -mtime -7`;do
        cp -r $file /backups/$dir &> /dev/null
done
cd /backups && tar -Jcf ${dir}.tar.xz $dir && rm -rf /backups/$dir

~]# crontab -e
0 0 * * 1 /bin/bash /backups/bf.sh