我有一个这样的文本文件:
IP1 : date-time : bitcoin_address1
IP2 : date-time : bitcoin_address2
IP3 : date-time : bitcoin_address3
我想知道是否有办法让脚本读取这个文件(每小时,比方说,使用crontab),当发现奇怪的东西时,运行一个命令。
我特别需要脚本来查找具有相同IP但不同bitcoin_address的行,如下所示:
IP1 : date-time : bitcoin_address1
IP2 : date-time : bitcoin_address2
IP2 : date-time : bitcoin_address3
IP2 : date-time : bitcoin_address4
IP3 : date-time : bitcoin_address5
并在IP2上运行命令。但是,在IP2上运行命令非常重要,只要每行上的bitcoin_address不同,我不希望它运行IP2命令,如果文件是这样的话:
IP1 : date-time : bitcoin_address1
IP2 : date-time : bitcoin_address2
IP2 : date-time : bitcoin_address2
IP2 : date-time : bitcoin_address2
IP3 : date-time : bitcoin_address3
这可能吗?
谢谢。
答案 0 :(得分:0)
您可以使用以下内容找到重复的ips:
cut -d : -f 1,3 filename | sort | uniq -d | cut -d : -f 1
cut -d -f 1,3
-d use:作为字段分隔符 -f输出第一个和第三个字段(IP和比特币)
sort
按顺序放置文件
uniq -d
输出文件中的重复行
cut -d -f 1
输出第一个字段(IP)
您可以将输出传递给xargs
以执行您选择的命令,例如
cut -d : -f 1,3 filename | sort | uniq -d | cut -d : -f 1 | xargs echo hello $1
答案 1 :(得分:0)
如果我已正确理解您的问题,您可以尝试以下操作。
awk -F " : " '{ printf "%s_%s\n" , $1, $3 }' input.txt | sort | sed 's/\(\s*\)\(.*\)\(\s\)/\2/' | uniq | perl -pe 's/(\s*)(.*?)_(.*)/\2/' | uniq -d
我使用下划线作为分隔符。您可能需要根据实际实时文件的内容选择另一个。
这种方式的工作原理是它规范化行,使集合变平以删除(完整)行重复,提取IP前缀,然后展平此集合以识别具有不同地址的重复IP。根据您对输入文件内容的保证,还有一些附加条款可以修剪空格。