Text-Processing

僅獲取不匹配的列表作為輸出

  • August 26, 2021

我想知道 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 -rLgrep -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.txtFS現在是一個空格,所以第一個動作塊永遠不會進入)時,我們只需檢查埠是否在數組中註冊ports。如果不是,則條件將評估為,並且將呼叫true預設操作。print

引用自:https://unix.stackexchange.com/questions/666179