正则表达式从文件中提取 DKIM 记录

正则表达式从文件中提取 DKIM 记录

我正在尝试编写 postfix 服务器部署脚本,并相应地创建 DNS 记录。防晒指数; DMARC 和 DKIM。前两个非常简单,但我正在努力从 opendkim 生成的文件中提取记录。

这是 opendkim 给我的文件:

mail._domainkey IN  TXT ( "v=DKIM1; h=sha256; k=rsa; t=y; "
      "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDK9yGy7orNIceonobdyTxr0USLo9XlWoo2/hg5MU5Ix+7bKFN0exJIUEeNLDAOYXWZe/0vQZan3+vnry9v3pVxqwpNp/92/xbp0pILJBzc1i5YXFe60XAlBBWq+Y9UAY2uXXsiFY4IUmhGZdMCubuHguWy/R2HDmCwrtN5vn0XfQIDAQAB" )  ; ----- DKIM key mail for localhost

我想要一个适合 dns 记录的输出,例如

"v=DKIM1; h=sha256; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDK9yGy7orNIceonobdyTxr0USLo9XlWoo2/hg5MU5Ix+7bKFN0exJIUEeNLDAOYXWZe/0vQZan3+vnry9v3pVxqwpNp/92/xbp0pILJBzc1i5YXFe60XAlBBWq+Y9UAY2uXXsiFY4IUmhGZdMCubuHguWy/R2HDmCwrtN5vn0XfQIDAQAB"

我已经尝试了几件事,但我什至无法使用我在这里找到的命令提取括号之间的内容:grep:正则表达式仅用于匹配括号之间的任何内容

看起来有一些线路返回问题或者我不知道

感谢您的阅读,抱歉英语不好!祝你今天过得愉快

答案1

使用 GNU awk,您可以将FPAT每个记录拆分为键值对,循环遍历字段并将它们附加到字符串中。在 END 部分中,打印字符串以及开头和结尾"

awk -v FPAT='.=[^;"]+(; )?' '{
    for (i=1;i<=NF;i++) s=s $i
}
END {
    print "\"" s "\""
}' file

答案2

假设 GNU grep,我会挑选出带引号的字符串,然后将它们连接在一起

grep -oP '".*?"' file | tr -d '\n' | sed 's/" *"//g'; echo

您的示例的结果(为简洁起见缩短)

"v=DKIM1; h=sha256; k=rsa; t=y; p=MIGfMA0GCSqG…QAB"

或者你可以使用perl

perl -e '
    $_ = join(" ", (map {chomp; $_} <>));    # Read and join lines
    s/^.*?(".*").*$/$1/;                     # Strip leading and trailing text outside quoted strings
    s/"\s*"/ /g;                             # Merge adjacent quoted strings
    s/\s\s+/ /g;                             # Reduce multiple spaces to one
    print                                    # Output the result
' file

相关内容