У меня есть grep, состоящий из нескольких частей, который извлекает строки из файлов конфигурации маршрутизатора. Grep извлекает множество полей, которые встречаются в файле только один раз, например, IP-адрес, статус регистрации, сообщество snmp и т.д. Для этого у меня есть простой grep, такой как следующее:

grep -e "ip address" -e "logging status" -e "snmp community" $file

Тем не менее, мне также нужно извлечь первый экземпляр поля, которое встречается в файле несколько раз, в данном случае это поле "область ospf". С одним grep, я могу сделать это с помощью:

grep -m 1 "ospf area" $file

Как я могу выполнить обе функции в одном grep? Я зацикливаюсь на сотнях очень длинных файлов, и я хотел бы сделать это максимально эффективным. Я также не женат на grep для этого, поэтому мне было бы интересно увидеть другие идеи.

1 ответ1

3

Возможно, awk будет лучшим инструментом для этого. Мы можем вспомнить, какие из них мы напечатали, и не печатать их снова с чем-то вроде:

awk '/ip address/ {print} /logging status/ {print} /snmp community/ {print} /ospf area/ {if(!ospf[$0]++) {print}}' "$file"

который будет печатать каждую строку, соответствующую любому из ваших первых примеров из grep (и каждый будет сделан отдельно, если вам нужен только первый, в противном случае вы можете объединить их с |). Для строк, соответствующих ospf area мы строим массив всех строк, которые мы уже видели, и печатаем его, только если мы не видели эту строку раньше.

Это напечатает каждую уникальную линию ospf area как написано. Если вам нужна только первая строка ospf area а не какие-либо другие, вы можете просто изменить установку массива на установку int/flag:

awk '/ip address|logging status|snmp community/ {print} /ospf area/ {if(!ospf++) {print}}' "$file"

и если вы не хотите обрабатывать что-то другое в других строках, мы можем упростить тот факт, что действие по умолчанию для awk - это печать соответствующей строки:

awk '/ospf area/ {if(!ospf++) {print}} /ip address|logging status|snmp community/' "$file"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .