Как выбрать поля в неоднородном файле, используя разные разделители? - PullRequest
0 голосов
/ 01 февраля 2019

У меня проблемы с написанием однострочной строки, которая выберет числа в скобках, обернет их в двойные кавычки, вставит запятую, затем выделит весь текст после «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, и я могу получить вид результата, который я хочу.Я просто не могу прибить это.Я избавлю тебя от моих безобразных неудачных попыток.

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019
$ 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
0 голосов
/ 01 февраля 2019
# 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
0 голосов
/ 01 февраля 2019

Не могли бы вы попробовать следующее (Всегда рекомендуется добавлять свои усилия в ваш пост, пожалуйста, сделайте это, так как мы все здесь, чтобы учиться).

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...