完全是新手。对不起。
我有一个.txt
文件与IP的(逐行):
195.678.333.23
54.221.67.1
32.221.67.2
32.221.67.3
56.221.67.4
32.221.67.5
243.221.67.6
23.221.67.7
34.221.67.8
34.221.67.9
(我需要遍历大约200个IP)
我需要阅读每一行,然后搜索多个csv文件,以找到这些IP,看看它们是否存在。
CSV如下:
3am452525-1;2021-08-25T07:49:03.188353+00:00;195.678.333.23;234.45.78.232;"pass rscore=16";bl@hotmail.com resolve=ok reverse=bl@hotmail.com routes= notroutes=alfgdfgd,pr_sdt_Spsdgsgdhidfhgd;sxdgdsgs.hotmail.com;ECDHE-RSA-AES256-GCM-SHA384;NOT;sdgsgm@dunog.df;ENV_RCPT:dgsgsgsg@{hotmial.com,ENV_RCPT_VERIFY:1;ATTACH_NAME:sdgdsgsgsof.pdf,ATTACH_MIME:application/pdf,ATTACH_TYPE:pdf,ATTACH_OEXT:pdf,ATTACH_CORRUPT:0,ATTACH_PROTECT:0,ATTACH_SIZE:20099;;;;;;sdgsg_fhdh_dfhdh;asrsar_asrar;0;0;0;0;0;0;0;df;8.12.0-2107140000;main-2108250046;;;;sdgsg;;;;none;none;rule=sdgsgs action=ssdgsg-sgddsgr Subject default="sdgs $reyey";rule=odfhddh action=add-header dfhdhdReason="$SpamReason";;;;;;SEND_QID:4363636363,SEND_PROFILE:mail,SEND_RCPTS:dhdfhh;1;1;default_uioyuouyo_RcptInOrg;30677;uMwaF_x-00m7xOj-rho8njCPLr_QKYh3;<B8967386-0450-4709-A382-66D68CE4F3A6@rtce-efax1>;"zdgddadyhadyhad";0.283;1;0.856;Fax-Tdhfdm@urydyd;sdhdfhdhdhfd
IP存在于CSV文件的$3
字段中,但是如果我找到了IP,那么我想要整行作为输出。
有人能帮忙吗?
我有一些很累的东西,比如:
cat /tmp/IPs_filename.txt | while read line; do grep ${line} csvlog.436334.csv; done
但没有用
感谢awk
对我来说似乎是最简单的。
awk -F';' 'NR==FNR{lst[$0]; next} $3 in lst{print}' IPs.txt csv
grep -f <txt_file_with_ip_addrs> csv_file1 csv_file2 ...
从grep
的手册页:
-f, --file=FILE take PATTERNS from FILE
由于IP地址包含句号(解释为"任意字符")在正则表达式中,您可能还想使用
-F, --fixed-strings PATTERNS are strings
使IP地址被解释为字面值字符串而不是正则表达式。
在bash中,没有循环:这里的关键是为grep使用-f
选项,并使用进程替换来制定模式。
# read the ips into an array
mapfile -t ips < IPs.txt
# grep to find lines with ip in 3rd semicolon-separated field
grep -E -f <(printf '^[^;]+;[^;]+;%s;n' "${ips[@]}") CSV.csv
通过使用以下命令,我成功地获得了所需的结果:
cat /tmp/ip_files.txt | while read l; do grep ";$l;" csvlog.202110*; done | awk -F';' '{ printf "%s;%s;%sn", $2, $3, $5}' > /tmp/results.txt