【问题标题】:Output error with awk and a complex findawk 的输出错误和复杂的查找
【发布时间】:2014-10-03 08:31:13
【问题描述】:

我有一个来自 LDAP 数据库的数据转储,我正在尝试提取一些关键字段。

awk '/mail:|uid:|generationQualifier:|initials:|givenName:|fullName:|messageServer:|telephoneNumber:|facsimileTelephoneNumber:/{s=s", "$0} /description:/ {s=s", "$0 "\n" ;} END{printf substr(s,3)}' dump2.txt >> mainDump2.csv

我能够恢复所有数据,但输出没有添加 \n '一直'。在大多数情况下,它确实在以下行中:

sASLoginSecret:: ngAAgAHkAbwB1vAG0AIABoAGkAZwBoACAAcwBjAGgAbwBvAGwAPwCwAAA
 AabodpVFjlT1Hf8fQRXNPMvaHPPxCFuysBdTMQ9SX+ycAWnCQydlkBP+eo6VrspaTnOxk0rBf
 MMI5x+F+TwogburQi3mphOY8ueffckjBDMgDFN2GlXCmLb1BQIVLFZz2HDUadB7JNl3OpfvRd7i0U
 t4xMQ=
mail: kletcher@land.edu
uid: kfletcher
givenName: Kat
fullName: Kat letcher
Language: English
messageServer: cn=IIS5,ou=LAND,o=landCollege
title: Executive Director of Institutional Advancement
telephoneNumber: 432-555-4519
sn: Fletcher
securityEquals: cn=AllNWUsers-Group,ou=GROUPS,ou=LAND,o=landCollege
securityEquals: cn=MC-FacStaff-Group,ou=GROUPS,ou=LAND,o=landCollege
securityEquals: cn=MC-FullTimers-Group,ou=GROUPS,ou=LAND,o=landCollege
securityEquals: cn=InstAdvFolder-Group,ou=IA,ou=LAND,o=landCollege
passwordUniqueRequired: TRUE
passwordRequired: TRUE
passwordMinimumLength: 8
passwordExpirationTime: 20141130124749Z
passwordExpirationInterval: 15552000
passwordAllowChange: TRUE
ou: Institutional Advancement & MC Foundation
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: Person
objectClass: ndsLoginProperties
objectClass: Top
eMailAddress: 7#kfletcher@land.edu
loginTime: 20140911135740Z
loginMaximumSimultaneous: 2
loginIntruderAddress:: MSMKBwcB
loginGraceRemaining: 6
loginGraceLimit: 6
l: PAD 143
ndsHomeDirectory: cn=NWCL1_FACHOME,ou=LAND,o=landCollege#0#home\kfletche
 r
groupMembership: cn=AllNWUsers-Group,ou=GROUPS,ou=LAND,o=landCollege

它的输出如下:

https://bpaste.net/show/cd743ee697d3

那是因为有些人没有传真号码,所以字符串匹配永远不会发生,也不会添加新行。 '但是',每个人都有一个电子邮件地址,但我无法弄清楚如何让它在邮件前面添加新行:然后打印该行。

我将如何编辑我的 awk 以输出诸如

\n mail: ...

?

【问题讨论】:

    标签: linux bash text awk


    【解决方案1】:

    再次更新

    您确定没有将上述代码用于 20GB 文件吗?无论需要多长时间 - 您一直一次将一行附加到一个变量,并且只在最后输出它 - 当一个字符串可能达到几百 MB 或更多时......

    为什么不在每一行完成后立即输出,然后开始构建下一行?类似这样,但为了清楚起见省略了一些字段:

    awk '/uid:|givenName:|fullName:|description:/{
            if(length(s)>0)s=s", "            # add comma separator if s already has anything in it
            s=s $0                            # append this line to s
         }
         /^mail:/{
            if(length(s)>0)printf "\n%s",s    # if s has anything in it, output new line and s
            s=$0                              # start building up s afresh with email address
         }
         END{print s}' file
    

    更新

    不,我的意思是如果你有一个名为MAIL 的字符串,并且你想在它之前打印一个新行,你可以这样做:

    MAIL="Hello I am some mail";   printf "\n%s",MAIL;
    

    原答案

    我认为你的意思是:

    awk 'BEGIN{printf "\nstring:%s\nnumber:%d\n","string",42}'
    
    string:string
    number:42
    

    【讨论】:

    • 你的意思是这样? -> awk '/uid:|generationQualifier:|initials:|givenName:|fullName:|messagerver:|telephoneNumber:/{s=s", "$0} BEGIN{printf "\nmail:%s","string", 42} {s=s", "$0 "\n" ;} END{printf substr(s,3)}' dump2.txt >> mainDump3.csv -> 没有达到预期的效果。
    • 我正在搜索的文件是 20 gig。我看不出将整个文件设置为变量的地方会做得非常好,而且您完全忽略了这是一个复杂的搜索(6 个不同的项目)这一事实。我已经尝试将 BEGIN 放在代码中的各个位置,但没有任何效果。我看不出您的代码可以在哪里提供帮助。尊敬。不过感谢您的回复。
    • 我已经更新了我的答案 - 请再看看。
    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 2022-08-02
    • 2023-04-06
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多