Использование grep, awk и т. Д. Для фильтрации вывода команды

В качестве примера я использую route.

route -n

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

route -n | awk '{print $2}'

Теперь, как я могу фильтровать по строке?

2
задан 30 November 2011 в 02:30

5 ответов

Чтобы напечатать определенную строку, вы можете использовать sed:

route -n | sed -n 2p

для печати второй строки.

sed, что есть

Я дам короткое и неполное объяснение того, что sed. Для полного описания я предлагаю просмотреть sed информационные страницы (run info sed).

sed означает редактор потока, то есть редактор, который может воздействовать на поток (или канал) текстовых данных , хотя он может действовать и на файлы; по существу это означает, что (в отличие от ed) он никогда не сможет вернуться к предыдущей строке.

sed, поскольку awk читает по одной строке за раз и применяет сценарий к этой строке, чтобы возможно, изменить его. В конце скрипта по умолчанию модифицированная строка выводится на stdout. Затем sed переходите к следующей строке.

Сценарий представляет собой последовательность парных адресных команд, если строка соответствует адресу, тогда выполняется команда.

Типичная использование sed заключается в выполнении подстановки шаблона чем-то, например

command | sed 's/ *$//'

здесь строка между одинарными кавычками - это скрипт, состоящий из одной пары адрес-команда. Адрес отсутствует (он появится перед s), в таком случае команда применяется по умолчанию ко всем входным строкам. s - это команда, а остальная часть строки - это команды, специфичные для команды: «замените 0 или больше вхождения (*) символа пробела () в конце строки ($) без ничего ( т.е. удалить их).

Другая полезная команда - p и d. Команда p печатает текущую строку, это полезно в сочетании с опцией -n, которые изменяют поведение по умолчанию для печати текущей строки в конце скрипта. Таким образом, в

sed -n '2p'

сценарий представляет собой строку 2p, состоящую из адреса 2 и команды p, поэтому строка 2 будет напечатана, а другая строка не будет напечатана , из-за опции -n.

Команда d удаляет строку, например

    sed '3,6d'

удаляет все строки с третьего по шестое. 3,6 - диапазон адресов. Я заметил, что в этом случае нельзя использовать параметр -n, потому что мы хотим напечатать все остальные строки.

Последняя вещь, адрес может быть шаблоном, как в

sed -n '/^#/p'

эта команда будет печатать все строки, начинающиеся (^) с символом #.

3
ответ дан 25 May 2018 в 16:23
  • 1
    Это очень просто! Не могли бы вы объяснить, для чего нужен p? – Brian Graham 30 November 2011 в 05:18
  • 2
    @DarkSlipstream: я добавил короткое описание sed в целом и команды p в частности. – enzotib 30 November 2011 в 14:53

Чтобы напечатать определенную строку, вы можете использовать sed:

route -n | sed -n 2p

для печати второй строки.

sed, что есть

Я дам короткое и неполное объяснение того, что sed. Для полного описания я предлагаю просмотреть sed информационные страницы (run info sed).

sed означает s tream ed itor , то есть редактор, который может воздействовать на поток (или канал) текстовых данных, хотя он может действовать и на файлы; по существу это означает, что (иначе, чем ed) он никогда не сможет вернуться к предыдущей строке.

sed, поскольку awk читает по одной строке за раз и применяет скрипт к этой строке, чтобы возможно, изменить его. В конце скрипта по умолчанию модифицированная строка выводится на stdout. Затем sed переходите к следующей строке.

Сценарий представляет собой последовательность парных адресных команд, если строка соответствует адресу, тогда выполняется команда.

Типичный использование sed заключается в выполнении подстановки шаблона чем-то, например

command | sed 's/ *$//'

здесь строка между одинарными кавычками - это скрипт, состоящий из одной пары адрес-команда. Адрес отсутствует (он появится перед s), в таком случае команда применяется по умолчанию ко всем входным строкам. s - это команда, а остальная часть строки - это команды, специфичные для команды: «замените 0 или больше вхождения (*) символа пробела () в конце строки ($) без ничего ( т.е. удалить их).

Другая полезная команда - p и d. Команда p печатает текущую строку, это полезно в сочетании с опцией -n, которые изменяют поведение по умолчанию для печати текущей строки в конце скрипта. Таким образом, в

sed -n '2p'

сценарий представляет собой строку 2p, состоящую из адреса 2 и команды p, поэтому строка 2 будет напечатана, а другая строка не будет напечатана , из-за опции -n.

Команда d удаляет строку, например

    sed '3,6d'

удаляет все строки с третьего по шестое. 3,6 - диапазон адресов. Я заметил, что в этом случае нельзя использовать параметр -n, потому что мы хотим напечатать все остальные строки.

Последняя вещь, адрес может быть шаблоном, как в

sed -n '/^#/p'

эта команда будет печатать все строки, начинающиеся (^) с символом #.

3
ответ дан 10 August 2018 в 08:38

Вы можете отфильтровать IN в строке по трубопроводу до grep и найти строку, которая начинается с вашего интересующего IP-адреса, например, если вы хотите увидеть строку для 192.168.1.1, вы бы сделали:

[ f1]

Знак «^» означает «line-starts-with». Таким образом, вы можете быть более общим с:

$ route | grep ^192.168.1
192.168.1.0     *               255.255.255.0   U     2      0        0 wlan0
192.168.111.0   *               255.255.255.0   U     0      0        0 virbr0
1
ответ дан 25 May 2018 в 16:23

Вы можете использовать регулярное выражение, чтобы указать awk, какие строки вы хотите, например

route -n | awk '/^192.168/ {print $2}'

выведет столбец секунд всех строк, начинающийся с 192.168

1
ответ дан 25 May 2018 в 16:23

ответ awk также может выглядеть примерно так:

$0 ~ ( /matchthis/ ) { print $2 }

$ 0 просто ссылается на всю строку / строку

sed и awk может быть очень мощной комбинацией [!d2 ]

регулярные выражения стоят того, чтобы овладеть

0
ответ дан 25 May 2018 в 16:23

Другие вопросы по тегам:

Похожие вопросы: