【问题标题】:Does anybody have a script that counts the number of consecutive files which contain a specific word?有没有人有一个脚本来计算包含特定单词的连续文件的数量?
【发布时间】:2020-09-16 21:08:35
【问题描述】:

任何资源或建议都会有所帮助,因为我在编写脚本方面很垃圾

所以,我需要走这条路:/home/client/data/storage/customer/data/2020/09/15

并检查是否有 5 个或更多包含单词“REJECTED”的连续文件:

ls -ltr

-rw-rw-r-- 1 root root  5059 Sep 15 00:05 customer_rlt_20200915000514737_20200915000547948_8206b49d-b585-4360-8da0-e90b8081a399.zip
-rw-rw-r-- 1 root root  5023 Sep 15 00:06 customer_rlt_20200915000547619_20200915000635576_900b44dc-1cf4-4b1b-a04f-0fd963591e5f.zip
-rw-rw-r-- 1 root root 39856 Sep 15 00:09 customer_rlt_20200915000824108_20200915000908982_b87b01b3-a5dc-4a80-b19d-14f31ff667bc.zip
-rw-rw-r-- 1 root root 39719 Sep 15 00:09 customer_rlt_20200915000901688_20200915000938206_38261b59-8ebc-4f9f-9e2d-3e32eca3fd4d.zip
-rw-rw-r-- 1 root root 12829 Sep 15 00:13 customer_rlt_20200915001229811_20200915001334327_1667be2f-f1a7-41ae-b9ca-e7103d9abbf8.zip
-rw-rw-r-- 1 root root 12706 Sep 15 00:13 customer_rlt_20200915001333922_20200915001357405_609195c9-f23a-4984-936f-1a0903a35c07.zip

拒绝文件示例:

customer_rlt_20200513202515792_20200513202705506_5b8deae0-0405-413c-9a81-d1cc2171fa51REJECTED.zip

到目前为止我所拥有的:

!/bin/bash

YYYY=$(date +%Y);
MM=$(date +%m)
DD=$(date +%d)

#Set constants
CODE_OK=0
CODE_WARN=1
CODE_CRITICAL=2
CODE_UNKNOWN=3

#Set Default Values
FILE="/home/client/data/storage/customer/data/${YYYY}/${MM}/{DD}"

if [ ! -f $FILE ]
then
  echo "NO TRANSACTIONS FOUND"
  exit $CODE_CRITICAL
fi

【问题讨论】:

  • 连续文件是什么意思?文件名,最后修改日期,...?你试图找出五个连续的文件是什么?
  • consecutive files 什么是“连续”文件?文件没有顺序,它们都属于同一个目录,没有任何特定的顺序。由于没有排序,所以没有“连续文件”。
  • 所以,在这条路径上:/home/client/data/storage/customer/data/${YYYY}/${MM}/{DD},每天都会创建一个新目录,并且上面的文件就像交易一样,如果有 5 个连续的 REJECTED 交易接收到严重状态。我正在考虑使用 find: $find 。 -type f -name "*.zip" | awk -v key='REJECTED.zip' '{if($1==key) c++;否则 {打印 c; c=0}} END {打印 c}'

标签: bash scripting


【解决方案1】:

您可以在 AWK 中快速做一些事情:

$ cat consec.awk
/REJECTED/ {
    if (match_line == NR - 1) {
        consecutives++
    } else {
        consecutives = 1
    }
    if (consecutives == 5) {
        print "5 REJECTED"
        exit
    }
    match_line = NR
}
$ touch 1 2REJECTED 3REJECTED 5REJECTED 6REJECTED 7REJECTED 8
$ ls -1 | awk -f consec.awk
5 REJECTED
$ rm 3REJECTED; touch 3
$ ls -1 | awk -f consec.awk
$

这通过匹配包含REJECTED 的行,计算连续行数(用match_line == NR - 1 检查,这意味着“最后匹配的行是前一行”)并在连续行数为5 时打印“5 REJECTED” .

在本例中,我使用ls -1(注意数字1,而不是字母l)按文件名排序。您可以使用ls -1rt(再次为数字1)按文件修改时间排序,就像您原来的帖子一样。

【讨论】:

  • 这正是我想要的!非常感谢@Jon
猜你喜欢
  • 2017-03-19
  • 2021-03-23
  • 2014-06-25
  • 2013-10-15
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
相关资源
最近更新 更多