【问题标题】:How to select fields in a non-uniform file using different delimiters?如何使用不同的分隔符选择非统一文件中的字段?
【发布时间】:2019-06-26 08:13:47
【问题描述】:

我在编写一个单行语句时遇到问题,它将选择括号之间的数字,用双引号括起来,插入一个逗号,然后选择“USER_RULE:”之后的所有文本直到下一个双引号。

这是我的文件的一个小样本:

@213(1547485175) pass in quick on igb0 inet proto udp from <MGMT_HOSTS:1> to <UNRAID_IP:1> port = http keep state label "USER_RULE: Local Mgmt Services"
@174(1548683908) block return in quick on ALL_LAN inet proto tcp from <LOCAL_NETWORKS:7> to <LOCAL_BROADCAST:8> label "USER_RULE: Local Broadcast Noise"
@157(1547555119) block return in log quick on ALL_LAN inet from ! <NO_PFBLOCKER:1> to <pfB_BAD_IP_v4:55258> label "USER_RULE: pfb_Bad_IP (outbound)"
@137(1547478025) pass in quick on igb0 inet proto tcp from 192.168.1.0/24 to (self:13) port = ssh flags S/SA keep state label "USER_RULE: Anti-Lockout"
@386(1548774638) pass in quick on igb0.10 route-to (ovpnc1 10.20.48.141) inet proto udp from <MOBILE_DEVICES:5> to ! <PRIVATE_NETWORKS:3> port = https keep state label "USER_RULE: Policy Route" tag NO_WAN_EGRESS

这是我的预期输出:

"1547485175",Local Mgmt Services
"1548683908",Local Broadcast Noise
"1547555119",pfb_Bad_IP (outbound)
"1547478025",Anti-Lockout
"1548774638",Policy Route

我尝试了 awk、sed 和 grep 的各种组合,我可以得到我想要的输出。我就是搞不定。我会免除你我丑陋的失败尝试。

【问题讨论】:

  • 如果您让我们免于“丑陋的失败尝试”,那么您的问题可能只会遭到多次反对并被关闭,从那时起您就不会提供在此论坛上提问所需的最少信息(请参阅@ 987654321@) 所以请 - 不要放过我们:-)。

标签: awk sed


【解决方案1】:
# File a.awk:

BEGIN { q = "\"" }
{ idx = index($0, "USER_RULE:")
  rule = substr($0, idx + 11)
  idx = index(rule, q) - 1
  print q substr($0, 6, 10) q "," substr(rule, 1, idx) 
}

运行:

$ awk -f a.awk file
"1547485175",Local Mgmt Services
"1548683908",Local Broadcast Noise
"1547555119",pfb_Bad_IP (outbound)
"1547478025",Anti-Lockout
"1548774638",Policy Route

【讨论】:

    【解决方案2】:
    $ sed 's/[^(]*(\([^)]*\).*"USER_RULE: *\([^"]*\).*/"\1",\2/' file
    "1547485175",Local Mgmt Services
    "1548683908",Local Broadcast Noise
    "1547555119",pfb_Bad_IP (outbound)
    "1547478025",Anti-Lockout
    "1548774638",Policy Route
    

    【讨论】:

      【解决方案3】:

      您能否尝试关注(始终建议您在帖子中添加您的努力,所以请这样做,因为我们都在这里学习)。

      awk '
      BEGIN{
        s1="\""
        OFS=","
      }
      match($0,/\([^\)]*/){
        val=substr($0,RSTART+1,RLENGTH-1)
      }
      match($0,/USER_RULE[^"]*/){
        print s1 val s1,substr($0,RSTART+11,RLENGTH-11)
      }'  Input_file
      

      输出如下。

      "1547485175",Local Mgmt Services
      "1548683908",Local Broadcast Noise
      "1547555119",pfb_Bad_IP (outbound)
      "1547478025",Anti-Lockout
      "1548774638",Policy Route
      

      【讨论】:

      • @Rick,你能不能也检查一下这个并告诉我?
      猜你喜欢
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 2021-01-10
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      相关资源
      最近更新 更多