これら2つのファイルを比較し、次の行だけを印刷して "source.txt"に追加したいと思います。
01.02.70 08h00,4.4.4.4,443
これは私のファイルです:
ソースファイル.txt
DATETIME,IPSOURCE,PORT 01.01.70 08h00,0.0.0.0,443 01.01.70 08h00,2.2.2.2,443
イベント.txt
DATETIME,IPSOURCE,PORT 01.02.70 09h00,0.0.0.0,443 01.02.70 09h00,2.2.2.2,443 01.02.70 08h00,4.4.4.4,443
比較では、DATETIMEフィールドは気にせず、ログファイル「events.txt」に表示される新しいIPを「source.txt」に追加したいと思います(アドレス0.0.0.0と2.2.2.2は両方に表示されます)。ファイル)。
だから私は使いたい
grep -vxFf source.txt events.txt
最初のフィールドは考慮せず、IPSOURCEフィールド(2番目の列)でのみ違いを見つけます。
答え1
awk
フィールドベースの比較が必要な場合に使用
$ awk -F, 'NR==FNR{ip[$2]=$0; next} $2 in ip{delete ip[$2]} END{for(k in ip) print ip[k]}' events.txt source.txt
01.02.70 08h00,4.4.4.4,443
-F,
,
入力フィールド区切り文字として設定NR==FNR{ip[$2]=$0; next}
2番目のフィールドをキーとして使用し、行全体を連想配列に格納します。このコードブロックは、最初のファイル入力(例:events.txt)に対してのみ実行されます。$2 in ip{delete ip[$2]}
2番目のファイル(source.txtなど)の処理中にip
2番目のフィールドがすでに存在する場合は、配列から要素を削除します。END{for(k in ip) print ip[k]}
すべての入力が処理された後、ip
配列の残りの行を印刷します。
または、source.txt に 2 番目のフィールドがない場合は、入力ファイルの順序を変更し、events.txt の行を印刷します。
$ awk -F, 'NR==FNR{ip[$2]; next} !($2 in ip)' source.txt events.txt
01.02.70 08h00,4.4.4.4,443
答え2
以下を実行してください。
awk -F, 'NR==FNR{arr[$2]=$0;next} !($2 in arr)' source event #>> source
カンマ区切りのフィールドを持つ2番目の列に基づいてdiff行を追加するには、>> source
上記のコマンドでコメントを外します。
いいえ、IP:port部分を基準に比較したい場合です。これにより、次のように使用できます。
awk -F, 'NR==FNR{arr[$2FS$3]=$0;next} !($2FS$3 in arr)' source event #>> source
答え3
あなたの条件に従って:
「source.txt」に追加してください。
ただ追加したい新しいログファイル「events.txt」に「source.txt」と表示されたIP
これはGNUの組み合わせに基づく完璧なソリューションです。sed、切るそしてgrep:
sed -i "\$ a $(cut -d, -f2 source.txt | grep -vf - events.txt)" source.txt
生成されたsource.txt
ファイルの内容:
DATETIME,IPSOURCE,PORT
01.01.70 08h00,0.0.0.0,443
01.01.70 08h00,2.2.2.2,443
01.02.70 08h00,4.4.4.4,443