2014-09-05 22 views
1

可能是我在问一个微不足道的问题,但找不到正确的方法。比较两个结果并打印缺少的部分(如果存在)

我在多台服务器上ssh'ing,并比较了/ etc/fstab与来自/ proc/mounts的现有挂载的预期nfs挂载。

VAR1=$(awk '!/^#/ && $3 == "nfs" {print $2}' /etc/fstab) 
VAR2=$(awk '!/^#/ && $3 ~ /nfs[34]/ && $1 !~ /gfs/ {print $2}' /proc/mounts) 

例如,从/etc/fstab

/data1 
    /data2 
    /data3 

而且从/proc/mounts

/data1 
    /data2 

如果所有坐骑存在并安装我要打印一切OK,如果某些失踪打印出来并重新安装。

我尝试了比较工作:

awk 'FNR==NR {a[$1]; next} $1 in a' file1 file2 (but not works with $VAR1/$VAR2). 

随着嵌套循环也没有成功。

在此先感谢。

+0

在原始文件('/ etc/fstab'和'/ proc/mounts')上使用awk模式来获取缺少挂载点的列表。您可能想在第一个循环中使用该数组中的$ 3。 – 2014-09-05 17:19:04

+0

@Etan对不起,您能详细说明一下吗 – user1607856 2014-09-05 18:02:44

+0

您说过您试图将awk模式用于此目的,但它不适用于变量。确实如此,但它确实可以处理文件名,并且您只编写了两个处理文件名的awk脚本。不要三次运行awk,只运行一次。给它两个文件作为参数,并为第一个文件做'FNR == NR'映射循环,并检查第二个和唯一打印输出的线路是否通过检查。 – 2014-09-05 18:08:28

回答

2

你可以得到缺少的坐骑是这样的:

comm -23 <(printf '%s\n' "$VAR1") <(printf '%s\n' "$VAR2") 

这将打印其仅在$VAR1线。

或者作为一个班轮:

comm -23 <(awk '!/^#/ && $3 == "nfs" {print $2}' /etc/fstab) <(awk '!/^#/ && $3 ~ /nfs[34]/ && $1 !~ /gfs/ {print $2}' /proc/mounts) 
+1

我想你必须重新添加换行符, 'echo $ VAR1 |第一个例子是sed -r's/\ s +/\ n /''。 – zerodiff 2014-09-05 18:13:36

+0

好点,固定。 – l0b0 2014-09-05 18:28:28

0

您可以从$VAR1$VAR2这种方式得到的结果:

for i in $VAR1 $VAR2; do echo $i; done \ 
    | sort | uniq -c | awk '/\s+1/ {print $2}' 

基本上,我们正在寻找那些只提到目录一旦。可能有一个更优雅的方式来做到这一点,但这应该让你得到你想要的。