【问题标题】:How to print a pattern using AWK?如何使用 AWK 打印图案?
【发布时间】:2015-04-15 14:53:19
【问题描述】:

我需要在文件中找到匹配正则表达式模式的单词。

所以如果排队,我有:

00:10:20,918  I [AbstractAction.java] - register | 0.0.0.0 | {GW_CHANNEL=AA, PWD=********, ID=777777, GW_USER=BB, NUM=3996, SYSTEM_USER=OS, LOGIC_ID=0}   
 awk -F' ' '{for(i=1;i<=NF;i++){ if($i ~ /GW_USER/ && /GW_CHANNEL/){print $5 " " $i} } }'

仅打印:

 register GW_USER=BB

我不会得到:

register GW_USER=BB GW_CHANNEL=AA

如何打印 GW_USER 和 GW_CHANNEL 列?

【问题讨论】:

  • 什么意思?你不需要那个模式之后的数字吗?在您的示例中,cc 来自哪里?
  • 我更改了我的问题并添加了示例。

标签: bash for-loop awk


【解决方案1】:

您的if 条件看起来不正确,您可以使用正则表达式替换:

awk '{for(i=1;i<=NF;i++){ if($i ~ /GW_USER|GW_CHANNEL/) print $5, $i } }' file

不需要在打印中使用-F" "" ",因为这是默认的字段分隔符。

你的情况:

if($i ~ /GW_USER/ && /GW_CHANNEL/)

将匹配FW_USER$i,但将匹配整行中的GW_CHANNEL

【讨论】:

  • 00:10:20,918 I [AbstractAction.java] - 注册 | 0.0.0.0 | {GW_CHANNEL=AA, PWD=********, ID=777777, GW_USER=BB, NUM=3996, SYSTEM_USER=OS, LOGIC_ID=0}
  • /GW_USER|GW_CHANNEL/ - 或。
  • 我不会得到:注册 GW_USER=BB GW_CHANNEL=AA
  • 抱歉没有听懂你的cmets。我建议您编辑您的问题并提供一个示例数据以及您的预期输出。
【解决方案2】:

只要您的输入中有 name=value 对,最好创建一个将名称映射到值的数组,然后按名称打印:

$ cat tst.awk
match($0,/{[^}]+/) {
    str = substr($0,RSTART+1,RLENGTH-1)
    split(str,arr,/[ ,=]+/)
    delete n2v
    for (i=1; i in arr; i+=2) {
        n2v[arr[i]] = arr[i+1]
    }
    print $5, fmt("GW_USER"), fmt("GW_CHANNEL")
}
function fmt(name) { return (name "=" n2v[name]) }
$
$ awk -f tst.awk file
register GW_USER=BB GW_CHANNEL=AA

这样你就可以轻松地打印或在未来对任何其他字段做任何你想做的事情。

【讨论】:

  • 谢谢你!这就是我需要的。
猜你喜欢
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 2020-03-01
  • 2021-08-19
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多