linux三剑客-sed实战组合用法
基础用法:
sed -n '/error/p' app.log
功能: 打印包含 "error" 的行。
参数:
-n: 抑制自动输出。
/error/p: 打印匹配行。
sed 's/hello/world/g' app.log
功能: 将所有 "hello" 替换为 "world"。
参数:
s/hello/world/g: 全局替换。
sed -n '1p'
功能: 打印第一行。
参数:
-n: 抑制自动输出。
1p: 打印第一行。
sed -n '1,10p'
功能: 打印第1到第10行。
参数:
-n: 抑制自动输出。
1,10p: 打印指定范围的行。
sed -n '1~2p'
功能: 打印每隔一行(从第一行开始)。
参数:
-n: 抑制自动输出。
1~2p: 每隔一行打印。
sed -n '/error/,+10p'
功能: 从包含 "error" 的行开始,打印接下来的10行。
参数:
-n: 抑制自动输出。
/error/,+10p: 从匹配行开始打印10行。
sed -n '/begin/,/end/p'
功能: 打印从包含 "begin" 到包含 "end" 的行。
参数:
-n: 抑制自动输出。
/begin/,/end/p: 打印指定范围的行。
sed -n '/error/!p'
功能: 打印不包含 "error" 的行。
参数:
-n: 抑制自动输出。
/error/!p: 打印非匹配行。
sed 's/hello/world/'
功能: 替换第一个 "hello" 为 "world"。
参数:
s/hello/world/: 替换第一个匹配项。
sed 's/hello/world/3'
功能: 替换第三个 "hello" 为 "world"。
参数:
s/hello/world/3: 替换第三个匹配项。
sed 's/hello/world/3g'
功能: 从第三个 "hello" 开始全局替换。
参数:
s/hello/world/3g: 从第三个匹配项开始全局替换。
sed 's/hello/&:/g'
功能: 在每个 "hello" 后添加 ":"。
参数:
s/hello/&:/g: 使用 & 引用匹配项。
sed -E 's/id=(\w+),name=(\w+)/\1 \2/'
功能: 提取并重新格式化 id 和 name。
参数:
-E: 启用扩展正则表达式。
s/id=(\w+),name=(\w+)/\1 \2/: 提取并重写匹配项。
sed '/hello/c\world'
功能: 将包含 "hello" 的行替换为 "world"。
参数:
/hello/c\world: 替换匹配行为新内容。
sed '/error/!d'
功能: 删除不包含 "error" 的行。
参数:
/error/!d: 删除非匹配行。
sed '/error/i\begin'
功能: 在包含 "error" 的行前插入 "begin"。
参数:
/error/i\begin: 在匹配行前插入文本。
sed '/error/a\begin'
功能: 在包含 "error" 的行后追加 "begin"。
参数:
/error/a\begin: 在匹配行后追加文本。
sed -n '/error/{ /exeception/p }' app.log
功能: 打印包含 "error" 且包含 "exeception" 的行。
参数:
-n: 抑制自动输出。
/error/{ /exeception/p }: 嵌套条件打印。
sed -n '/error/{ p; p }' app.log
功能: 打印包含 "error" 的行两次。
参数:
-n: 抑制自动输出。
/error/{ p; p }: 多次打印匹配行。
高级用法:
ifconfig |sed -nE '/eth0: /{ n; s/.+inet (\S+).+/\1/p }'

功能:
从 ifconfig 输出中提取 eth0 接口的 IP 地址。
参数说明:
ifconfig: 显示网络接口信息。
sed -nE: 使用扩展正则表达式(-E)并抑制自动输出(-n)。
/eth0: /: 匹配包含 "eth0: " 的行。
{ n; ... }: 在匹配行后执行一系列操作。
n: 读取下一行。
s/.+inet (\S+).+/\1/: 提取 IP 地址。
正则表达式 s/.+inet (\S+).+/\1/:
这个表达式用于从字符串中提取 IP 地址。
详细解释:
s/.../.../: 这是 sed 命令中的替换操作符。它将匹配的部分替换为指定的内容。
s: 替换操作符。
/.../: 匹配模式。
/.../: 替换内容。
匹配模式 .+inet (\S+).+:
.+: 匹配任意字符(除了换行符)一个或多个。
例如,它可以匹配 "eth0 inet " 中的 "eth0 " 部分。
inet: 匹配字符串 "inet"。
(\S+): 匹配一个或多个非空白字符,并将其捕获为一个组。
\S: 非空白字符。
\s:空白字符
\w: [0-9a-zA-Z_]
\W: 除了[0-9a-zA-Z_]以外的字符
+: 一个或多个。
():捕获组,用于引用匹配的内容。
.+: 再次匹配任意字符(除了换行符)一个或多个。
例如,它可以匹配 "netmask 255.255.255.0" 部分。
替换内容 \1:
\1: 引用第一个捕获组(即 (\S+) 捕获的 IP 地址)。
例如,如果匹配到 "inet 192.168.1.1 netmask 255.255.255.0",\1 将引用 "192.168.1.1"。
总结:
.+inet (\S+).+ 匹配包含 "inet" 的行,并捕获 IP 地址。
\1 引用捕获的 IP 地址,从而提取并输出 IP 地址。
seq -s, 8 | sed 's/,/\n/3;P;D'

功能:
生成从1到8的数字序列,用逗号分隔。
将第三个逗号替换为换行符,并打印前半部分。
参数说明:
seq -s, 8: 生成从1到8的数字序列,用逗号分隔。
sed 's/,/\n/3;P;D':
s/,/\n/3: 将第三个逗号替换为换行符。
P: 打印当前模式空间的内容(即前半部分)。
D: 删除模式空间中到第一个换行符之前的部分,若删除后还有数据,则继续处理。
seq 8 |sed ':a;N;0~3!{$!ba};s/\n/,/g'

功能:
生成从1到8的数字序列,每3个数字换行,其余用逗号分隔。
参数说明:
seq 8: 生成从1到8的数字序列。
🅰️ 定义一个标签 a。
N: 将下一行追加到模式空间。
0~3!: 每3行执行一次操作。
{$!ba}: 如果不是最后一行,跳转到标签 a。
s/\n/,/g: 将模式空间中的换行符替换为逗号。
sed还有模式空间和保留空间的概念,默认将每一行加载在模式空间,模式和操作都基于模式空间执行。sed设计的保留空间,可想象成另一个变量,基于它可以实现一些非常复杂的功能。
h: 将当前模式空间的内容复制到保持空间(hold space)。
示例:
echo "hello" | sed 'h'
- 这将把 "hello" 复制到保持空间,但不会改变输出。
H: 将当前模式空间的内容追加到保持空间(hold space),并在它们之间插入一个换行符。
示例:
echo "hello" | sed 'H'
- 这将把 "hello" 追加到保持空间,并在前后添加换行符。
g 和 G
g: 将保持空间的内容复制到当前模式空间,覆盖当前模式空间的内容。
示例:
echo "hello" | sed 'h; g'
- 这将把 "hello" 复制到保持空间,然后再复制回模式空间,结果仍然是 "hello"。
G: 将保持空间的内容追加到当前模式空间,在它们之间插入一个换行符。
示例:
echo "hello" | sed 'h; G'
- 这将把 "hello" 复制到保持空间,然后再追加回模式空间,结果是 "hello\nhello"。
x
x: 交换当前模式空间和保持空间的内容。
示例:
点击收起
echo "hello" | sed 'h; x'
- 这将把 "hello" 复制到保持空间,然后交换模式空间和保持空间的内容,结果仍然是 "hello"
h: 复制模式空间到保持空间。
H: 追加模式空间到保持空间。
g: 复制保持空间到模式空间。
G: 追加保持空间到模式空间。
x: 交换模式空间和保持空间的内容。

seq 5 | sed -n '1!G; $p; h;'
功能:
生成从1到5的数字序列。
使用 sed 命令将序列倒序输出。每次处理将数字追加到模式空间,然后再复制回保持空间
参数说明:
seq 5: 生成从1到5的数字序列。
sed -n '1!G; $p; h;':
-n: 抑制自动输出,只在特定条件下输出。
1!G: 在第一行以外的所有行执行 G 命令,即将保持空间的内容追加到模式空间。
$p: 在最后一行执行 p 命令,打印当前模式空间的内容。
h;: 将当前模式空间的内容复制到保持空间。

浙公网安备 33010602011771号