3

主角

  • 管理员
  • 管道
  • Cron 守护进程
  • 一堆文本处理工具
  • 网络统计
  • >>文士

环境

Cron 守护进程反复执行相同的工作,他强迫无辜者netstat显示网络状态 ( netstat -n)。然后管道必须获取信息并将其传递给旁边的文本处理实用程序 ( | grep tcp | awk '{ print $5 }' | cut -d "." -f-4)。>>必须将重要结果记录到文件中。管理员殿下是个懒惰易怒的统治者,>>只想将新信息写入文件。

*/1 * * * * netstat -n | grep tcp | awk '{ print $5 }' | cut -d "." -f-4 >> /tmp/file

独白>>

To append, or not append, that is the question: 
Whether 'tis new information to bother The Admin with 
and earn an outrageous Fortune,
Or to take Arms against `netstat` and the others, 
And by opposing, ignore them? To die: to sleep;

出版商注意事项:对于所有在理解哈姆雷特时遇到问题的人,就像我一样,问题是,我如何检查字符串是否已包含在文件中,如果没有,将其附加到文件中?

4

2 回答 2

1
What a piece of work is piping, how easy to reason about, 
how infinite in use cases, in bash and script, 
how elegant and admirable in action,
how like a vim in flexibility, 
how like a gnu!

这是一个略有不同的看法:

netstat -n | awk -F"[\t .]+" '/tcp/ {print $9"."$10"."$11"."$12}' | sort -nu | while read ip; do if ! grep -q $ip /tmp/file; then echo $ip >> /tmp/file; fi; done;

解释:

awk -F"[\t .]+" '/tcp/ {print $9"."$10"."$11"."$12}'

awk 用制表符和“.”分割输入字符串。输入字符串由包含“tcp”的行过滤(而不是使用单独的 grep 调用)。最后,将生成的输出字段与点连接并打印出来。

sort -nu

按数字对 IP 进行排序并创建一组唯一条目。这消除了对单独uniq命令的需要。

if ! grep -q $ip /tmp/file; then echo $ip >> /tmp/file; fi;

对文件中的 ip 进行 Greps,如果找不到,则附加该 ip。

注意:此解决方案不会在每次运行后删除旧条目并清理文件 - 它只是附加 - 正如您的问题所暗示的那样。

于 2013-09-21T19:49:27.510 回答
1

除非您正在处理一个非常大的文件,否则您可以使用该uniq命令从文件中删除重复的行。这意味着您还将对文件进行排序,我不知道这对您来说是优点还是缺点:

netstat -n | grep tcp | awk '{ print $5 }' | cut -d "." -f-4 >> /tmp/file && sort /tmp/file | uniq > /tmp/file.uniq

这将为您提供没有重复的排序结果/tmp/file.uniq

于 2013-09-21T10:55:14.303 回答