Text-Processing
僅獲取不匹配的列表作為輸出
我想知道 MAC 地址過濾在特定客戶的防火牆的哪些埠上未啟動。所以我創建了2個文件:
all.txt
包含客戶所有防火牆的列表,如下所示:abc123 ahg578 dfh879 ert258 fgh123 huz546 jki486 lop784 mnh323 xsd451 wqa512 zas423
active.txt
包含 MAC 地址過濾處於活動狀態的同一客戶的防火牆列表,如下所示:abc123: set macaddr 00:00:00:00:00:00 ahg578: set macaddr 00:00:00:00:00:00 dfh879: set macaddr 00:00:00:00:00:00 ert258: set macaddr 00:00:00:00:00:00 fgh123: set macaddr 00:00:00:00:00:00 huz546: set macaddr 00:00:00:00:00:00 mnh323: set macaddr 00:00:00:00:00:00 xsd451: set macaddr 00:00:00:00:00:00 wqa512: set macaddr 00:00:00:00:00:00 zas423: set macaddr 00:00:00:00:00:00
我比較了這兩個列表使用
comm -3 ~/active.txt ~/all.txt
並得到這個結果:
我怎樣才能只獲得不匹配的列表作為輸出?所以我希望輸出只有
jki486 lop784
我曾嘗試使用
sdiff
,grep -rL
,grep -vxFf
但它們都不起作用。僅供參考,我正在使用 GNU。Linux 版本 3.2.0-6-amd64;gcc 版本 4.9.2
我將衷心感謝您的幫助!謝謝!:)
grep -v 將起作用,只需將源與目標交換即可。
-
將使用管道-f
代替
-x
整行-w
建議整個單詞忽略 all.txt 中的空格cut -d\ -f1 active.txt | grep -vxFf - all.txt
注意 cut 的兩個空格:一個轉義的空格作為分隔符
編輯:如果分隔符是冒號,則必須
:
改為cut -d: -f1 active.txt | grep -vwFf - all.txt
你可以用
awk
. 在這種情況下,挑戰在於active.txt
埠後面緊跟一個:
,而在埠中,all.txt
它們線上路上是孤立的。因此,您需要更改兩者之間的欄位分隔符:awk -F':' 'FS==":"{ports[$1];next} !($1 in ports)' active.txt FS=" " all.txt
這將
:
在讀取活動埠列表(即處理第一個文件,active.txt
)時使用 as 欄位分隔符,但將其設置為處理下一個文件的空間,all.txt
。
- 在處理時
active.txt
(由FS
欄位分隔符表示,等於:
通過選項設置),我們只需在數組中-F
註冊埠(即第一個之前的部分) 。然後執行立即跳到下一個輸入行。:``ports
- 在處理
all.txt
(FS
現在是一個空格,所以第一個動作塊永遠不會進入)時,我們只需檢查埠是否在數組中註冊ports
。如果不是,則條件將評估為,並且將呼叫true
預設操作。