2014-09-05 49 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}' 

基本上,我們正在尋找那些只提到目錄一旦。可能有一個更優雅的方式來做到這一點,但這應該讓你得到你想要的。