2017-02-08 15 views
0

私は、コマンドから3つのパターンをすべてマッチさせてスペースを置くことを楽しみにしています。最初の試合だけが得られた場合は残りの2試合を行い、その後はその試合を全く印刷しません....awkまたはsed 3つの一致するパターンの後にスペースを配置するために

以下は実際のコマンド出力です。最初に一致する "dn"が検索され、それには2つのパターンの検索が含まれません。 それは素晴らしいことだろうと同時に、私達はawkのを持つことができますやgrep自体の代わりに自分自身をsedの...

$ ldapsearch -h myldapserver -x -LLL -b "ou=profile,o=ferry.com" "cn=*" | grep -Ei "^dn|defaultServerList|preferredServerList" 
    dn: cn=proxyagent,ou=profile,o=ferry.com 
    dn: cn=default,ou=profile,o=ferry.com 
    preferredServerList: 192.68.8.15 192.68.8.16 
    defaultServerList: 192.68.8.15 192.68.8.16 192.68.88.27 
    dn: cn=austin, ou=profile, o=ferry.com 
    defaultServerList: 192.68.63.10 10.209.208.23 
    preferredServerList: 192.68.88.14 10.28.15.10 
    dn: cn=sanjose, ou=profile, o=ferry.com 
    preferredServerList: 192.68.8.15 192.68.8.16 
    defaultServerList: 192.68.8.15 192.68.8.16 192.68.88.38 

期待出力は次のようになります。

dn: cn=proxyagent,ou=profile,o=ferry.com (--> This is single matched found without 2 others, which i don't want to be printed if its alone without 2 others) 

dn: cn=default,ou=profile,o=ferry.com 
preferredServerList: 192.68.8.15 192.68.8.16 
defaultServerList: 192.68.8.15 192.68.8.16 192.68.88.27 

dn: cn=austin, ou=profile, o=ferry.com 
defaultServerList: 192.68.63.10 10.209.208.23 
preferredServerList: 192.68.88.14 10.28.15.10 

dn: cn=sanjose, ou=profile, o=ferry.com 
preferredServerList: 192.68.8.15 192.68.8.16 
defaultServerList: 192.68.8.15 192.68.8.16 192.68.88.38 

2)i「はけれどもメートル以下のようにsedを & awkを持つすべての3のoccuranceの後にスペースを配置することができ..

$ ldapsearch -h myldapserver -x -LLL -b "ou=profile,o=ferry.com" "cn=*" | egrep "^dn|defaultServerList|preferredServerList" | sed '0~3 a\\' 

$ ldapsearch -h myldapserver -x -LLL -b "ou=profile,o=ferry.com" "cn=*" | egrep "^dn|defaultServerList|preferredServerList" |awk ' {print;} NR % 3 == 0 { print ""; }' 

    dn: cn=proxyagent,ou=profile,o=ferry.com 
    dn: cn=default,ou=profile,o=ferry.com 
    preferredServerList: 192.68.8.15 192.68.8.16 

    defaultServerList: 192.68.8.15 192.68.8.16 192.68.88.27 
    dn: cn=austin, ou=profile, o=ferry.com 
    defaultServerList: 192.68.63.10 10.209.208.23 

    preferredServerList: 192.68.88.14 10.28.15.10 

================================ =================

実際のコマンド出力:

$ ldapsearch -h myldapserver -x -LLL -b "ou=profile,o=ferry.com" "cn=*" 

dn: cn=proxyagent,ou=profile,o=ferry.COM 
userPassword:: e2NyeXB0fTBmVVVjSTI1SDZINS4= 
objectClass: top 
objectClass: person 
sn: proxyagent 
cn: proxyagent 

dn: cn=default,ou=profile,o=ferry.COM 
preferredServerList: 192.68.8.15 192.68.8.16 
defaultServerList: 192.68.8.15 192.68.8.16 192.68.88.27 
objectClass: top 
bindTimeLimit: 10 
credentialLevel: proxy 
cn: default 
profileTTL: 120 

dn: cn=austin, ou=profile, o=ferry.com 
defaultServerList: 192.68.63.10 10.209.208.23 
preferredServerList: 192.68.88.14 10.28.15.10 
attributeMap: printers:printer-uri-supported=printer-xri-supported 
objectClass: top 
objectClass: DUAConfigProfile 
objectClass: kdsdirobjectinfo 
description: Austin Default Profile 

3)回答君たちからの入力に基づいて遵守し、使用可能ですある時点で他の人々のために!あなたはこのsed使用することができ、すべての入力&提案

$ cat ldaphostprofile.sh 
#!/bin/bash 
#Author : karn Kumar (08/02/2017) 
# This is Just to check what is are prefered Ldap server's and default for authentication by sitewise 
# There is contribution from some of folks over open forums 
# s=1; s*=2; s*=3 here using math, the value s will be divisible by 6 only if both 2 and 3 factors are there, here multiple occurrences won't change the condition but only the latest values encountered are used. 

# s && !(s%6) checks for divisibility by 6 and whether value is initialized in "dn" check. 

# s=0 reset value after printing, so that printing will be suspended until the next group. 

# sep you want the triples separated by an empty line, we don't want to add after every group, since it will leave an empty line at the end, or similarly at the beginning. Alternative is, using a late initialized variable (after first use). So there won't be an empty line at the beginning or the end, but in between groups. 
# mapfile is bash build in function can be used with BASH Version >= 4.0 onwards 

set -f  # to prevent filename expansion 

mapfile -t PLIST < <(ldapsearch -h myldapserver -x -LLL -b "ou=profile,o=ferry.com" "cn=*" | awk '/^dn/ {s =1; dn=$0} /^preferredServerList/ {s*=2; ps=$0}/^defaultServerList/ {s*=3; ds=$0} s && !(s%6) {print sep dn ORS ps ORS ds; sep=ORS; s=0}' | awk '/preferredServerList/ { print $2,$3,$4 }') 

mapfile -t DLIST < <(ldapsearch -h myldapserver -x -LLL -b "ou=profile,o=ferry.com" "cn=*" | awk '/^dn/ {s =1; dn=$0} /^preferredServerList/ {s*=2; ps=$0}/^defaultServerList/ {s*=3; ds=$0} s && !(s%6) {print sep dn ORS ps ORS ds; sep=ORS; s=0}' | awk '/defaultServerList/ { print $2,$3,$4 }') 

mapfile -t LLIST < <(ldapsearch -h myldapserver -x -LLL -b "ou=profile,o=ferry.com" "cn=*" | awk '/^dn/ {s =1; dn=$0} /^preferredServerList/ {s*=2; ps=$0}/^defaultServerList/ {s*=3; ds=$0} s && !(s%6) {print sep dn ORS ps ORS ds; sep=ORS; s=0}' | awk '/dn/ {print $2}'| cut -d "," -f1 | cut -d"=" -f2) 

count_x=${#PLIST[@]} 
count_y=${#DLIST[@]} 
count_l=${#LLIST[@]} 

echo $count_x 
echo $count_y 
echo $count_l 

# Find out which of the two is larger in size, assuming that's a possibility 
if [[ $count_x -lt $count_y ]] 
    then 
    count=$count_y 
else 
    count=${count_x} 
#elif 
# count=${count_l} 
fi 

printf "=%.0s" $(seq 1 150) 
printf "\n" 
printf "%-50s : %-50s : %-50s\n"   "PreferredList IP's" "DefaultServerList IP's" "Location"   # print header 
printf "=%.0s" $(seq 1 150)                     # print separator 
printf "\n"                          # print newline 

for i in $(seq $count); 
do 
    printf "%-50s : %-50s : %-50s\n" "${PLIST[i-1]}" "${DLIST[i-1]}" "${LLIST[i-1]}" 
done 

[root ~/SCRIPTS]$ ./ldaphostprofile.sh 
455 
455 
455 
====================================================================================================================================================== 
PreferredList IP's         : DefaultServerList IP's        : Location 
====================================================================================================================================================== 
192.218.88.14 10.28.15.10       : 192.20.63.10 10.209.208.23       : austin 
192.168.8.15 192.168.8.16       : 192.168.8.15 192.168.8.16 192.218.88.38   : sanjose 
192.168.8.15 192.168.8.16       : 192.168.8.16 192.168.8.15       : India 
192.162.167.9 192.162.167.8       : 192.168.8.16 192.218.88.38       : japan 
192.162.167.9 192.162.167.8       : 192.168.8.15 192.218.88.38       : China 
192.162.167.9 192.162.167.8       : 192.168.8.16 192.218.88.38       : Franse 
192.162.167.9 192.162.167.8       : 192.168.8.16 192.168.8.15       : Brazil 
192.168.8.16 192.168.8.15 192.168.8.6     : 192.168.8.16 192.218.88.38       : Tiwan 
192.168.8.15 192.168.8.16       : 192.168.8.15 192.218.88.38       : Russia 
192.162.167.9 192.162.167.8       : 192.168.8.16 192.218.88.38       : Germany 
192.133.208.24 192.135.200.10      : 192.135.200.10 172.23.39.200      : Poland 
+0

ldapsearchの出力でスクリプトを動作させたい場合は、ldapsearchの出力を表示します。不要なコマンドにパイプした出力は表示しません。言い換えれば、作成したいコマンドの入力例を表示して、それが何であるかを推測しないようにしてください。 –

答えて

1
$ ... | awk 'NR>1 && /^dn/{print ""} /^dn|(preferred|default)ServerList/' file 

を行う必要があります。 3のグループのみを印刷するには、もう少しロジックを追加する必要が

$ awk '/^dn/     {s =1; dn=$0} 
     /^preferredServerList/ {s*=2; ps=$0} 
     /^defaultServerList/ {s*=3; ds=$0} 
     s && !(s%6)   {print sep dn ORS ps ORS ds; sep=ORS; s=0}' file 

ノート、値sは6のみ2の両方の場合と3つの要因で割り切れるだろう数学を使用してここ

s=1; s*=2; s*=3そこには、ここでは複数の発生が条件を変更することはありませんが、遭遇した最新の値のみが使用されます。

s && !(s%6)は6で割り切れをチェックし、 "dn"チェックで値が初期化されているかどうかをチェックします。

s=0印刷後の値がリセットされるので、次のグループまで印刷が中断されます。

sepトリプルを空行で区切りたい場合は、末尾に空白行を残すか、最初と同じようにすべてのグループを追加する必要はありません。代わりに、後で初期化された変数を使用します(最初の使用後)。したがって、最初または最後に空白行はなく、グループ間に空の行がありません。

dnがグループスターターであると仮定すると、次のdn行が現れるまで最初のトリプルが印刷されます。私はそれはあなたがするスクリプトへの入力として代わりにldapseach | grep -Ei...の出力のldapsearchの出力を示すことが重要である理由WRT渡って取得しようとしているポイントを証明するために

dn: cn=default,ou=profile,o=ferry.com 
preferredServerList: 192.68.8.15 192.68.8.16 
defaultServerList: 192.68.8.15 192.68.8.16 192.68.88.27 

dn: cn=austin, ou=profile, o=ferry.com 
preferredServerList: 192.68.88.14 10.28.15.10 
defaultServerList: 192.68.63.10 10.209.208.23 

dn: cn=sanjose, ou=profile, o=ferry.com 
preferredServerList: 192.68.8.15 192.68.8.16 
defaultServerList: 192.68.8.15 192.68.8.16 192.68.88.38 
+0

@karakfa ....その仕事はしていますが、他の2つのマッチを持たない "dn"文字列を印刷しています。つまり、 "dn"もまた印刷されてしまうのです... あなたのawkコードはいつも素敵です... – krock1516

+0

あなたの予想される出力には、dnのみを持つ最初のグループがあります。あなたが期待したものではありませんか? – karakfa

+0

@karakfa ...混乱のため残念ですが、それはコマンドの出力ですが、他の2つの検索パターンがなければ "dn"だけを望んでいません.3つの文字列 "dn" 、 "preferredServerList"& "defaultServerList"の順に表示されます。 投稿を編集しました。 – krock1516

1

に感謝:

ldapsearch '...' | grep '...' | sed 's/^dn/\n&/g' 
+0

私たちはpattrernの検索自体にgrepの代わりにsedを使用できますか?あなたのsedライナーは完璧に働いています。私はawkも探しています。 – krock1516

+0

awkの答えを探しているのなら、なぜsedで質問にタグを付けるのですか? –

+0

@エドモートン... awkを使っている私の既存のコードと統合したいので、私はawkとsagedを両方の解決策、awkと優先的に使うと信じています。 – krock1516

1

を出力ファイルを使用して

$ awk '/dn:/{if (cnt==3) print rec; cnt=0; rec=""} {rec = rec $0 ORS; cnt++} END{if (cnt==3) print rec}' file 
dn: cn=default,ou=profile,o=ferry.com 
preferredServerList: 192.68.8.15 192.68.8.16 
defaultServerList: 192.68.8.15 192.68.8.16 192.68.88.27 

dn: cn=austin, ou=profile, o=ferry.com 
defaultServerList: 192.68.63.10 10.209.208.23 
preferredServerList: 192.68.88.14 10.28.15.10 

dn: cn=sanjose, ou=profile, o=ferry.com 
preferredServerList: 192.68.8.15 192.68.8.16 
defaultServerList: 192.68.8.15 192.68.8.16 192.68.88.38 

それはせずに一人でldapsearchの出力に動作します:作成するには、この些細なスクリプトはあなたが私たちを示してきたサンプル入力から私たちを示してきた期待の出力が生成されます? ldapsearchの出力だけで動作するさらに簡単なスクリプトはありますか? ldapsearchの出力がどのように見えるのかわからないので、私は答えが何であるか分かりません。

+0

私は実際のコマンド出力を追加しました。さらに、あなたのコードはとてもうまく動作しました。 – krock1516

関連する問題