Code前端首页关于Code前端联系我们

Linux生产环境中最常用的一套“sed命令”技巧

terry 2年前 (2023-09-28) 阅读数 54 #未命名

sed命令用途广泛且易于使用,是快速文本处理的强大工具。事实上,它并没有太多的技能。记忆和运用是最适合的学习渠道,也是一项有难度的技能。但它很复杂,因为有很多高级功能。本文不重点介绍sed的高级功能,仅讲解一些常用操作。

当你使用它的时候,你会发现它符合一些概念vim。正则表达式的语法基本相同,没有太多的学习开销。从个人视野和工作效率来看,sed命令是程序员需要掌握的重要工具。

那些说现场能用Google的人,大多习惯把文字复制到Excel中,慢慢搞,遇到大量文件就更糊涂了。这并不意味着一个家庭不进入另一个家庭。这篇文章不是为你写的。

简单介绍

Linux生产环境最常用的一套“sed命令“技巧

如图所示,一个简单的sed命令包含三个主要部分:参数区域❀。将要操作的文件直接挂在命令行末尾即可。除了命令行之外,sed 还可以通过 -f 参数指定 sed 脚本。这是高级用法,不再过多描述。

我将多次重复一些示例命令。如果你聪明的话,你一定会发现其中的规律,有时甚至不需要解释。

参数

-n 该参数表示--安静--silent♶。指定忽略执行过程的输出,只输出我们的结果。

还有一个我们常用的参数:-i

使用此参数后,所有更改都将在原始文件上进行。您的输出将覆盖原始文件。 非常危险,小心。

范围

1,4表示查找文件中第1、2、3、4行的内容。

这个系列的命名很有灵性,请看下面的例子(请自行替换图中的范围)。

5 选择第 5 行。
2.5 选择第 2 至第 5 行,共 4 行。
1~2 选择奇数行。
2~2 选择偶数行。
2、+32.5 效果相同,共 4 行。
2,$ 从第二行到文件末尾。

范围选择也可以使用正则匹配。请参阅下面的示例。

/sys/,+3 选择单词 sys 出现的行以及以下三行。
/\^sys/,/mem/ 选择以 sys 开头的行和带有单词 mem 的行之间的数据。

为了直观起见,以下命令与上面的介绍一一对应。触及范围和操作之间可能存在差距。

sed -n '5p' file

sed -n '2,5 p' file

sed -n '1~2 p' file

sed -n '2~2 p' file

sed -n '2,+3p' file

sed -n '2,$ p' file

sed -n '/sys/,+3 p' file

sed -n '/^sys/,/mem/p' file

操作

最常用的操作是p,即打印的意思。比如下面两条命令是等价的:

cat file 

sed -n 'p' file

除了打印之外,还有下面我们常用的操作。

p 打印匹配的内容。
d 删除匹配的内容。此时,必须删除参数-n。想想为什么。
w 在其他地方写下匹配的内容。

aic等操作都是基础但很少用到的,就不介绍了。我们还是用一些命令来说明。

sed -n '2,5 p' file

sed    '2,5 d' file

sed -n '2,5 w output.txt' file

替换模式

上面是sed命令的正则匹配模式,但它还有一个强大的替换模式,即查找并替换其中的某些值并输出结果。使用替换模式很少使用参数-nLinux生产环境最常用的一套“sed命令“技巧

替换模式参数较多,但第一部分和第五部分可以省略。替换后,将打印整个文本

前半部分用于匹配某些范围,后半部分执行替换操作。

范围

此范围对应于上面的范围语法。请参阅下面的示例。

/sys/,+3 选择单词 sys 出现的行以及以下三行。
/\^sys/,/mem/ 选择以 sys 开头的行和带有单词 mem 的行之间的数据。

具体命令是:

sed '/sys/,+3 s/a/b/g' file

sed '/^sys/,/mem/s/a/b/g' file

命令

这里的命令指的是s,就是替换的意思。

查找匹配项

搜索部分查找要替换的字符串。这部分可以接受纯字符串或正则表达式。请参阅下面的示例。

a 在范围数组中查找字符串 a
[a,b,c] 从范围 range 中搜索字符串 a 或 b 或 c。命令

如下所示:

sed 's/a/b/g' file

sed 's/[a,b,c]/<&>/g' file

#这个命令我们下面解释

替换

是时候替换找到的字符串了。此部分的内容替换“查找匹配项”部分的内容。

不幸的是,这部分不能使用正则表达式。最常用的是精确替换。更换例如a 和 b.

但也有高级功能。与Java或Python中常见的API类似,sed的替换也有Matched Pattern的含义,Group也可以不加赘述地获取。常用的替换符号是&

&,重复一遍。当用于替换字符串时,它表示原始搜索匹配数据。

[&]表示查找到的数据被[]包围。
“&” 表示要查找的数据被“”包围。

以下命令用引号将文件中的每一行引起来。

sed 's/.*/"&"/' file

标志参数

这些参数可以单独使用,也可以多个使用。只介绍最​​常用的。

g 默认情况下,仅匹配该行中第一次出现的内容。添加 g 以替换整个文本。经常使用。
p 当使用-n参数时,p将仅输出匹配行。
w 与上面的 w 模式类似,但它只输出变换后的行。
i 这个参数比较重要,表示忽略大小写字母。
e 表示对于每个输出行执行一个命令。不建议使用,可以使用xargs来完成这个功能。

看一下两个命令的语法:

sed -n 's/a/b/gipw output.txt' file

sed 's/^/ls -la/e' file

Funny

由于规律性,很多字符必须转义。你会在脚本中做很多\\\*等处理。您可以使用四个字符 |^@! 来替换 \

例如下面五个命令是一样的吗?

sed '/aaa/s/\/etc/\/usr/g' file

sed '/aaa/s@/etc@/usr@g' file

sed '/aaa/s^/etc^/usr^g' file

sed '/aaa/s|/etc|/usr|g' file

sed '/aaa/s!/etc!/usr!g' file

注意:该方法不适用于前半部分区域。我习惯使用符号@

其他

正则表达式

如您所见,正则表达式在命令行中无处不在。下面是一个简单的解释。

^ 线路起点
$ 线路终点
❀❀❓ * 0 或更多匹配Linux生产环境最常用的一套“sed命令“技巧

+
1 场或以上比赛 ? ♿m♿ 0 或 1 场比赛 ♿m♿ 重复上一场比赛 m 次
{m,n}前一个匹配重复 m 到 n 次
\ 转义字符 ❓♿❝ 匹配括号 对于 中的任何字符, or 的函数是

| or, or

\b 匹配一个单词。例如,\bluky\b只匹配单词lucky

参数i

上面简单介绍了参数i。它的作用是允许对原始文件进行操作。无论您做什么,原始文件都会被覆盖。这是非常危险的。

通过添加参数即可备份原文件。

sed -i.bak 's/a/b/' file

以上命令会对原file文件生效,生成file.bak文件。强烈建议使用 i 参数来指定 bak 文件。

让我们展示一下

让我们用两个命令来看看 sed 与其他命令结合的威力。

输出长度不少于50个字符的行

sed -n '/^.{50}/p'

统计每个单词在文件中出现的次数

sed 's/ /\n/g' file | sort | uniq -c

找到文件夹中的py文件,删除所有行级注释

find ./ -name "*.py" | xargs sed  -i.bak '/^[ ]*#/d'

参见第5页-7行和第10-13行

sed -n -e '5,7p' -e '10,13p' file

只输出ip地址

ip route show | sed -n '/src/p' | sed -e 's/  */ /g' | cut -d' ' -f9

作者:小姐姐味道
来源:知乎

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门