通过搜索模式编辑文件,将结果存储在var中,修改var,将修改后的var写入同一文件

时间:2018-04-11 17:30:13

标签: regex bash file sed find

我的编程效率不高。意思是,我可以使用bash程序编写一个解决方案来完成我要问的问题,但我想知道是否有一个可以完成同样事情的单行程序。我总是很难绕过如何订购sed和awk等实用工具以获得理想的结果。我可以使用这些实用程序,但它们从来没有按照我编写它们的方式进行。这就是我想要完成的事情。

我已将openldap中的用户对象转储到一个平面文件中。所以,如果你还没有看到它的样子,我提供了一个用户假对象记录。

dn: uid=steven.hawkin@science.com,ou=people,o=nasa
mail: steven.hawking@cambridge.com
mail: steven.hawking@science.com
uid: steven.hawking@science.com
homeDirectory: /home/hawkin
givenName: Steven
sn: hawkin
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: Person
objectClass: LoginProperties
objectClass: Top

我将在短期内将数据从OpenLDAP批量迁移到eDirectory,直到IDM驱动程序设置为定期执行此同步。此文件中包含17000多个对象,每个用户(对象)的每个属性集合由空格分隔。 412个用户对象具有与系统登录信息相关的属性,例如homeDirectory,groupID,Shell等,有些则没有。在新的eDirectory环境中,有一个名为posixAccount的objectClass需要我提到的属性,还有一个不存在的属性叫做unquieID。我想要做的是搜索这个单独的文件^ homeDirectory:并且在Steven Hawking示例的情况下它将返回homeDirectory:/ home / hawkin并且我将从最后获取用户名hawkin并将其转换为unquieID:hawkin和把它写成一个新行。因此,文件中具有属性homeDirectory:的每个对象现在都将被写入以保存homeDirectory:/ home /并且在其下面将是unquieID :.所以新对象将如下所示:

dn: uid=steven.hawkin@science.com,ou=people,o=nasa
mail: steven.hawking@cambridge.com
mail: steven.hawking@science.com
uid: steven.hawking@science.com
homeDirectory: /home/hawkin
unquieID: hawkin
givenName: Steven
sn: hawkin
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: Person
objectClass: LoginProperties
objectClass: Top

根据我的研究,这将发生在整个文件中的1700+中的412个对象。当然我还需要将objectClass:posixAccount添加到每个相同的412个用户对象中,但我想我可以通过对文件的单独传递来做到这一点,就像事后一样。像这样:

sed -i '/^unquieID: /a objectClass: posixAccount' $1

当然,如果你想在搜索homeDirectory和添加uniqueID的同时在新行上添加“objectClass:posixAccount”,那么无论如何。

请记住,我可以使用低效的bash程序以编程方式执行此操作并遍历文件中的每一行,但我的目标是学习如何使用任何命令或正则表达式执行此操作。

由于

1 个答案:

答案 0 :(得分:2)

awk救援!

$ awk '/^homeDirectory/ {n=split($NF,a,"/");u=a[n];o=1} 1; 
       u                {print "uniqueID:",u; u=""} 
       o&&/^objectClass/{print $1,"posixAccunt"; o=0}' file

dn: uid=steven.hawkin@science.com,ou=people,o=nasa
mail: steven.hawking@cambridge.com
mail: steven.hawking@science.com
uid: steven.hawking@science.com
homeDirectory: /home/hawkin
uniqueID: hawkin
givenName: Steven
sn: hawkin
objectClass: inetOrgPerson
objectClass: posixAccunt
objectClass: organizationalPerson
objectClass: Person
objectClass: LoginProperties
objectClass: Top

<强>解释

搜索密钥并通过用“/”分割最后一个字段并获取最后一个值来创建uniqueID,我们还设置了两个指标,一个是uniqueId本身,另一个是标记要打印的objectClass。 1打印当前行。如果设置了u指标;打印并重置。如果设置了o指示符并且我们输入了objectClass部分,则打印附加项并重置该指示符。这里的位置设置为第二个,但通过更改我们打印当前行的位置,可以移动它。