2017-01-20 38 views
1

我有一个名为SSH的文件,其中包含两行信息。它看起来像这样:行处理文件,bash

src=192.168.60.111 ttl: 64 last_seen: 4295187854 oldest_pkt: 16 4295157111, 4295168442, 4295172078, 4295172078, 4295172328, 4295172328, 4295172829, 4295172829, 4295173830, 4295173830, 4295175834, 4295175834, 4295179838, 4295179838, 4295187854, 4295187854 
src=10.0.98.2 ttl: 64 last_seen: 4295868429 oldest_pkt: 16 4295845135, 4295848540, 4295851694, 4295851694, 4295853197, 4295853197, 4295856201, 4295856201, 4295859226, 4295859226, 4295862420, 4295862420, 4295865425, 4295865425, 4295868429, 4295868429 

我想打一个脚本,controlls渡过last_seen号码发送的数据包数+ * 10比当前时间更小。
例如:if($ currenttime> = 4295187854 + 16 * 10)为第一行。
如果当前时间较大,则应删除该行。 这是试图通过SSH进行登录的延迟,并且SSH文件记录了每个写入了错误密码超过3次的IP。

我对脚本很陌生,试着用awk解决这个问题,但没有取得任何进展。你们有没有想法,我可以逐行扫描文件,分析不同的领域,并根据if语句的回答将其删除?

编辑 这是我制作的,这可能没有任何意义,因为我不明白awk实际上在做什么。

#!/bin/sh 
currenttime=$(date +%s) 
awk '{if ($currenttime >= $5+10*$7) print $0 > "temp.txt";}' SSH 
cp -f temp.txt SSH 
rm temp.txt 
+0

但是'10'因素,你乘以'16'? – Inian

+0

我用我的“脚本”编辑了这个问题。 10只是硬编码,我认为10秒就够了! @Inian – Louise

+0

从'$ 7'是16吗? –

回答

2

像这样?:

$ awk 'strftime("%s")<=$5+$7*10' SSH 

strftime("%s")返回的时间作为从epoch其靠在$5+$7*10相比秒的小数时间戳。如果比较结果是true记录被打印。

编辑:谢谢@EdMorton的指出了%s符并非所有系统都支持(见牛羚在这个问题上的awk documentation)和那些不支持的系统systime()应使用(这是短,从而只使用它在所有系统无论如何!):

awk 'systime()<=$5+$7*10' SSH 
+0

Current时间工作正常,但我不知道如果awk扫描只有第一行或“循环”通过所有行。 – Louise

+0

它处理文件中的每一行(当然,每个_record_默认为一行)。 –

+0

然后我想唯一的问题是$ 0需要整个文件而不是当前行,你知道如何访问当前行吗? – Louise