2016-11-23 4 views
2

Мне нужно разобрать строку написанной жирного шрифта:Как напечатать последний столбец строки только с помощью «Grep» и «вырезать» команду Баша

line="eth1  Link encap:Ethernet HWaddr 11:11:11:11:11:11" 

Эта линия может иметь больше слов неожиданно, такие как

line="eth1  Link encap:Ethernet Extra HWaddr 11:11:11:11:11:11" 

Итак, для правильного разбора MAC-адреса необходимо выполнить синтаксический анализ строки с помощью команды bash.

echo $line | cut -d' ' -f5* работает для первой линии, в то время как *echo $line | cut -d' ' -f6* работает для второго. Итак, мне нужно проанализировать только последний столбец строки.

Тем не менее, из-за ограничения устройства, можно использовать только Grep и вырезать команду. Не СЭД, AWK, оборотов, обратный и т.д.

+0

Каков ваш ожидаемый результат? – Inian

+1

Последняя колонка с awk: 'awk '{print $ NF}'' – Cyrus

+0

Обратите внимание на [edit-help] (http://stackoverflow.com/editing-help). Префикс ваших линий с четырьмя пробелами. – Cyrus

ответ

3

С grep:

echo $line | grep -o -E '[^ ]+$' 

cut С, решение может быть сделано с помощью дополнительного расчета на основе количества слов , при условии, что разделителем является пробел:

nw=$(echo $line | wc -w) 
echo $line | cut -d ' ' -f$nw- 
0

Использование regEx только в bash с использованием тильды (=~) оператора. Вы можете запускать следующие команды непосредственно в командной строке без знака $.

$ line="eth1 Link encap:Ethernet HWaddr 11:11:11:11:11:11" 
$ printf "%s\n" "$string" 
eth1 Link encap:Ethernet HWaddr 11:11:11:11:11:11 
$ [[ $line =~ .*HWaddr\ (.*)$ ]] && printf "%s\n" "${BASH_REMATCH[1]}" 
11:11:11:11:11:11 

С дополнительными словами

$ line="eth1 Link encap:Ethernet Extra HWaddr 11:11:11:11:11:11" 
$ [[ $line =~ .*HWaddr\ (.*)$ ]] && printf "%s\n" "${BASH_REMATCH[1]}" 
11:11:11:11:11:11 

Другим способом использованием GNU grep с -P для perl стиля матча регулярного выражения.

$ grep -Po ".*HWaddr \K.*(.*)" <<<"eth1 Link encap:Ethernet HWaddr 11:11:11:11:11:11" 
11:11:11:11:11:11 

(а)

$ grep -Po ".*HWaddr \K.*(.*)" <<<"eth1 Link encap:Ethernet Extra HWaddr 11:11:11:11:11:11" 
11:11:11:11:11:11 

(или)

более-просто просто

$ echo "$line" | grep -Po ".*HWaddr \K.*(.*)" 
11:11:11:11:11:11 
+0

Я пытаюсь запустить команды в сеансе telnet, где <<< не может быть выполнен. – user3683697

+0

@ user3683697: Просто выполните 'echo $ line | grep -Po ". * HWaddr \ K. * (. *)" ' – Inian

+0

@ user3683697: Также попробуйте использовать решение' bash' в моем ответе, не нужно использовать 'grep' или другие инструменты. – Inian

1

Если MAC-адрес является последним последовательность символов после того, как пространство, вы может удалить самое длинное совпадение с "* " (звездочка и пробел) с использованием чистого Bash:

echo "${line##* }" 

Вы также можете извлечь последние 17 символов из строки:

echo "${line: -17}" 

Если вы хотите, строгий матч на конце линии (из-за .*):

echo $(expr match "$line" '.*\(\([a-zA-Z0-9]\{2\}\:\)\{5\}[a-zA-Z0-9]\{2\}\)') 

Использование GNU grep:

grep -o -P '(?:[a-zA-Z0-9]{2}:){5}[a-zA-Z0-9]{2}' <<< "$line" 

В последнем случае вы можете добавить якорь $ для конца строки. Конечно, вам не нужно использовать эту строку. Возможно, вы захотите использовать трубу : echo "$line" | grep -o -P ....

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