Jas*_*son 4 sed awk text-processing fstab regular-expression
我正在强化我们的一些系统。作为强化过程的一部分,我需要更新 /etc/fstab 中的一些条目以限制某些不同分区的功能。
话虽如此,我希望能够使用 sed 内联替换来更新行。以下是当前 /etc/fstab 的片段:
# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root / ext4 defaults 1 1
/dev/mapper/vg1-lv_home /home ext4 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
Run Code Online (Sandbox Code Playgroud)
运行 sed 命令后,我希望文件如下所示:
# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root / ext4 defaults 1 1
/dev/mapper/vg1-lv_home /home ext4 defaults,nodev 1 2
tmpfs /dev/shm tmpfs defaults 0 0
Run Code Online (Sandbox Code Playgroud)
基本上,我需要将“nodev”添加到所有不是根分区的 ext[2-4] 行。
我放在一起的 sed 命令接近于这样做,但无论出于何种原因,我都无法让正则表达式与“/”分区不匹配,因此它也总是更新该行。
sed '/^[^#].*ext[2-4]/s/defaults/defaults,nodev/g' /etc/fstab
Run Code Online (Sandbox Code Playgroud)
我想关闭由空格包围的“/”,而不是 vg1-lv_root。以下有效,但我不喜欢该解决方案,因为它很笨重:
sed '/^[^#].*ext[2-4]/s/defaults/defaults,nodev/g' /etc/fstab | sed '/^[^#].*root.*ext[2-4]/s/defaults,nodev/defaults/' > /etc/fstab
Run Code Online (Sandbox Code Playgroud)
您可以使用awk
添加逻辑来添加字符串并column
重新格式化最终输出文件。假设您对/etc/
和/tmp/
文件夹具有写权限
tempfile=$(mktemp /tmp/tmpfile.XXXXXXXX)
Run Code Online (Sandbox Code Playgroud)
这将/tmp/
在您可以将awk
输出写入的路径中创建临时文件并将其重定向回原始文件
awk '$3 ~ "ext[2-4]"{ $4=$4",nodev" }1 ' /etc/fstab | column -t > "$tempfile" && mv -- "$tempfile" /etc/fstab
Run Code Online (Sandbox Code Playgroud)
该column -t
部分只是多余的,需要使输出文件更具可读性,而不是使其混乱和笨重。
这是一个更简单的sed
方法:
$ sed -E 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab
# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root / ext4 defaults 1 1
/dev/mapper/vg1-lv_home /home ext4 defaults,nodev 1 2
tmpfs /dev/shm tmpfs defaults 0 0
Run Code Online (Sandbox Code Playgroud)
诀窍是寻找空格后跟 a/
和一个或多个非空格字符 ( \s/\S+
),然后ext[2-4]
但前提是前面有空格 ( \s+ext[2-4]
)、更多空格和defaults
。那应该只匹配你感兴趣的情况。所以如果它匹配,用它自己加上nodev
:替换整个匹配\1,nodev
。
但是,我不确定这有多便携。将-E
用于扩展正则表达式是由许多支持sed
的实现,但它不是POSIX。对于更便携的方法,您可以在 Perl 中尝试相同的想法:
$ perl -pe 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab
# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root / ext4 defaults 1 1
/dev/mapper/vg1-lv_home /home ext4 defaults,nodev 1 2
tmpfs /dev/shm tmpfs defaults 0 0
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,要就地编辑文件,请使用-i
:
perl -i -pe 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab
sed -E 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab
Run Code Online (Sandbox Code Playgroud)
或者,对于 BSD 或 OSX sed
:
sed -i '' -E 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab
Run Code Online (Sandbox Code Playgroud)
请注意,以上假设该defaults
选项将是唯一的,或者至少是最后一个。如果你有类似的东西,他们就会失败nodev,defaults
。