使用sed更改/ etc / fstab

时间:2012-02-02 18:48:43

标签: unix sed

我想在脚本中更改/etc/fstab。我想将acl属性添加到根分区。

一个fstab行条目如下所示:

UUID=730aee20-52b7-4920-75cd-d0d995ef2445 /   ext3   errors=remount-ro 0   1

我想将其更改为:

UUID=730aee20-52b7-4920-75cd-d0d995ef2445 /   ext3    acl,errors=remount-ro 0   1

我想:  1.使用根分区/的搜索行  2.在acl

之后插入/

我怎么能用sed做到这一点?

6 个答案:

答案 0 :(得分:7)

当我们都有awk时,谁需要第三方工具?

awk '$2~"^/$"{$4="acl,"$4}1' OFS="\t" /etc/fstab

示例输出

$ awk '$2~"^/$"{$4="acl,"$4}1' OFS="\t" /etc/fstab
/dev/sda2        swap             swap        defaults         0   0
/dev/sda5       /       ext4    acl,defaults    1       1
/dev/sda1        /boot            ext4        defaults         1   2
/dev/sda6        /home            ext4        defaults         1   2
/dev/sdb1        /backup          ext4        defaults         1   2
#/dev/cdrom      /mnt/cdrom       auto        noauto,owner,ro  0   0
/dev/fd0         /mnt/floppy      auto        noauto,owner     0   0
devpts           /dev/pts         devpts      gid=5,mode=620   0   0
proc             /proc            proc        defaults         0   0
tmpfs            /dev/shm         tmpfs       defaults         0   0

说明

  1. $2~"^/$"搜索第二个字段$2以查看它是否与正斜杠相匹配^/$
  2. {$4="acl,"$4}如果我们看到匹配项,请将 acl 添加到第4个字段的开头$4
  3. }1这是awk快捷方式,相当于print $0,即打印整行(包括我们可能做出的任何更改)
  4. OFS="\t"将输出字段分隔符OFS设置为标签\t。默认为空格
  5. /etc/fstab我们要用作输入的文件

答案 1 :(得分:4)

我想最好的方法是使用augeas,这是一个很棒的工具。使用augeas,您可以自动解析配置文件,使用XPATH追加/删除/更新某些字段,用于浏览XML。

您可以在以下目录中找到augeas可以正确解析的所有受支持的配置文件:

/usr/share/augeas/lenses/dist/

其中一个文件是fstab.aug,这是你想要的。你实际上并不需要对这些文件做任何事情,它只是让你知道augeas可以做你想做的事情:)。

# ls /usr/share/augeas/lenses/dist/fstab.aug
/usr/share/augeas/lenses/dist/fstab.aug

您还可以在此处查看更详细的示例,通过augeas更改/ etc / fstab。

Augeas Example

我猜您可以使用以下内容:

# augtool
augtool> set /files/etc/fstab/1[file='/']/opt[1] "acl"
augtool> set /files/etc/fstab/1[file='/']/opt[2] "errors=remount-ro"
augtool> print /files/etc/fstab/1
/files/etc/fstab/1
/files/etc/fstab/1/spec = "/dev/mapper/system"
/files/etc/fstab/1/file = "/"
/files/etc/fstab/1/vfstype = "ext3"
/files/etc/fstab/1/opt[1] = "acl"
/files/etc/fstab/1/opt[2] = "errors=remount-ro"
/files/etc/fstab/1/dump = "0"
/files/etc/fstab/1/passno = "1"
augtool> save

如果你想在shell脚本中使用augeas,你可以用augtool关键字加上上面的命令,所以如果你想把第一个'opt'改为'acl',你会这样做:

augtool set /files/etc/fstab/1[file='/']/opt[1] "acl"
augtool set /files/etc/fstab/1[file='/']/opt[2] "errors=remount-ro"
augtool save

查看原始的augeas页面了解更多信息:Augeas Homepage

答案 2 :(得分:2)

为Wes的一个增加了价值 - \w而不是[a-zA-Z0-9]\s而不是空格。它确实有效:)

sed -e 's:\(.*\)\(/\s*\w*\s*\)\(.*\):\1\2acl,\3:' /etc/fstab

答案 3 :(得分:1)

好吧,我不会讨论sed是否适合这项工作(我不确定),但是:

sed 's#( / +[a-zA-Z0-9]+ +)#$1acl,#'

哪个应该找到/ mount,并在挂载点之后的第二个字段之前添加acl。

答案 4 :(得分:1)

这可能对您有用:

sed 's|^\S*\s\+/\s\+\S*\s\+|&acl,|' /etc/fstab

答案 5 :(得分:0)

以下适用于我(寻找" /"(根)挂载点并在"默认值"前面添加" acl,") :

sed -e 's:\(.*\)\(\s/\s\s*\)\(\w*\s*\)\(\w*\s*\)\(.*\):\1\2\3acl,\4\5:' /etc/fstab

关于我的fstab的内容:

/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0

它将内容分为五个字段(卷,挂载点,文件系统类型,选项,其他所有内容),按空格分割。