下面是一个包含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
答案 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$>