2016-10-12 1 views
0

У меня есть Beaglebone Черные на основе пользовательского борта,
Я хочу, чтобы извлечь IP-адрес интерфейс eth0 и заменить четвертый октет с 0.
Я использую ниже одного лайнера для извлечения IP,один лайнер, чтобы извлечь IP-адрес с последним октетом заменен 0

ip addr show eth0 | awk '$1=="inet"{print $2}' 
output : 192.168.2.158/24 

Expected output : 192.168.2.0/24 

однако я не в состоянии сделать четвертый октет 0, я думал использовать функцию gsub, однако, не в состоянии получить правильную комбинацию. :(

Я не хочу больше труб в команде

Любое предложение/указатели

Любое другое предложение

+0

Вы не заменяя четвёртой там? – 123

+0

Есть ли у него GNU awk? – 123

+0

@ 123 oops .. вы правы, я хочу заменить 4-й. – AnkurTank

ответ

2

на основе ожидаемого результата:.?. Заменяющего четвертый октет

ip addr show eth0 |awk '/inet/{split($2,a,".");split($2,b,"/");print a[1] "." a[2] "." a[3] ".0/" b[2]}' 
142.133.152.0/25 

Если его 3-й октет:

ip addr show eth0 |awk '/inet/{split($2,a,".");print a[1] "." a[2] ".0." a[4] }' 
142.133.0.192/25 
+0

Это будет соответствовать inet и inet6 – 123

+0

нет, я добавил пробел после 'inet'. –

+1

О, ладно, не видел, что – 123

1

Вам это подходит?

ip addr show eth0 | awk '$1=="inet" {gsub(".[0-9]*/24",".0/24",$2);print $2}' 
+0

Я не хочу жестко кодировать '/ 24'. – AnkurTank

+0

Я имел в виду, что я не хочу '/ 24' жестко закодирован. – AnkurTank

1

Вы можете заменить последний октет адреса и слэш 0/:

ip addr show eth0 | awk '$1=="inet"{sub(/[0-9]+\//, "0/", $2); print $2}' 
1

С sed

$ ip addr show eth0 | sed -nE '/^\s*inet\b/ s/^\s*inet\s*(([0-9]+\.){3})[0-9]+(\S+).*/\10\3/p' 
192.168.1.0/24 
  • /^\s*inet\b/ фильтром требуется только линия
  • s/^\s*inet\s*(([0-9]+\.){3})[0-9]+(\S+).*/\10\3/ захвата s равномерность чисел, а затем . трижды, оставьте следующую последовательность чисел, а затем захватите непространственные символы. Замены в соответствии с требованием
  • Некоторые версии могут работать с sed -nr вместо sed -nE
+0

в команде busybox shell (ash) над командой не работает :(Любопытно, когда sed - это сочетание '/' и '\', не так ли полезно использовать ':' или '|' как разделитель? Eg 'sed ' s: : : p' или sed 's <строка поиска> | | p'. Обычно я это делаю. Есть ли там яма? – AnkurTank

+0

с использованием другого разделителя помогает, когда дело с '/', что не так в моем примере ... 'не работает' слишком широк .. что именно происходит не так? Ошибка msg? – Sundeep

+0

Я получаю следующую ошибку' sed: invalid option - 'E' BusyBox v1.20.2 (2016-09-23 19:08:29 EDT) multi-call binary. Использование: sed [-inr] [-f FILE] ... [-e CMD] ... [FILE] ... или: sed [-inr] CMD [FILE] ... ' – AnkurTank

Смежные вопросы