Каков переносимый способ получить адрес источника маршрута по умолчанию?

Это известный ( 1 , ​​2 , 3 , 4 , 5 , 6 ) ограничение реализации GNU tr .

Дело не в том, что он не поддерживает чужие , неанглийские или не-ASCII символы, но и в том, что он не поддерживает многобайтовые символы.

Эти кириллические символы будут обрабатываться нормально, если они записаны в наборе символов iso8859-5 (однобайтовый на символ) (и ваша локаль использовала эту кодировку), но ваша проблема в том, что вы используете UTF-8, где символы, отличные от ASCII, кодируются двумя или более байтами.

У GNU есть план (см. также ), чтобы исправить это, и работа ведется, но еще не закончена.

FreeBSD или Solaris tr не имеют проблемы.


Между тем, для большинства случаев использования tr вы можете использовать GNU sed или GNU awk, которые действительно поддерживают многобайтовые символы.

Например, ваш:

tr -cs '[[:alpha:][:space:]]' ' '

может быть записан:

gsed -E 's/( |[^[:space:][:alpha:]])+/ /'

или:

gawk -v RS='( |[^[:space:][:alpha:]])+' '{printf "%s", sep $0; sep=" "}'

Для преобразования между нижним и верхним регистром ( tr '[: upper:]' '[: lower:]' ):

gsed 's/[[:upper:]]/\l&/g'

(что l - это строчная L , а не цифра 1 ).

или:

gawk '{print tolower($0)}'

Для переносимости другой альтернативой является perl :

perl -Mopen=locale -pe 's/([^[:space:][:alpha:]]| )+/ /g'
perl -Mopen=locale -pe '$_=lc$_'

Если вы знаете, что данные могут быть представлены в однобайтовом наборе символов, вы можете обработать их в этой кодировке:

(export LC_ALL=ru_RU.iso88595
 iconv -f utf-8 |
   tr -cs '[:alpha:][:space:]' ' ' |
   iconv -t utf-8) < Russian-file.utf8

5
13.02.2018, 14:49
2 ответа

Sobre la base de la intención real (para encontrar la IP de salida original )y las respuestas hechas, aquí hay (un trazador de líneas bastante largo )uno -que debería funcionar:

ip route get 8.8.8.8 oif $(ip route | sed -n '/^default/s/^.* dev \([^ ][^ ]*\) *.*$/\1/p')  | sed -n 's/^.* src \([^ ][^ ]*\) *.*$/\1/p'

1er paso dentro de$():obtenga la ruta predeterminada, recupere solo su interfaz después de la palabra clave dev(porque dependiendo de las condiciones que pueden depender o no de la distribución, la ruta mostrará o no la IP de origen en este paso)

2do paso :obtener una ruta a una dirección IP pública "bien conocida" que no debe tener una configuración de ruta especial que la altere, pero que solicite usar la interfaz recuperada anterior, por lo que en realidad le pide al kernel que use el original real ruta predeterminada enterrada bajo 0.0.0.0/1y 128.0.0.0/1para hacer el cálculo. Recuperar la IP después de la palabra clave src

1
27.01.2020, 20:32

В моем сценарии (настройка док-контейнера для правильного получения IP-адреса хоста )я решил так:

ip route|awk '/src/ { print $7 }'
0
16.10.2020, 19:45

Теги

Похожие вопросы