由于被疫情打乱更博节奏,已经好久没有更新博客了,今天来一发笔记,记录一下 linux 三剑客的常用操作。所谓的三剑客,其实就是 grep awk sed 三个命令,在 linux 操作中,特别是关于文本的查找和修改,这三条命令可谓是各显神通。

三个命令的一般性作用:

  • grep:基于正则表达式查找满足条件的行
  • awk:根据定位到的数据行处理其中的分段,也就是切片
  • sed:根据定位到的数据行修改数据

sed 命令常用操作

sed 命令的匹配是以行为单位的,这个概念很重要。

直接上测试文件 file.conf,内容如下:

bookbookbookbook
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
bookbook

简单替换(只替换每个匹配行的首次匹配项)

sed 's/book/good/' file.conf

结果如下:

goodbookbookbook
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
goodbook

可以看到只将每个匹配到的行的第一次匹配到的 book 并替换成了 good

精确替换

上面的替换虽然可以做到将book替换成新的内容,但是有时候我们可能需要对某个单词进行替换,而不能替换包含这个单词的单词,就比如上面的内容,假如现在要将 bookbook 替换成 newbook ,先看看使用上面的替换方式结果如何

sed 's/bookbook/newword/' file.conf

结果如下

newwordbookbook
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
newword

可以看到,第一行和最后一行都被替换了,而实际上,我们只想替换 bookbook ,也即是需要精确匹配,而不是现在的模糊匹配,这时候可以用下面的方式进行替换:

sed 's/\<bookbook\>/newword/' file.conf

结果如下

bookbookbookbook
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
newword

正则替换

正则替换其实也跟普通的替换一样的语法格式,只不过匹配项和替换项都是用的正则表达式而已

sed 's/\(xyz\)\(.*\)\(lmn\)/\1 1234567 \3/g' file.conf

结果如下:

bookbookbookbook
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz 1234567 lmn
bookbook

可以看到上面首先将匹配项使用正则拆分成了3部分,然后在替换项的内容中引用了第1和第3部分,并拼接成了新的替换项,这种操作也是文件修改中非常常用的一种用法。

指定替换起点(从匹配的所以行的指定匹配次数开始替换)

sed 's/book/good/2g' file.conf

结果如下:

bookgoodgoodgood
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
bookgood

可以看到,这里是从每个匹配到的行的第2次匹配结果开始替换的,所有每行第一个匹配结果并不会替换

全部替换(替换所有匹配行的匹配项)

sed 's/book/good/g' file.conf

结果如下:

goodgoodgoodgood
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
goodgood

替换匹配行整行内容(将匹配的整行内容替换,支持多行)

sed '/book/c newtext' file.conf

结果如下:

newtext
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
newtext

可以看到,这里是将匹配到的行的整个内容都替换成了指定内容,这种用法也很常见,比如我们对于这个文件需要将url的地址更换掉,可以执行如下命令即可:

sed '/url=/c url=https://tendcode.com' file.conf

删除匹配行

顾名思义,直接删除掉匹配到的所有行

sed '/book/d' file.conf

结果如下:

name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn