Извлечение текста с помощью sed не работает так, как ожидалось

Извлечение текста с помощью sed не работает так, как ожидалось

Я только начинаю использовать его sedи собираюсь использовать для извлечения IP-адресов из pingвыходных данных. Вот чего я пытаюсь добиться:

введите текст:

ytmti (192.188.2.3) jjggy

желаемый результат:

192.188.2.3

Команда, которую я пробую:

echo "ytmti (192.188.2.3) jjggy" | sed 's:\((\(192.188.2.3\))\):\2:' 

выходной ток:

ytmti 192.188.2.3 jjggy

Примечание: ytmtiи jjggyна самом деле являются заменителями текста типа Pinging unix.stackexchange.comи with 32 bytes of data:.

Я думаю, что использование awkможет быть лучшим решением для анализа pingвыходных данных, но мне хотелось бы привыкнуть к sed.

решение1

Команда подстановки sedзаменяет все символы, совпадающие в первом разделе, на все символы второго раздела, поэтому вам понадобится .*или подобная и сгруппируйте только ту часть, которую нужно сохранить, например:

echo " ytmti (192.188.2.3) jjggy" | sed 's:^.*(\([^)]*\).*$:\1:'

Обратите внимание, что я использую [^)]*это, избегая жесткого кодирования IP и обобщения его для любого из них. Это дает:

192.188.2.3

решение2

Использование переменной-разделителя полей в awk:

echo "ytmti (192.188.2.3) jjggy" | awk -F'[)(]' '{print $2}'                                                                                              
192.188.2.3

решение3

Вы также можете сделать:

echo 'ytmti (192.188.2.3) jjggy' | tr -dc '0-9.'

Связанный контент