我想在脚本中更改/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做到这一点?
答案 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
$2~"^/$"
搜索第二个字段$2
以查看它是否与正斜杠相匹配^/$
{$4="acl,"$4}
如果我们看到匹配项,请将 acl 添加到第4个字段的开头$4
}1
这是awk
快捷方式,相当于print $0
,即打印整行(包括我们可能做出的任何更改)OFS="\t"
将输出字段分隔符OFS
设置为标签\t
。默认为空格/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。
我猜您可以使用以下内容:
# 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
它将内容分为五个字段(卷,挂载点,文件系统类型,选项,其他所有内容),按空格分割。