我必须删除15个文件(服务器)中的root权限条目,并在单独的文件中提供NFS共享并控制此过程 - 我想通过服务器进行一些额外的检查。我有2个文件,首先称为nfspaths,如下例所示:
cat ./nfspaths:
/mnt/vol/virtserver1/sharename
/mnt/vol/virtserver2/sharename
/mnt/vol/virtserver4/sharename
和exportfs看起来像这样:
cat ./exportfs:
/mnt/vol/virtserver1/sharename rw=host1,host2,host3,root=host1,host2,host3,host4,host5
/mnt/vol/virtserver2/sharename rw=host1,host2,host3,root=host1,host2,host3,host4,host5
/mnt/vol/virtserver3/sharename rw=host1,host2,host3
/mnt/vol/virtserver4/sharename rw=host1,host2,host3,root=host1,host2,host3,host4,host5
/mnt/vol/virtserver5/sharename rw=host1,host2,host3
我想创建一个在nfspath中查找nfspath的脚本,并且该行将删除root权限。我试图用sed做这份工作,我写了这样的话:
for nfspath in `cat nfspaths.list`
do
sed -i -n -e "\,$nfspath,p" -e 's/,root=.*$//g' exports
done
,但这没有按照我的预期工作,那些2 sed cmds单独工作正常,但我无法在一个命令中找到解决方案。
他们做了什么?在" for"循环我得到一个路径(带有斜杠),对于那个路径,sed应该是grep exportfs文件(第一次出现:sed -i -n -e "\,$nfspath,p"
),第二个应该删除模式",root ="到那条线的尽头。在上面的命令中,sed独立工作,并从exportfs文件中删除所有内容。我知道我应该做别的事而不是第二次" -e"对于sed,但我无法通过谷歌找到任何好的例子来做到这一点。
这个oneliner有什么问题以及如何改进它?
答案 0 :(得分:2)
任何时候你在shell中编写循环只是为了操作文本你都有错误的方法。只需使用awk:
awk 'NR==FNR{a[$0];next} $1 in a{sub(/,root.*/,"")} 1' nfspaths exports
不需要显式循环,不用担心分隔符字符等。
您可以将-i inplace
与GNU awk 4. *一起使用,如果您不喜欢手动指定tmp文件,或者只是将> tmp && mv tmp exports
添加到行的末尾。
答案 1 :(得分:0)
我很确定你可以为s/
命令提供这样的参数:
while read nfspath
do
sed -i -e "\,$nfspath, s/,root=.*$//" exports
done <nfspaths.list
更改为while read
的个人偏好,但我认为它更清晰,更直接。
我也摆脱了g
参数,因为你的锚($
)意味着根据定义它会发生一次。