比较两个结果并打印缺失的部分(如果存在)

时间:2014-09-05 17:08:53

标签: bash unix

我可能会问一个微不足道的问题,但无法找到正确的方法。

我在多个服务器中进行ssh,并将/ etc / fstab中的预期nfs挂载与/ proc / mounts中的现有挂载进行比较。

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

如果所有坐骑都存在并且已安装,我必须打印一切正常,如果有一些丢失则将它们打印出来并重新安装。

我尝试与之比较:

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

嵌套循环也没有成功。

提前致谢。

2 个答案:

答案 0 :(得分: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 :(得分:0)

您可以通过以下方式获取$VAR1$VAR2的结果:

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

基本上,我们正在寻找仅提及一次的目录。可能有一种更优雅的方式来做到这一点,但这应该可以得到你想要的东西。