Bash计数行和管道的信息较少

时间:2017-03-28 20:22:48

标签: bash curl awk

我正在努力获取我想要的信息,我们正在使用垃圾邮件过滤器,可以通过API调用进行监控。

我们使用PRTG作为监控,PRTG正在调用Bash脚本,该脚本使用curl调用API。

我需要使用的信息由此行调用。

queue=$(curl -u USER:PASS -X GET -H "Content-Type: application/http" https://mx10.mailfilter.nl/cgi-bin/api?call=api_delivery_queue&sort_field=domain,server)



OUTPUT:(lines below the domain are associated with te domain)
domain1.TLD
mx10.mailfilter.nl,1csiOn-00012P-QL,2017-03-28 21:08:29
mx20.mailfilter.nl,1csLqx-0004fO-EM,2017-03-28 21:08:29
domain2.TLD
mx10.mailfilter.nl,1csvTq-0007a4-MS,2017-03-28 21:08:29
mx10.mailfilter.nl,1csvhh-0000gI-5s,2017-03-28 21:08:29
mx10.mailfilter.nl,1cswCX-0004bQ-Iz,2017-03-28 21:08:29
mx10.mailfilter.nl,1csvk3-00013I-Rx,2017-03-28 21:08:29
domain3.TLD
mx10.mailfilter.nl,1csbxg-0005sG-Px,2017-03-28 21:08:29

我需要将其分解为:(其中数字是与域关联的行数) 预期产出:

domain1.TLD 2
domain2.TLD 4
domain3.TLD 1

totalcount=$(curl -u USER:PASS -X GET -H "Content-Type: application/http" https://mx10.mailfilter.nl/cgi-bin/api?call=api_get_delivery_queue_count&domain=default)

最后echos 0:$ totalcount:$ queue

编辑:(29-03)

我的例子可能不像我所说的那样清晰:)

domain1.TLD domain2.TLD .. 只是一些例子,域的变化是巨大的。从A到Z。静态的行以mx10或mx20开头。

来自Vipin的命令可以解决我将在明天尝试的那个。

3 个答案:

答案 0 :(得分:0)

这是众多方法中的一种,希望这会有所帮助:

echo -e "$totalcount" | grep -o domain | wc -l

grep with -o选项意味着它将“domain”的每个匹配值打印到一个单独的输出行上,然后用wc -l计算这些换行符。

答案 1 :(得分:0)

试试这个 -

$ cat f
domain1.TLD
mx10.mailfilter.nl,1csiOn-00012P-QL,2017-03-28 21:08:29
mx20.mailfilter.nl,1csLqx-0004fO-EM,2017-03-28 21:08:29
domain2.TLD
mx10.mailfilter.nl,1csvTq-0007a4-MS,2017-03-28 21:08:29
mx10.mailfilter.nl,1csvhh-0000gI-5s,2017-03-28 21:08:29
mx10.mailfilter.nl,1cswCX-0004bQ-Iz,2017-03-28 21:08:29
mx10.mailfilter.nl,1csvk3-00013I-Rx,2017-03-28 21:08:29
domain3.TLD
mx10.mailfilter.nl,1csbxg-0005sG-Px,2017-03-28 21:08:29
$ awk -F,  'NF==1 {h=$0} {(NF==1?k=1:t[h]=k++)} END {for (h in t) print h,t[h]}' f
domain2.TLD 4
domain1.TLD 2
domain3.TLD 1

按排序顺序 -

awk -F,  'NF==1 {h=$0} {(NF==1?k=1:t[h]=k++)} END {
> PROCINFO["sorted_in"] = "@ind_str_asc"
> for (h in t) print h,t[h]}' f
domain1.TLD 2
domain2.TLD 4
domain3.TLD 1

答案 2 :(得分:0)

$ awk '/^domain[0-9]+\.TLD/{if(p)print p,c;p=$0;c=0;next}{c++}END{print p,c}' file
domain1.TLD 2
domain2.TLD 4
domain3.TLD 1

说明:

/^domain[0-9]+\.TLD/ {  # domain*TLD records:
    if(p) print p, c    # print p revious domain and c ount
    p=$0                # reset vars
    c=0
    next                # next record
}
{ c++ }                 # count other records
END { print p, c }      # print the last domain*TLD