【问题标题】:How to pass parameters and output in the required format如何传递参数并以所需格式输出
【发布时间】:2021-11-11 16:53:47
【问题描述】:
confirmerror(){
trimline|awk -F ':' '{if($5 != "") print}'
}
result(){
deviceName=$($1|awk '{print $4}')
processId=$($1|awk '{print $5}'|awk -F '[^0-9]*' '{print $2}')
processName=$($1|awk '{print $5}')
description=$($1|awk '{print $6,$7,$8,$9}')
echo $deviceName
echo $processId
echo $processName
echo $description
}
confirmerror | while read line; do result $line; done

函数confirmerror的输出:

May 13 00:01:58 BBAOMACBOOKAIR2 com.apple.xpc.launchd[1] (com.apple.mdworker.bundles[12513]): Could not find uid associated with service: 0: Undefined error: 0 501
May 13 00:01:58 BBAOMACBOOKAIR2 com.apple.xpc.launchd[1] (com.apple.mdworker.bundles[12513]): Service exited with abnormal code: 78
May 13 00:02:12 BBAOMACBOOKAIR2 com.apple.xpc.launchd[1] (com.apple.xpc.launchd.domain.pid.mdmclient.12523): Failed to bootstrap path: path = /usr/libexec/mdmclient, error = 108: Invalid path

需要读取函数x的每一行,处理后得到对应的格式输出,上面是我的尝试,但是失败了,所以来求教。

我想要什么:

BBAOMACBOOKAIR2 
1
com.apple.xpc.launchd[1]
(com.apple.mdworker.bundles[12513]): Could not find uid associated with service: 0: Undefined error: 0 501
BBAOMACBOOKAIR2
1
com.apple.xpc.launchd[1]
(com.apple.mdworker.bundles[12513]): Service exited with abnormal code: 78
BBAOMACBOOKAIR2
1
com.apple.xpc.launchd[1]
(com.apple.xpc.launchd.domain.pid.mdmclient.12523): Failed to bootstrap path: path = /usr/libexec/mdmclient, error = 108: Invalid path

【问题讨论】:

  • while read line; do confirmerror $(result $line); done
  • @DanielHornik 不工作
  • 需要以函数的形式完成,而不是单独的awk文件。
  • 不要使用 shell 读取循环来操作文本,请参阅 why-is-using-a-shell-loop-to-process-text-considered-bad-practice。此外,您的脚本中有多个 shell 错误,请复制/粘贴该脚本以及您编写的任何其他 shell 脚本,直到您将基本原理弄清楚到 shellcheck.net 并修复它告诉您的基本问题。
  • 您的问题中没有示例输入,并且您正在调用您未定义的名为 trimline 的工具或函数,因此请了解我们如何帮助您解决问题。正确的解决方案不是多次调用 awk 的 shell 脚本。再试一次,用awk标记你的问题。

标签: shell awk


【解决方案1】:

我认为,对于这项工作来说太复杂了。你有 awk,所以用它来完成工作。

文件:error.awk

{
    gsub(/^ */, "", $0)
    gsub(/ *$/, "", $0)
    FS = ":"
    if ($5 == "") {
        next
    }
}
{
    FS = " "
    deviceName = $4
    processId = $5
    gsub(/^.*\[/, "", processId)
    gsub(/\].*$/, "", processId)
    processName = $5
    $1 = $2 = $3 = $4 = $5 = ""
    gsub(/^ */, "", $0)
    description = $0
    print deviceName
    print processId
    print processName
    print description
}

并使用它:

output_command_or_cat_filename | awk -f error.awk

输出:

BBAOMACBOOKAIR2
1
com.apple.xpc.launchd[1]
(com.apple.mdworker.bundles[12513]): Could not find uid associated with service: 0: Undefined error: 0 501
BBAOMACBOOKAIR2
1
com.apple.xpc.launchd[1]
(com.apple.mdworker.bundles[12513]): Service exited with abnormal code: 78
BBAOMACBOOKAIR2
1
com.apple.xpc.launchd[1]
(com.apple.xpc.launchd.domain.pid.mdmclient.12523): Failed to bootstrap path: path = /usr/libexec/mdmclient, error = 108: Invalid path

【讨论】:

  • error.awk中添加$5作为模式,你也可以去掉confirm errortrimline | awk -f error.awk
  • @chepner:我已经用 trim 和 $5 过滤器更新了 awk 代码
  • @ArnaudValmary 语法错误附近出现意外符号 `/^'
  • @YYZZYY:这不是 bash 程序。这是awk程序。将此命令与以下命令一起使用:cat error.txt | awk -f error.awk。或者,如果您想像 shell 脚本一样执行它,请在第一行添加:#! /bin/awk -f 以及执行它的良好权限!
  • @ArnaudValmary 这可以转换成函数吗?用了#!/bin/awk -f 还是不能用
【解决方案2】:

这是你想要做的吗?

$ cat tst.sh
#!/usr/bin/env bash

# Using "cat file" in place of "trimline" which I dont have.
cat file |
awk '
    { split($0,errChk,/:/) }

    errChk[5] != "" {
        deviceName = $4
        processId = processName = $5
        gsub(/.*\[|].*/,"",processId)
        description = $0
        sub(/[^(]*/,"",description)

        print deviceName
        print processId
        print processName
        print description
    }
'

$ ./tst.sh
BBAOMACBOOKAIR2
1
com.apple.xpc.launchd[1]
(com.apple.mdworker.bundles[12513]): Could not find uid associated with service: 0: Undefined error: 0 501
BBAOMACBOOKAIR2
1
com.apple.xpc.launchd[1]
(com.apple.mdworker.bundles[12513]): Service exited with abnormal code: 78
BBAOMACBOOKAIR2
1
com.apple.xpc.launchd[1]
(com.apple.xpc.launchd.domain.pid.mdmclient.12523): Failed to bootstrap path: path = /usr/libexec/mdmclient, error = 108: Invalid path

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2015-12-09
    • 2023-03-20
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多