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

Я буду использовать route в качестве примера.

 route -n 

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

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

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

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

 route -n | sed -n 2p 

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

sed , что

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

sed mean 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' 

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

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

 $ route | grep ^192.168.1.0 192.168.1.0 * 255.255.255.0 U 2 0 0 wlan0 

Знак «^» означает «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 

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

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

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

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

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

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

sed и awk могут быть очень мощной комбинацией

регулярные выражения заслуживают внимания.