使用awk或sed格式化输出

时间:2014-12-09 14:24:37

标签: bash awk sed

我有这个ldapsearch查询:

ldapsearch -D cn=root -w password -b "o=ldaphost" "(failedAttempts>=3)" "cn=Users" "mail" "jobTitle" "lastLoginDate"

它产生的结果是:

# insures, Users, C0001, C0001, Organisations, orgname
dn: cn=insures,cn=Users,o=C0001,o=C0001,cn=Organisations,o=ldap
mail: mal@yahoo.com
jobTitle:
lastLoginDate: 20090717182042Z

# mckeown, Users, C0002, C0002, Organisations, ldaphost
dn: cn=mccane,cn=Users,o=C0002,o=C0002,cn=Organisations,o=ldaphost
jobTitle: Director
lastLoginDate: 20120713103418Z

# satasa4, Users, C0003, C0003, Organisations, org
dn: cn=satasa4,cn=Users,o=C0003,o=C0003,cn=Organisations,o=org
mail: yahoo@yahoo.com
jobTitle:
lastLoginDate: 20140506104804Z

我需要将lastLoginDate的输出格式化为人类可读的内容,如

lastLoginDate 20014-05-06.

如何为多输出lastLoginDate执行此操作?

5 个答案:

答案 0 :(得分:1)

您可以尝试使用此sed命令

  sed -r '/lastLoginDate:/{s/([^:]+:) (.{4})(.{2})(.{2})(.*)/\1\2-\3-\4/g}' FileName

答案 1 :(得分:1)

这应该像你想要的那样格式化lastLoginDate行,同时保持其余行:

ldapsearch ... | awk '$1 == "lastLoginDate:" {
    y=substr($2,1,4);
    m=substr($2,5,2);
    d=substr($2,7,2);
    printf "%s %s-%s-%m\n", $1, y,m,d); next } 1'

答案 2 :(得分:0)

好像你想要这样的东西,

$ ......... | sed 's/\(lastLoginDate: [0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)[^ ]*/\1-\2-\3/g'

示例:

$ echo 'lastLoginDate: 20140506104804Z' | sed 's/\(lastLoginDate: [0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)[^ ]*/\1-\2-\3/g'
lastLoginDate: 2014-05-06

$ echo 'lastLoginDate: 20140506104804Z' | sed 's/\(lastLoginDate: [0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)[^ ]*/\1-\2-\3 \4:\5/g'
lastLoginDate: 2014-05-06 10:48

答案 3 :(得分:0)

对于输出格式的更高级处理,您应该考虑使用Perl中的Time::Piece核心模块来解析时间:

perl -MTime::Piece -lane 'if (/^lastLoginDate/) {
    $t=Time::Piece->strptime($F[1], "%Y%m%d%H%M%SZ"); 
    print "Last login time: ", $t->strftime("%H:%M:%S, %F")
}' file

-a开关将每一行拆分为数组@F。如果该行以" lastLoginDate"开头,则将第二个字段解析为时间对象。然后,您可以以您喜欢的任何格式打印出结果。上例的输出是:

Last login time: 18:20:42, 2009-07-17
Last login time: 10:34:18, 2012-07-13
Last login time: 10:48:04, 2014-05-06

可以在strftime man page上看到解析和输出的格式说明符。

答案 4 :(得分:0)

将logindate放入变量并分隔日期字段并将其传递给DATE命令。

echo $logindate | cut -b 1-8 | xargs date +"%Y-%m-%d" -d

但是,正如其他人所提到的,logindate也有时间戳信息,因此更好的方法是获取时间戳信息。

paste -d ' ' <( echo $logindate | cut -b 1-8 | xargs date +"%Y-%m-%d" -d ) <( paste -d ':' <( echo $logindate | cut -b 9-10 ) <( echo $logindate | cut -b 11-12 ) <( echo $logindate | cut -b 13-14 ))