2016-11-30 3 views
0

Я пытаюсь получить адрес mac из моей малины Pi, беря последние 6 символов mac для использования в качестве имени хоста наряду с фиксированной строкой.Сценарий оболочки Linux - обрезка строки для тире

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

#!/bin/sh -e 

MAC="$(sed "s/^.*macaddr=\([0-9A-F:]*\) .*$/\1/;s/://g" /proc/cmdline)" 

MAC1="${MAC??????%}" 

echo "$MAC1" 

оболочка используется Пи, кажется, тир, так что обычные команды BASH, что бы это делалось в не-времени не хотят работать или, кажется, приводит к возникновению ошибок при запуске в сценарии.

Полный сценарий, который я использую в rc.local, приведен ниже.

любой совет относительно способа сделать это будет в значительной степени воспринят.

MAC="pi""$(sed "s/^.*macaddr=\([0-9A-F:]*\) .*$/\1/;s/://g" /proc/cmdline)" 
echo "$MAC" > "/etc/hostname" 
CURRENT_HOSTNAME=$(cat /proc/sys/kernel/hostname) 
sed -i "s/127.0.1.1.*$CURRENT_HOSTNAME/127.0.1.1\t$MAC/g" /etc/hosts 
hostname $MAC 
+0

вы можете предоставить некоторый образец вашей '/ Proc/cmdline' выход, а также ваш желаемый результат, основанный на том, что? – fedorqui

+0

@fedorqui dma.dmachans = 0x7f35 bcm2708_fb.fbwidth = 1920 bcm2708_fb.fbheight = 1080 bcm2709.boardrev = 0xa02082 bcm2709.serial = 0x85f8e90b smsc95xx.macaddr = B8: 27: EB: F8: E9: 0B bcm2708_fb.fbswap = 1 bcm2709. uart_clock = 48000000 sdhci-bcm2708.emmc_clock_freq = 250000000 vc_mem.mem_base = 0x3dc00000 vc_mem.mem_size = 0x3f000000 dwc_otg.lpm_enable = 0 console = serial0,115200 console = tty1 root =/dev/mmcblk0p2 rootfstype = ext4 elev = deadline fsck.repair = yes rootwait – Kristiaan

+1

Пожалуйста, отредактируйте свой вопрос, а не используйте комментарии для добавления деталей. –

ответ

2

Если у вас есть команда cut на вашем Pi, вы могли бы сделать

MAC1=$(echo $MAC | cut -c 7-12) 
+0

Итак, мои сценарии могут быть не самыми красивыми или быстрыми, но он делает именно то, что мне нужно, чтобы делать это сейчас, спасибо за ответ Дмитрия. Для тех, кто хочет сделать то же самое на малине pi, вы можете изменить '/ etc/rc.local' и добавить следующий код: ' MAC = "$ (sed" s /^.* macaddr = \ ([0-9A-F:] * \). * $/\ 1 /; s /: // g "/ proc/cmdline)" MAC1 = "Pi" $ (echo $ MAC | cut -c 7-12) echo «$ MAC1»> «/ etc/hostname» CURRENT_HOSTNAME = $ (cat/proc/sys/kernel/hostname) sed -i "s/127.0.1.1. * $ CURRENT_HOSTNAME/127.0.1.1 \ t $ MAC1/g "/ etc/hosts имя хоста $ MAC1' – Kristiaan

0

Поскольку вы уже используете СЕПГ обработать строку, я хотел бы предложить, добавив еще одну команду:

MAC=$(sed -e 's/^.*macaddr=\([0-9A-F:]*\) .*$/\1/' \ 
      -e 's/://g' \ 
      -e 's/.*\(.\{6\}\)/\1/' /proc/cmdline) 

Дополнительный СЕПГ команда извлекает последние 6 символов в каждой строке (я предполагаю, что у вас есть только один?). Вы можете комбинировать команды в одну строку, если хотите, хотя я считаю этот подход более читабельным.

+0

это работает, но он удаляет последние символы, которые являются уникальными из MAC в этом случае, которые меня интересуют. – Kristiaan

+1

@ mklement0 спасибо за упоминание, что я был в процессе предложения о том, что OP использовал sed во всяком случае, поэтому я удалил «багизм». –

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