以下代码显示了AIX服务器中的错误,但在Red Hat服务器中工作正常

时间:2019-08-27 10:41:54

标签: regex shell grep aix

string='binddn:cn=SxX.UXxxxM-E2A,OU=CA,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com'

Red Hat中的代码工作原理

dn=($(grep -oi 'cn=[^():]*dc=com' <<< "$string"))

我修改了AIX的代码,修改后的代码是

dn=($(grep -xi 'cn=[^():]*dc=com' "$string"))

代码在RedHat服务器中运行正常,在redhat中的输出是

dn[0]="cn=SxX.UXxxxM-E2A,OU=CA,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com"

AIX中的错误是

grep: can't open binddn:cn=SxX.UXxxxM-E2A,OU=CA,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com

已编辑:

另一个例子:

string = "userbasedn:DC=i,DC=companyname,DC=com?subtree?(&(objectcategory=person)(uidNumber=*)(|(memberOf:1.2.840.113556.1.4.1941:=cn=example1,OU=GROUPS,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com)(memberOf:1.2.840.11.1.4.1941:=cn=example2,OU=GROUPS,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com)))
groupbasedn:DC=i,DC=companyname,DC=com?subtree?(&(objectcategory=group)(gidNumber=*))"

预期产量

dn[0]=cn=example1,OU=GROUPS,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com
dn[1]=cn=example2,OU=GROUPS,OU=AI INFRASTRUCTURE,DC=i,DC=companyname,DC=com

2 个答案:

答案 0 :(得分:0)

如果可以使用awk,请尝试以下操作:

echo "$string" | awk -F"cn=" 'NF>1{$0=tolower($0);for (i=2;i<=NF;i++) {split($i,a,"dc=com)");print FS a[1]"dc=com"}}'
cn=example1,ou=groups,ou=ai infrastructure,dc=i,dc=companyname,dc=com
cn=example2,ou=groups,ou=ai infrastructure,dc=i,dc=companyname,dc=com

答案 1 :(得分:0)

grep的第二个参数是文件名,而不是字符串。 AIX正确地报告它找不到具有该名称的文件。如果您尝试相同的命令,则会在Red Hat上得到相同的错误。

不幸的是,-x选项无法满足您的期望。它检查输入的整个行是否与正则表达式匹配。同样,您将在Red Hat上找到完全相同的行为。 根据{{​​3}},它支持-o选项就可以了。

如果您没有Bash,则Bash“此处字符串”语法<<<"string"不可用,但是很容易重新定义:

printf '%s\n' "$string" |
grep -oi 'cn=[^():]*dc=com'

如果您没有grep -o,请尝试使用sed

printf '%s\n' "$string" |
sed -n 's/.*\(cn=[^():]*dc=com\).*/\1/p'

这并不完全相同,因为第一个.*是贪婪的。如果您期望一行上有多个匹配项,则需要稍微复杂一点的正则表达式。