Невозможно прочитать строки между двумя шаблонами с помощью AWK - PullRequest
4 голосов
/ 13 июля 2020

Я пытаюсь прочитать журнал статуса openvpn, чтобы подключиться к пользователям. Я пробовал следовать ответу здесь , но не повезло.

Вот мой файл:

OpenVPN CLIENT LIST
Updated,Mon Jul 13 10:53:46 2020
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
user123,8.9.10.11:24142,143404433,5616022,Mon Jul 13 10:09:31 2020
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
192.168.1.2,user123,8.9.10.11:24142,Mon Jul 13 10:53:45 2020
GLOBAL STATS
Max bcast/mcast queue length,1
END

Мне нужны строки между «Common» и «ROUTING» , например:

user123,8.9.10.11:24142,143455713,5682214,Mon Jul 13 10:09:31 2020

Используя это:

awk '/Common/{flag=1;next}/ROUTING/{flag=0}flag' /pathtomylog/openvpn-status.log

Я получаю:

user123,8.9.10.11:24142,143455713,5682214,Mon Jul 13 10:09:31 2020
192.168.1.2,user123,8.9.10.11:24142,Mon Jul 13 11:00:36 2020
GLOBAL STATS
Max bcast/mcast queue length,1
END

Любая помощь приветствуется.

Изменить: следующее код работал отлично. Проблема заключалась во втором экземпляре Common.

sudo awk '/ROUTING/{flag=""} /^Common/{flag=1;next} flag' Input file

1 Ответ

3 голосов
/ 13 июля 2020

Не могли бы вы попробовать следующие, написанные и протестированные с показанными образцами в GNU awk.

awk '/ROUTING/{flag=""} /^Common/{flag=1;next} flag' Input_file

Почему код OP не работал: Первый флаг устанавливается строкой, начинающейся с Common, а затем снова устанавливается строкой Common, которая также идет после ROUTING, при этом переменная flag снова устанавливается, а затем ее НИКОГДА не сбрасывается, потому что ROUTING НЕ находится после 2-го Common, следовательно, он печатает все строки оттуда. Поэтому я изменил регулярное выражение, которое ищет /^Common/, которое не будет соответствовать другой строке после ROUTING.

Объяснение: Добавив подробное объяснение выше.

awk '             ##Starting awk program from here.
/ROUTING/{        ##Checking if a line starts from string ROUTING then do following.
  flag=""         ##Setting flag value to NULL here. Since we want to STOP printing from here onward.
}
/^Common/{        ##Checking condition if a line starting from Common then do following.
  flag=1          ##Setting variable flag to 1 here.
  next            ##next keyword will skip all further statements from here.
}
flag              ##Checking condition if flag is SET then print current line(since no action mentioned so by default printing of current line will happen) here.
' Input_file      ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...