2017-02-08 14 views
0

Я с нетерпением жду соответствия всех трех шаблонов из команды и размещения пробела, это должно быть продолжено со всеми 3 шаблонами соответствия со всем полученным результатом, но в если он получит только первый матч, он не получил покой два, тогда не напечатайте это единственное совпадение вообще.awk или sed, чтобы разместить место после трех совпадающих шаблонов с некоторым исключением

Ниже приведен реальный вывод команды, из которого я хочу получить это, где, если вы видите поиск первого совпадающего «dn» и не содержит двух шаблонов поиска. в то же время было бы здорово, мы можем иметь AWK или СЭД себя вместо самого Grep ...

$ 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) Хотя я» м в состоянии поместить пробел после каждого 3 с SED вхождения & AWK, как показано ниже ..

$ 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) Ответ ВЫПОЛНИВШИЕ основанный на входе от вас, ребята, может быть полезной для некоторых других людей в некоторый момент времени! Цените все ваши входные данные & Предложения

$ 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 

должен делать. Чтобы напечатать только группы из трех, вы должны добавить немного больше логики

$ 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=1; s*=2; s*=3 здесь, используя математику, значение s будет делиться на 6, только если оба 2 и 3 факторов есть ли здесь несколько случаев, которые не изменят условие, но используются только самые последние найденные значения.

s && !(s%6) проверяет на делимость на 6 и независимо от того, инициализировано ли значение в контроле "dn".

s=0 Сбросить значение после печати, чтобы печать была приостановлена ​​до следующей группы.

sep Вы хотите, чтобы тройки были разделены пустой строкой, мы не хотим добавлять ее после каждой группы, так как она оставит пустую строку в конце или аналогично в начале. Альтернатива - использование поздней инициализированной переменной (после первого использования). Таким образом, не будет пустой строки в начале или в конце, но между группами.

Предполагается, что dn является стартером группы, будет печатать первую тройку, пока не появится следующая строка dn.

с использованием выходного файла

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 .... его работая, но все еще печатает строку «dn», у которой нет других 2 совпадений, что означает «dn», также печатается, чего я хочу избежать. ваш код awk всегда был приятным ... – krock1516

+0

ваш ожидаемый выход имеет первую группу только с dn. Разве это не то, что вы ожидали? – karakfa

+0

@karakfa .... извините за путаницу, это результат команды, хотя я не хочу «dn» в одиночку, если он приходит без другого 2 найденного шаблона, говоря, что печатается только при обнаружении всех трех строк «dn», , "preferredServerList" и "defaultServerList". Только что отредактировал сообщение. – krock1516

1

Вы можете использовать этот sed:

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

Можем ли мы использовать sed вместо grep для поиска pattrern. Ваш sed liner отлично работает ... все вместе я ищу awk также, поскольку я хочу интегрировать больше вещей с этим. – krock1516

+0

Если вы ищете ответ awk, то зачем пометить вопрос sed? –

+0

@EdMorton ... я верю, что я играл с awk & sed для обоих решений, предпочитаю awk, потому что я хочу интегрировать его с моим существующим кодом, который использует awk. – krock1516

1

Чтобы продемонстрировать точку я пытаюсь получить через WRT, почему это важно, чтобы показать выход ldapsearch вместо выхода ldapseach | grep -Ei... в качестве входных данных для сценария, который требуется чтобы создать этот тривиальный сценарий даст ожидаемый результат вы показали нам от входа образца вы показали нам:

$ 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 без ...| grep -Ei...? Есть ли еще более простой скрипт, который будет работать только на выходе ldapsearch? Я не знаю, каков ответ на любой вопрос, так как вы не показали нам, как выглядит вывод ldapsearch.

+0

Я добавил фактический вывод команды, причем ваш код работает очень красиво, как я его спросил. – krock1516

 Смежные вопросы

  • Нет связанных вопросов^_^