>>
Scribe 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;
发布者的注意事项:对于那些了解哈姆雷特问题的人,就像我一样,问题是,如何检查字符串是否已包含在文件中,如果没有,请将其附加到文件中?
答案 0 :(得分: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
答案 1 :(得分: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的grep,如果找不到,则会附加ip。
注意:此解决方案不会删除旧条目并在每次运行后清理文件 - 它只是附加 - 正如您的问题所暗示的那样。