Linux 三剑客(grep awk sed)常用操作笔记

2022-09-26 18:09:15 浏览数 (1)

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

  • sed 命令常用操作
    • 简单替换(只替换每个匹配行的首次匹配项)
    • 精确替换
    • 正则替换
    • 指定替换起点(从匹配的所以行的指定匹配次数开始替换)
    • 全部替换(替换所有匹配行的匹配项)
    • 替换匹配行整行内容(将匹配的整行内容替换,支持多行)
    • 删除匹配行

三个命令的一般性作用:

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

sed 命令常用操作

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

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

代码语言:javascript复制
bookbookbookbook
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
bookbook

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

代码语言:javascript复制
sed 's/book/good/' file.conf

结果如下:

代码语言:javascript复制
goodbookbookbook
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
goodbook

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

精确替换

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

代码语言:javascript复制
sed 's/bookbook/newword/' file.conf

结果如下

代码语言:javascript复制
newwordbookbook
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
newword

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

代码语言:javascript复制
sed 's/<bookbook>/newword/' file.conf

结果如下

代码语言:javascript复制
bookbookbookbook
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
newword

正则替换

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

代码语言:javascript复制
sed 's/(xyz)(.*)(lmn)/1 1234567 3/g' file.conf

结果如下:

代码语言:javascript复制
bookbookbookbook
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz 1234567 lmn
bookbook

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

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

代码语言:javascript复制
sed 's/book/good/2g' file.conf

结果如下:

代码语言:javascript复制
bookgoodgoodgood
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
bookgood

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

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

代码语言:javascript复制
sed 's/book/good/g' file.conf

结果如下:

代码语言:javascript复制
goodgoodgoodgood
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
goodgood

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

代码语言:javascript复制
sed '/book/c newtext' file.conf

结果如下:

代码语言:javascript复制
newtext
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn
newtext

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

代码语言:javascript复制
sed '/url=/c url=https://tendcode.com' file.conf

删除匹配行

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

代码语言:javascript复制
sed '/book/d' file.conf

结果如下:

代码语言:javascript复制
name=jack
ip=127.0.0.1
url=https://abc.xxxxx.com
xyz showowof3442 lmn

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处 本文链接:https://cloud.tencent.com/developer/article/2123547 许可协议:署名-非商业性使用 4.0 国际许可协议

0 人点赞