【问题标题】:Convert a Text File to JSON using PowerShell使用 PowerShell 将文本文件转换为 JSON
【发布时间】:2021-03-12 11:55:31
【问题描述】:

我在 AWS S3 存储中工作,我们有存储桶,并且正在将文件添加到存储桶中。 Bucket信息以文本格式记录到另一个bucket中。

我想将存储在文本文件中的日志信息转换为 JSON。但是文件中没有密钥对信息。

LogFile的内容如下:-

fd89d80d676948bd913040b667965ef6a50a9c80a12f38c504f497953aedc341 s3Samplebucket [10/Mar/2021:03:27:29 +0000] 171.60.235.108 fd89d80d676948bd913040b667965ef6a50a9c80a12f38c504f497953aedc341 MX1XP335Q5YFS06H REST.HEAD.BUCKET - "HEAD /s3Samplebucket HTTP/1.1" 200 - - - 13 13 "-" "S3Console/0.4, aws-internal/3 aws-sdk-java/1.11.964 Linux/4.9.230-0.1.ac.224.84.332.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.282-b08 java/1.8.0_282 vendor/Oracle_Corporation" - AMNo4/b/T+5JdEVQpLkqz0SV8VDXyd3odEFmK+5LvanuzgIXW2Lv87OBl5r5tbSZ/yjW5zfFQsA= SigV4 ECDHE-RSA-AES128-GCM-SHA256 AuthHeader s3-us-west-2.amazonaws.com TLSv1.2

日志文件的各个值如下:-
日志字段

存储桶所有者: fd89d80d676948bd913040b667965ef6a50a9c80a12f38c504f497953aedc341
桶: S3SampleBucket
时间: [11/Mar/2021:** 06:** 52:** 33 +0000]
远程IP: 183.87.60.172
请求者: arn:** aws:** iam:** :** 486031527132:** user/jdoe
请求 ID: 9YQ1MWABKNRPX3MP
操作: REST.GET.LOCATION
键: -(空白)
请求 URI: "GET /?location HTTP/1.1"
HTTP 状态: 200
错误代码: -(空白)
发送的字节数: 137
对象大小: -(空白)
总时间: 17
周转时间: -(空白)
推荐人:“-”(空白)
用户代理:“AWSPowerShell/4.1.9.0 .NET_Runtime/4.0 .NET_Framework/4.0 OS/Microsoft_Windows_NT_10.0.18363.0 WindowsPowerShell/5.0 ClientSync”
版本 ID: -(空白)
主机 ID: Q5WBxJNrwsspFmtOG+d2YN0xAtvbq1sdqm9vh6AflXdMCmny5VC3bZmyTBZavKGpO3J/uz+IfK0=
签名版: SigV4
密码套件: ECDHE-RSA-AES128-GCM-SHA256
身份验证类型: AuthHeader
主机标头: S3SampleBucket.s3.us-west-2.amazonaws.com
TLS 版本: TLSv1.2

我可以在配置文件中添加值是我能想到的。我想在 PowerShell 或 Python 中执行此操作。

任何帮助都会有很大帮助。

【问题讨论】:

    标签: json amazon-web-services powershell amazon-s3


    【解决方案1】:

    日志格式可以解释为 CSV(带有空格分隔符),因此您可以使用 Import-Csv/ConvertFrom-Csv 解析它:

    $columns = 'Bucket Owner', 'Bucket', 'Time', 'Remote IP', 'Requester', 'Request ID', 'Operation', 'Key', 'Request-URI', 'HTTP status', 'Error Code', 'Bytes Sent', 'Object Size', 'Total Time', 'Turn-Around Time', 'Referer', 'User-Agen', 'Version Id', 'Host Id', 'Signature Version', 'Cipher Suite', 'Authentication Type', 'Host Header', 'TLS version'
    
    $data = @'
    fd89d80d676948bd913040b667965ef6a50a9c80a12f38c504f497953aedc341 s3Samplebucket [10/Mar/2021:03:27:29 +0000] 171.60.235.108 fd89d80d676948bd913040b667965ef6a50a9c80a12f38c504f497953aedc341 MX1XP335Q5YFS06H REST.HEAD.BUCKET - "HEAD /s3Samplebucket HTTP/1.1" 200 - - - 13 13 "-" "S3Console/0.4, aws-internal/3 aws-sdk-java/1.11.964 Linux/4.9.230-0.1.ac.224.84.332.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.282-b08 java/1.8.0_282 vendor/Oracle_Corporation" - AMNo4/b/T+5JdEVQpLkqz0SV8VDXyd3odEFmK+5LvanuzgIXW2Lv87OBl5r5tbSZ/yjW5zfFQsA= SigV4 ECDHE-RSA-AES128-GCM-SHA256 AuthHeader s3-us-west-2.amazonaws.com TLSv1.2
    '@
    
    $parsedLog = $data |ConvertFrom-Csv -Delimiter ' ' -Header $columns
    

    现在生成的对象很容易转换为 JSON:

    PS ~> $parsedLog |ConvertTo-Json
    {
        "Bucket Owner":  "fd89d80d676948bd913040b667965ef6a50a9c80a12f38c504f497953aedc341",
        "Bucket":  "s3Samplebucket",
        "Time":  "[10/Mar/2021:03:27:29",
        "Remote IP":  "+0000]",
        "Requester":  "171.60.235.108",
        "Request ID":  "fd89d80d676948bd913040b667965ef6a50a9c80a12f38c504f497953aedc341",
        "Operation":  "MX1XP335Q5YFS06H",
        "Key":  "REST.HEAD.BUCKET",
        "Request-URI":  "-",
        "HTTP status":  "HEAD /s3Samplebucket HTTP/1.1",
        "Error Code":  "200",
        "Bytes Sent":  "-",
        "Object Size":  "-",
        "Total Time":  "-",
        "Turn-Around Time":  "13",
        "Referer":  "13",
        "User-Agen":  "-",
        "Version Id":  "S3Console/0.4, aws-internal/3 aws-sdk-java/1.11.964 Linux/4.9.230-0.1.ac.224.84.332.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.282-b08 java/1.8.0_282 vendor/Oracle_Corporation",
        "Host Id":  "-",
        "Signature Version":  "AMNo4/b/T+5JdEVQpLkqz0SV8VDXyd3odEFmK+5LvanuzgIXW2Lv87OBl5r5tbSZ/yjW5zfFQsA=",
        "Cipher Suite":  "SigV4",
        "Authentication Type":  "ECDHE-RSA-AES128-GCM-SHA256",
        "Host Header":  "AuthHeader",
        "TLS version":  "s3-us-west-2.amazonaws.com"
    }
    

    在您的情况下,要从磁盘读取文件,只需将 $data = ...$data |ConvertFrom-Csv 语句替换为 Import-Csv

    $parsedLog = Import-Csv -Path .\path\to\s3requests.log -Delimiter ' ' -Header $columns
    

    【讨论】:

    • 我们不能使用空格“”,因为数据之间有空格,本质上是同一组的一部分... 例如 [10/Mar/2021:03:27:29 +0000] 171.60.235.108 应该是“时间”: "[10/Mar/2021:03:27:29 +0000],
      "远程 IP": "171.60.235.108",
      **根据您的代码是 ** "时间": "[ 10/Mar/2021:03:27:29”,“远程 IP”:“+0000]”,“请求者”:“171.60.235.108”,
    • @NottyHead 哦,我明白了。 (Get-Content file.log) -replace '\[([^\]]+)\]','"$1"' |ConvertFrom-Csv ... 应该可以解决问题
    • 另一个帮助请求@user:712649 在上面的示例中,如何将存储在 [10/Mar/2021:03:27:29 +0000] 中的时间转换为 MM-dd-yyyyTHH: mm:ssZ 格式。我问的原因是我们需要在下游系统中使用这些数据,其中数据存储为 03-10-2021T03:27:29Z
    • @NottyHead 这个网站上已有 100 个帖子已经回答了这个问题。 Try this one
    • @712649 $parsedLog = $data -replace '\[([^\]]+)\]','"$1"' |ConvertFrom-Csv -Delimiter ' ' -Header $columns $ date_format = "yyyy-MM-ddTHH:mm:ssZ" $parsedLog |选择 ([datetime]::ParseExact($_.'Time',"dd/MMM/yyyy:HH:mm:ss +0000",$null).ToSTring($date_format)) **错误:- ** 异常使用“3”参数调用“ParseExact”:“字符串未被识别为有效的 DateTime。”在 line:18 char:1 + $parsedLog |选择 ([datetime]::ParseExact($_.'Time',"dd/MMM/yyyy:HH ... + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : FormatException
    猜你喜欢
    • 2021-01-08
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多