在下面的示例fstab
文件中,我们要删除所有以 开头的行UUID
,但除了UUID
带有boot
word的行
/dev/mapper/VG100-lv_root / xfs defaults 0 0
UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot xfs defaults 0 0
/dev/mapper/VG100-lv_var /var xfs defaults 0 0
UUID=0b14011d-f69d-4c4c-8ce0-6240bb0a574a /var/kafka/mp1 xfs defaults,noatime 0 0
UUID=2d7872f2-96d4-4ba9-8a17-a1115542645c /var/kafka/mp2 xfs defaults,noatime 0 0
UUID=79bdbf56-9a09-4505-ab8e-41ce9432cf0f /var/kafka/mp3 xfs defaults,noatime 0 0
UUID=ca42a388-83d4-4f8b-aff7-3450d836eef7 /var/kafka/mp4 xfs defaults,noatime 0 0
UUID=62d356bb-c393-4a74-bbf9-984b60d3b5c4 /var/kafka/mp5 xfs defaults,noatime 0 0
UUID=d4071a83-204f-475f-8917-cdd77ef6b1ed /var/kafka/mp6 xfs defaults,noatime 0 0
所以例外的结果应该如下
/dev/mapper/VG100-lv_root / xfs defaults 0 0
UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot xfs defaults 0 0
/dev/mapper/VG100-lv_var /var xfs defaults 0 0
到目前为止,我们有以下 sed
sed -i '/^UUID/d' /etc/fstab
但是上面的方法删除了所有UUID
行
在我看来,您想删除第一个字段以开头
UUID=
而第二个字段不是的行/boot
。So
awk
或 perl 的 awk 模式似乎是一个显而易见的选择:(GNU awk 可以使用 就地编辑
-i inplace
)。(
perl
有-i
就地编辑)。等效项可以通过以下方式完成
sed
:有些s 可以使用(大多数)或(FreeBSD 和包括 macos 在内的衍生产品)
sed
进行就地编辑。-i
-i ''
有很多可能性。保持简单你可以使用
{}
当模式匹配时,它用于包含更多要执行的命令。如果引导匹配,b
分支到命令的末尾,否则d
完成。或者,如果引导不匹配,则删除。这些模式应该通过匹配空格来增强,但如果您了解文件中的预期内容,您可能并不关心。
单行版本可能不适用于某些版本
sed
:和
首先告诉 sed 打印包含 的行
boot
,然后告诉它删除包含UUID
, 分隔表达式的行;
由于 print 表达式在 delete 表达式之前给出,包含 boot 的行将被打印,在删除带有 UUID 的行之前,如果您要更改表达式位置,这是行不通的。
鉴于你给出的例子,你应该得到这样的东西
^
您还可以添加删除空行、标记行首和$
标记行尾的部分,因此添加表达式以删除$
行尾紧跟在行首之后的行^
。编辑
正如 Stéphane Chazelas 在评论中指出的那样,如果同一行中不包含 UUID,这将打印包含 boot 的行两次,所以这样的事情会更好。
它将删除以 UUID 开头的行,除非它们包含 /boot,然后删除所有空行
使用perl:
-i
中的相似,sed
在线替换正则表达式匹配如下:
^
UUID
\S+
\s++
(?!
/boot
)
.*
\n
我自己会在 awk 中执行此操作,因为当某项计算结果为真时,我们可以利用默认操作打印该行。所以我们需要做的就是测试这一行是匹配
boot
还是不匹配UUID
:您还可以删除空行:
/boot
您可以通过确保匹配并作为单个“单词”来使它更安全一些,并且它UUID
位于行的开头,然后是=
:而且,使用 GNU awk,您可以使用它
-i inplace
来编辑原始文件,就像sed
:如果您绝对必须使用
sed
,这里还有另一种方法:关闭
-n
行打印,然后我们打印 (p
) 如果行匹配/boot
或不匹配UUID
(!p
末尾的/UUID/!p
意思是“如果不匹配则打印”)。最后,这是另一种 perl 方法:
我怎么强调都不为过:您不想使用 sed 脚本执行此操作。
改用类似 Ansible 的东西。
只需快速阅读其模块的文档
mount
,您就会发现您可以使用以下内容为整个 2500 多个系统集群自动化它:这会