Bash脚本读取文件,查找特定行并执行命令

Bash脚本读取文件,查找特定行并执行命令,bash,Bash,我有这样一个文本文件: IP1 : date-time : bitcoin_address1 IP2 : date-time : bitcoin_address2 IP3 : date-time : bitcoin_address3 IP1 : date-time : bitcoin_address1 IP2 : date-time : bitcoin_address2 IP2 : date-time : bitcoin_address3 IP2 : date-time : bitcoin_a

我有这样一个文本文件:

IP1 : date-time : bitcoin_address1
IP2 : date-time : bitcoin_address2
IP3 : date-time : bitcoin_address3
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
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
我想知道是否有一种方法可以生成一个脚本来读取这个文件(比如说,每小时使用crontab),当发现异常时,运行一个命令

我特别需要它来让脚本查找具有相同IP但不同比特币地址的行,如下所示:

IP1 : date-time : bitcoin_address1
IP2 : date-time : bitcoin_address2
IP3 : date-time : bitcoin_address3
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
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
并在IP2上运行命令。但是,在IP2上运行命令非常重要,只有当每行的比特币_地址不同时,我不希望它为IP2运行命令,如果文件如下所示:

IP1 : date-time : bitcoin_address1
IP2 : date-time : bitcoin_address2
IP3 : date-time : bitcoin_address3
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
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
这可能吗


谢谢。

您可以找到具有以下内容的重复IP:

cut -d : -f 1,3 filename | sort | uniq -d | cut -d : -f 1 

cut -d -f 1,3
-d用法:用作字段分隔符 -f输出第一个和第三个字段(IP和比特币)

把文件整理好

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

您可以找到具有以下内容的重复IP:

cut -d : -f 1,3 filename | sort | uniq -d | cut -d : -f 1 

cut -d -f 1,3
-d用法:用作字段分隔符 -f输出第一个和第三个字段(IP和比特币)

把文件整理好

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

如果我对你的问题理解正确,你可以尝试以下方法

awk -F " : " '{ printf "%s_%s\n" , $1, $3 }' input.txt | sort | sed 's/\(\s*\)\(.*\)\(\s\)/\2/' | uniq | perl -pe 's/(\s*)(.*?)_(.*)/\2/' | uniq -d awk-F:“{printf”%s\u%s\n“,$1,$3}”input.txt | sort | sed's/\(\s*\)\(.\)\(.\)\(\s\)/\2/'| uniq | perl-pe's/(\s*)(.?)(.*)(.*)/\2/';uniq-d 我使用下划线作为分隔符。您可能需要根据实际实时文件的内容选择另一个


其工作方式是,它规范化行,展平集合以删除(完整)行重复项,提取IP前缀,然后展平集合以识别具有不同地址的重复IP。根据您对输入文件内容的保证,您可能希望使用一些附加条款来修剪空格。

如果我正确理解了您的问题,您可以尝试以下方法

awk -F " : " '{ printf "%s_%s\n" , $1, $3 }' input.txt | sort | sed 's/\(\s*\)\(.*\)\(\s\)/\2/' | uniq | perl -pe 's/(\s*)(.*?)_(.*)/\2/' | uniq -d awk-F:“{printf”%s\u%s\n“,$1,$3}”input.txt | sort | sed's/\(\s*\)\(.\)\(.\)\(\s\)/\2/'| uniq | perl-pe's/(\s*)(.?)(.*)(.*)/\2/';uniq-d 我使用下划线作为分隔符。您可能需要根据实际实时文件的内容选择另一个


其工作方式是,它规范化行,展平集合以删除(完整)行重复项,提取IP前缀,然后展平集合以识别具有不同地址的重复IP。根据您对输入文件内容的保证,您可能希望使用一些附加条款来修剪空格。

谢谢您的回复,对于这样的文件:IP-1:时间日期:比特币地址-1 IP-1:时间日期:比特币地址-2 IP-1:时间日期:比特币地址-3 IP-2:时间日期:比特币地址-4 IP-2:时间日期:比特币地址-4 IP-2:时间日期:比特币地址-4 IP-2:输出不也是IP-1和IP-2吗?或者,在我的例子中,我需要输出为IP-1。IP-2必须被忽略。编辑答案以首先获取IP和比特币以查找重复项谢谢您的回复,对于这样的文件:IP-1:时间日期:比特币地址-1 IP-1:时间日期:比特币地址-2 IP-1:时间日期:比特币地址-3 IP-2:时间日期:比特币地址-4 IP-2:时间日期:比特币地址-4 IP-2:时间日期:比特币地址-4 IP-2:输出不也是IP-1和IP-2吗?或者,在我的例子中,我需要输出为IP-1。IP-2必须被忽略。编辑答案以首先获取IP和比特币以查找副本这是完美的!非常感谢你!好的,太好了。希望你能接受这个答案。我是新来的,需要积分。感谢您,运行
cat input_file | foo
比运行
foo
——或者在
awk
的情况下,将文件名作为参数传递效率更低
cat input_file |……
提供了一个连接到
cat
命令的FIFO,这意味着
cat
需要读取字节,然后将它们写入管道,然后才能供
awk
使用;后者意味着
awk
直接在文件上有一个句柄…当您的命令是
sort
而不是
awk
时,这是一个更大的问题,因为
sort
可以拆分为多个子进程,每个子进程对文件的一部分进行排序,然后将它们的结果合并在一起。。。如果它能够在文件中四处搜索,这可以使用常规文件句柄,但不能使用FIFO。这是完美的!非常感谢你!好的,太好了。希望你能接受这个答案。我是新来的,需要积分。感谢您,运行
cat input_file | foo
比运行
foo
——或者在
awk
的情况下,将文件名作为参数传递效率更低
cat input_file |……
提供了一个连接到
cat
命令的FIFO,这意味着
cat
需要读取字节,然后将它们写入管道,然后才能供
awk
使用;后者意味着
awk
直接在文件上有一个句柄…当您的命令是
sort
而不是
awk
时,这是一个更大的问题,因为
sort
可以拆分为多个子进程,每个子进程对文件的一部分进行排序,然后将它们的结果合并在一起。。。如果它能够在文件中四处搜索,可以使用常规文件句柄,但不能使用FIFO。