【问题标题】:awk modify printf outputawk 修改 printf 输出
【发布时间】:2021-03-09 16:19:26
【问题描述】:

我需要解析 ldapsearch 的输出,并且只保留带有数值的属性。

我还需要转换输出以使其可用于 prometheus 监控。

这是原始 ldapsearch 的输出:

# 389, snmp, monitor
dn: cn=389,cn=snmp,cn=monitor
cn: 389
objectClass: top
objectClass: extensibleObject
anonymousbinds: 9
unauthbinds: 9
simpleauthbinds: 122256
strongauthbinds: 0
bindsecurityerrors: 27869
inops: 24501385
readops: 17933653
compareops: 24852
addentryops: 14205
removeentryops: 0
modifyentryops: 378287
modifyrdnops: 0
listops: 0
searchops: 19194674
onelevelsearchops: 117
wholesubtreesearchops: 1260904
referrals: 0
chainings: 0
securityerrors: 2343
errors: 4694375
connections: 1075
connectionseq: 4720927
bytesrecv: 1608469180
bytessent: -424079608
entriesreturned: 19299393
referralsreturned: 0

我执行此查询是为了删除非数字字段以及 dn/cn 字段(如果它们有数字),例如 cn=389。

${LDAPSEARCH} -LLL -H ${LDAP_URI} -x -D "${BINDDN}" -w ${LDAP_PASSWD} -b "${cn}" -s base | sed '/^cn\|^dn/d' |  awk -F: '{ if ( $1 != "connection" && $2 ~ /[[:digit:]$]/) printf "dsee_%s\n", $1 $2}'

但我需要修改 print f 以便它向我打印这样的字段:

dsee_modifyrdnops{node="vm1",cn="389"} 0
dsee_listops{node="vm1",cn="1389"} 0
dsee_strongauthbinds{node="vm1",cn="389"} 0
dsee_readops{"node="vm1",cn="389"} 37194588

在 printf 命令中添加大括号和引号时遇到了困难。

改进 awk/sed 命令和修改 printf 输出的最佳方法是什么?

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    简单的bash

    #!/bin/bash
    
    node=vm1
    
    while IFS=: read -r key val; do
        [[ $key = cn ]] && { cn=${val# }; continue; }
        if [[ $val =~ ^\ -?[0-9]+(\.[0-9]*)?$ ]]; then
            printf 'dsee_%s{node="%s",cn="%s"}%s\n' "$key" "$node" "$cn" "$val"
        fi
    done < <( your_raw_ldapsearch_command )
    

    【讨论】:

    • 这很有效,但当 val 是一个浮点数时就不行了,例如:bindetimesum: 10973.000317 bindetimesumsq: 2696.000000593497
    • 我尝试了这个正则表达式:` $val =~ ^[+-]?[0-9]+\.?[0-9]*$` 基于此处的示例:stackoverflow.com/questions/13790763/…但随后什么都没有打印出来。
    • @danidar 更新了答案,使正则表达式也匹配带小数点的数字。
    • 最后一个问题cn=${val# }中的#是什么意思?
    • @danidar 它从val的扩展中删除前导空格。阅读 Bash 参考手册中的 Shell Parameter Expansion 部分,了解所有形式的参数扩展的详细信息。
    【解决方案2】:

    类似的东西:

    $ cat tst.awk
    BEGIN {
        FS=":[[:blank:]]*"
        qq="\""
        node="vm1"
    }
    $1=="cn" {cn=$2}
    $1!~/^((cn|dn)$|connection)/ && $2~/^[[:digit:]]+$/ {
        printf("dsee_%s{node=%s%s%s,cn=%s%s%s} %d\n", $1, qq, node, qq, qq, cn, qq, $2)
    }
    
    $ awk -f tst.awk myFile
    dsee_anonymousbinds{node="vm1",cn="389"} 9
    dsee_unauthbinds{node="vm1",cn="389"} 9
    dsee_simpleauthbinds{node="vm1",cn="389"} 122256
    dsee_strongauthbinds{node="vm1",cn="389"} 0
    dsee_bindsecurityerrors{node="vm1",cn="389"} 27869
    dsee_inops{node="vm1",cn="389"} 24501385
    dsee_readops{node="vm1",cn="389"} 17933653
    dsee_compareops{node="vm1",cn="389"} 24852
    dsee_addentryops{node="vm1",cn="389"} 14205
    dsee_removeentryops{node="vm1",cn="389"} 0
    dsee_modifyentryops{node="vm1",cn="389"} 378287
    dsee_modifyrdnops{node="vm1",cn="389"} 0
    dsee_listops{node="vm1",cn="389"} 0
    dsee_searchops{node="vm1",cn="389"} 19194674
    dsee_onelevelsearchops{node="vm1",cn="389"} 117
    dsee_wholesubtreesearchops{node="vm1",cn="389"} 1260904
    dsee_referrals{node="vm1",cn="389"} 0
    dsee_chainings{node="vm1",cn="389"} 0
    dsee_securityerrors{node="vm1",cn="389"} 2343
    dsee_errors{node="vm1",cn="389"} 4694375
    dsee_bytesrecv{node="vm1",cn="389"} 1608469180
    dsee_entriesreturned{node="vm1",cn="389"} 19299393
    dsee_referralsreturned{node="vm1",cn="389"} 0
    

    【讨论】:

    • 谢谢,我不明白'qq'是什么?
    • @danidar, qq 是双引号
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2019-12-24
    • 2015-02-05
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    相关资源
    最近更新 更多