只更改bash中/ etc / fstab文件中的一些条目

时间:2016-10-06 16:16:35

标签: bash redhat

下面是一个包含9个条目的示例/ etc / fstab。如何仅为nfs共享更改第4列(从默认值到-noexec,nodev)?如何使用例外文件来执行此操作?或者,如果我想在系统范围内进行此操作,还有其他方法吗?

/dev/appvg/me         /me     ext4    defaults        0 0
/dev/appvg/you         /you    ext4    defaults        0 0
/dev/appvg/we         /we     ext4    defaults        0 0
/dev/appvg/us         /us     ext4    defaults        0 0
nas-prd-unix.com:/vol/unix/he         /he     nfs    defaults        0 0
nas-prd-unix.com:/vol/unix/she         /she     nfs    defaults        0 0
nas-prd-unix.com:/vol/unix/it         /it     nfs    defaults        0 0
nas-prd-unix.com:/vol/unix/one         /one     nfs    defaults        0 0
nas-prd-unix.com:/vol/unix/two         /two     nfs    defaults        0 0

3 个答案:

答案 0 :(得分:0)

您可以使用带有后视断言的正则表达式。这些由Perl支持,例如:

perl -pe 's/test[3469].*\Kdefaults/defaults,nodev/' /etc/fstab

要使用备份就地更改文件,您可以执行以下操作:

perl -p -i.bak -e 's/test[3469].*\Kdefaults/defaults,nodev/' /etc/fstab

答案 1 :(得分:0)

在awk中:

$ awk '$1 ~ /test[3469]/{sub(/defaults {6}/,"defaluts,nodev",$0)} 1' /etc/fstab
/dev/appvg/test1         /test1     nfs    defaults        0 0
/dev/appvg/test2         /test2     nfs    defaults        0 0
/dev/appvg/test3         /test3     nfs    defaluts,nodev  0 0
/dev/appvg/test4         /test4     nfs    defaluts,nodev  0 0
/dev/appvg/test5         /test5     nfs    defaults        0 0
/dev/appvg/test6         /test6     nfs    defaluts,nodev  0 0
/dev/appvg/test7         /test7     nfs    defaults        0 0
/dev/appvg/test8         /test8     nfs    defaults        0 0
/dev/appvg/test9         /test9     nfs    defaluts,nodev  0 0

如果你坚持排除档案:

$ cat exclusions.txt
/dev/appvg/test1
/dev/appvg/test2
/dev/appvg/test5
/dev/appvg/test7
/dev/appvg/test8

脚本:

$ cat script.awk
NR==FNR { a[$1];next }                                  # remember exclusions
!($1 in a) { sub(/defaults {6}/,"defaluts,nodev",$0) }  # don't replace on them
1                                                       # print

运行它:

$ awk -f script.awk exclusions.txt /etc/fstab
# for output, see above.

答案 2 :(得分:0)

与尤金的答案有些相似......

# Your input data or file "data.txt"

bash$> cat data.txt
/dev/appvg/test1         /test1     nfs    defaults        0 0
/dev/appvg/test2         /test2     nfs    defaults        0 0
/dev/appvg/test3         /test3     nfs    defaults        0 0
/dev/appvg/test4         /test4     nfs    defaults        0 0
/dev/appvg/test5         /test5     nfs    defaults        0 0
/dev/appvg/test6         /test6     nfs    defaults        0 0
/dev/appvg/test7         /test7     nfs    defaults        0 0
/dev/appvg/test8         /test8     nfs    defaults        0 0
/dev/appvg/test9         /test9     nfs    defaults        0 0
bash$>

# Apply a perl command, which performs in place editing. 

** Caution: If you don't formulate the command properly, it may damage the file **

bash$> perl -pi -e 'if (m/test[3469]/) {$_ =~ s/defaults/defaults,nodev/g}' data.txt  ; cat data.txt
/dev/appvg/test1         /test1     nfs    defaults        0 0
/dev/appvg/test2         /test2     nfs    defaults        0 0
/dev/appvg/test3         /test3     nfs    defaults,nodev        0 0
/dev/appvg/test4         /test4     nfs    defaults,nodev        0 0
/dev/appvg/test5         /test5     nfs    defaults        0 0
/dev/appvg/test6         /test6     nfs    defaults,nodev        0 0
/dev/appvg/test7         /test7     nfs    defaults        0 0
/dev/appvg/test8         /test8     nfs    defaults        0 0
/dev/appvg/test9         /test9     nfs    defaults,nodev        0 0
bash$>

如果你经常这样做,那么使用这个脚本,然后如图所示将参数提供给它,它将制定一个命令并为你执行它。

# Script output

bash$> ./run.sh "test[3469]" "defaults" "defaults,nodev"
Formed Command is :     perl -pi -e 'if(m/test[3469]/) {s/defaults/defaults,nodev/g}' data.txt

/dev/appvg/test1         /test1     nfs    defaults        0 0
/dev/appvg/test2         /test2     nfs    defaults        0 0
/dev/appvg/test3         /test3     nfs    defaults,nodev        0 0
/dev/appvg/test4         /test4     nfs    defaults,nodev        0 0
/dev/appvg/test5         /test5     nfs    defaults        0 0
/dev/appvg/test6         /test6     nfs    defaults,nodev        0 0
/dev/appvg/test7         /test7     nfs    defaults        0 0
/dev/appvg/test8         /test8     nfs    defaults        0 0
/dev/appvg/test9         /test9     nfs    defaults,nodev        0 0
bash$>

这是一个脚本,如果需要经常这样做,可以将其作为通用目的,尽管这不是唯一的方法。人们可以设计出数吨其他方法来达到相同的结果。这只是一种方法。

bash$> cat run.sh
#!/bin/bash

# Taking Input parameters in a,b,c

a="$1"
b="$2"
c="$3"

# Old command for reference
#perl -pi -e 'if (m/test[3469]/) {$_ =~ s/defaults/defaults,nodev/g}' data.txt  ; cat data.txt

# Now formulate a command and use substitution
cmd="perl -pi -e 'if(m/$a/) {s/$b/$c/g}' data.txt"

echo "Formed Command is :       $cmd"

# Execute the formulated command
eval "$cmd"

# Check the output after execution.
echo ; cat data.txt
bash$>