shell 每$X分钟从txt文件中获取新添加的数据

5lwkijsr  于 7个月前  发布在  Shell
关注(0)|答案(1)|浏览(58)

我有一个命令,不断添加IP(不知道数量)到一个名为ips.txt的txt文件

shodan stream --alert=all --datadir=. --compresslevel=0 >> ips.txt

字符串
我想让新添加的数据ips.txt文件每1小时,并使它的一些bash操作,因为我会离开这个命令在后台运行。
我怎样才能每次都自动只获取新添加到这个文件中的数据?

lrpiutwd

lrpiutwd1#

$ cat tst.sh
#!/usr/bin/env bash

ipsFile="$1"

trap 'trap - SIGTERM && kill 0' SIGINT SIGTERM EXIT

shodan() { ( while :; do date; sleep 1; done; ) & }

shodan > "$ipsFile"

endWc=0
while :; do
    sleep 3
    begWc=$(( endWc + 1 ))
    endWc=$(wc -l < "$ipsFile")
    if (( endWc > 0 )); then
        if (( endWc < begWc )); then
            begWc=1
        fi
        newWc=$(( endWc - begWc + 1 ))
        echo "----- $begWc -> $endWc = $newWc lines"
        tail -n +"$begWc" "$ipsFile" |
        head -n +"$newWc"
    fi
done

字符串

$ ./tst.sh ips.txt
----- 1 -> 3 = 3 lines
Wed Nov  8 08:20:04 CST 2023
Wed Nov  8 08:20:05 CST 2023
Wed Nov  8 08:20:06 CST 2023
----- 4 -> 6 = 3 lines
Wed Nov  8 08:20:08 CST 2023
Wed Nov  8 08:20:09 CST 2023
Wed Nov  8 08:20:10 CST 2023
----- 7 -> 8 = 2 lines
Wed Nov  8 08:20:12 CST 2023
Wed Nov  8 08:20:13 CST 2023
----- 9 -> 11 = 3 lines
Wed Nov  8 08:20:14 CST 2023
Wed Nov  8 08:20:15 CST 2023
Wed Nov  8 08:20:17 CST 2023
----- 12 -> 14 = 3 lines
Wed Nov  8 08:20:18 CST 2023
Wed Nov  8 08:20:19 CST 2023
Wed Nov  8 08:20:21 CST 2023
Terminated

$ cat ips.txt
Wed Nov  8 08:20:04 CST 2023
Wed Nov  8 08:20:05 CST 2023
Wed Nov  8 08:20:06 CST 2023
Wed Nov  8 08:20:08 CST 2023
Wed Nov  8 08:20:09 CST 2023
Wed Nov  8 08:20:10 CST 2023
Wed Nov  8 08:20:12 CST 2023
Wed Nov  8 08:20:13 CST 2023
Wed Nov  8 08:20:14 CST 2023
Wed Nov  8 08:20:15 CST 2023
Wed Nov  8 08:20:17 CST 2023
Wed Nov  8 08:20:18 CST 2023
Wed Nov  8 08:20:19 CST 2023
Wed Nov  8 08:20:21 CST 2023
Wed Nov  8 08:20:22 CST 2023
Wed Nov  8 08:20:23 CST 2023


shodan()函数是模仿shodan命令所做的事情,trap是在退出时杀死shodan()子进程,这样我们就可以测试代码的主要部分,最后一个循环。
我特别使用wc,因为它会计算输入中的换行符,所以如果shodan可能在ips.txt的末尾写了一个部分行,直到下一次循环迭代时,它才被提取出来。这也是为什么我将tail输出管道到后续的head,我还使用了tail | head,而不是一个awk命令,因为tail从文件的末尾读取,因此比awk更有效,awk总是从文件的开头开始读取。
if (( endWc < begWc ))块是在文件收缩时再次从第一行开始打印-这可能是也可能不是在这种情况下你想做的,idk。你还需要添加一点代码来做任何你想做的事情,如果在任何迭代中文件是空的(if (( endWc > 0 ))失败),并考虑是否有任何其他的雨天场景需要覆盖。
我中断./tst.sh来停止它,而cat ips.txt有几行额外的行,因为shodan()每秒运行一次,所以主“每3秒”循环(显然,将其更改为sleep 3600或做任何其他你喜欢的事情来睡一个小时)还没有处理所有的行。重要的是在此之前的输出中没有丢失任何行。

相关问题