簡體   English   中英

使用 awk/bash 過濾 ldapsearch

[英]Filter ldapsearch with awk/bash

通過編寫ldapsearch命令,例如:

ldapsearch -h ipaddress -p 389 -D "cn=func_01_acc,ou=admins,dc=akademia,dc=int" \
-w akademia.01 -b "ou=stud01,dc=akademia,dc=int" "(l=Torun)" sn cn telephonenumber -LLL |
grep sn: | awk '{print $2 "|" $1}' | sort | uniq -u 

我得到了 output:

 dn: uid=s21705,ou=stud01,dc=akademia,dc=int
 telephoneNumber: +78123793414
 cn: Benny Flowers

 dn: uid=s21711,ou=stud01,dc=akademia,dc=int
 telephoneNumber: +78123439058
 cn: Jacqueline Newton

問題是:如何將其格式化為

Benny Flowers|+78123793414
JAcqueline Newton|+78123439058

我去的最遠的是:

ldapsearch -h ipaddress -p 389 -D "cn=func_01_acc,ou=admins,dc=akademia,dc=int" \
-w akademia.01 -b "ou=stud01,dc=akademia,dc=int" "(l=Torun)" sn cn telephonenumber -LLL |
grep sn: | grep  dn: | sed 's/telephoneNumber: //' | sed 's/cm: //'

我有:

 +123123123
 Name Surname

 +123123123
 Name Surname

我試圖用以下方法反轉數字和名稱:

 for ((i=0;i<$elements;i++)); do
      echo ${array[${i}]}
 done

它打印了 output,但我無法找到如何將值傳遞給臨時數組以獲取名稱和另一個處理數字的數組。

任何的意見都將會有幫助。

如果將第一個輸出傳遞給:

sed -rn '/ telephoneNumber: /{N;s/[^:]*: (.*)\n[^:]*: (.*)/\2|\1/p;}'

你會得到:

Benny Flowers|+78123793414
Jacqueline Newton|+78123439058

在OSX上使用-En

sed將搜索每個telephoneNumber條目, N將把它和下一行放在一起, ()將匹配名稱和電話號碼,最后\\2|\\1格式化結果字符串。

AWK

$ awk -v OFS='|' '{split($0,a,": ")} /^telephoneNumber:/{tel=a[2]} /^cn/{cn=a[2]; print cn, tel}' ldapoutput.txt 
Benny Flowers|+78123793414
Jacqueline Newton|+78123439058

貝殼

$ cat foo.sh 
#!/bin/bash

while IFS=':' read -r key value; do
        case ${key} in
                cn|telephoneNumber)
                        read -r "${key}" <<<"${value## }" ;;
                *)
                        continue
                        ;;
        esac
        [ "${key}" = cn ] && printf "%s|%s\n" "${cn}" "${telephoneNumber}"
done

$ ./foo.sh < ldapoutput.txt
Benny Flowers|+78123793414
Jacqueline Newton|+78123439058
grep -E '^(telephoneNumber|cn):' | cut -d':' -f2 | sed 's#\s##' | sed -r '$!N;s/(.*)\n(.*)/\2|\1/'

以前的答案沒有考慮到每個dn的屬性出現順序可能不同。

此外,為了使ldapsearch的 output 更易於解析(空行分隔記錄、無注釋、單行值),您應該始終使用:

ldapsearch -LLL -o ldif-wrap=no ...

現在,假設我們有一個像這樣的 output(不同於 OP):

dn: uid=s21705,ou=stud01,dc=akademia,dc=int
cn: Benny Flowers
telephoneNumber: +78123793414
telephoneNumber: +78123793001

dn: uid=s21711,ou=stud01,dc=akademia,dc=int
telephoneNumber: +78123439058
cn: Jacqueline Newton

這是使用 POSIX awk解析它的規范方法:

LANG=C awk -F '\n' -v RS='' -v OFS='|' '
    {
        delete counts
        delete values
        for (i = 1; i <= NF; i++)
            if ( match($i,/::? /) ) {
                attr = substr($i,1,RSTART-1)
                data = substr($i,RSTART+RLENGTH)
#               if (RLENGTH == 3)
#                   data = base64_decode(data)
                n = ++counts[attr]
                values[attr,n] = data
            }
    }
    {
        # now you can do what you want with the attributes of the current "dn"
        print values["cn",1], values["telephoneNumber",1]
    }
'
Benny Flowers|+78123793414
Jacqueline Newton|+78123439058

筆記:

  • RS設置為null允許通過dn dn

    如果RSnull ,則記錄由<newline>加上一個或多個行組成的序列分隔, [...]

    然后通過將FS設置為\n ,當前dn的每個字段都將具有以下形式attribute: value or attribute:: dmFsdWU= (base64-encoded value)。

  • 該代碼用於處理具有多個值的屬性。 為什么這樣? 因為這很常見; 例如, Benny Flowers有幾個telephoneNumber並不奇怪,不是嗎?

  • 雖然這些值可能是 base64 編碼的,但我注釋掉了解碼它們的代碼,因為它需要base64_decode function。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM