文本处理三剑客之sed
sed:stream editor 流编辑器,对标准输出或文件逐行进行处理
sed 是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为**模式空间(PatternSpace)**,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得 sed 性能很高,sed 在读取大文件时不会出现卡顿的现象。如果使用 vi 命令打开几十 M 上百 M 的文件,明显会出现有卡顿的现象,这是因为 vi 命令打开文件是一次性将文件加载到内存,然后再打开。Sed 就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快
1 | sed [OPTION]... 'script;script;...' [input-file]... |
基本用法
OPTION
1 | -n # 不输出模式空间内容到屏幕,即不自动打印,如果不加-n,会自动打印每一行 |
script
script 是 地址 和 命令 的组合,地址用来定位,命令用来对定位的内容进行操作
地址
1 | 不给地址:对全文进行处理 |
命令
1 | p # print 打印查询的行 |
练习
1.将 php.ini-production 中的无关信息去掉
1 | sed -E '/^; /d;/^;+;$/d' /usr/local/src/php-7.4.8/php.ini-production | uniq > php.ini |
2.获取分区利用率
1 | lujinkai@Z510:~$ df | sed -En '/^\/dev\/sd/s/.* ([0-9]+)%.*/\1/p' |
3.取基名和目录名
1 | # 使用/作为分隔符,如果搜索条件中出现/需要转义,所以为了易读性,不建议使用搜索条件中出现的字符作为分割符 |
4.将非#开头的行加#
1 | lujinkai@Z510:~/data/test$ sed -Ei 's/^[^#].*/# &/' a.log |
5.将#开头的行删除#
1 | lujinkai@Z510:~/data/test$ sed -ri 's/^#(.*)/\1/' a.log |
高级用法
略。。。