так что ответ (после того, как @YoMismo поставил меня на правильный путь )добавить еще одно правило iptables:
sudo iptables --table nat -A POSTROUTING -s 192.168.42.0/24 ! -d 192.168.42.0/24 -j MASQUERADE
Результат можно увидеть с помощью
sudo iptables -t nat -L -n -v
Подводя итоги :Добавьте маршрут на устройство, требующее доступа, следующим образом:
sudo ip route add 0.0.0.0/0 via 192.168.42.21 dev wlan0
192.168.42.21 — это IP-адрес «мостового» адаптера Wi-Fi на «маршрутизаторе Linux»
Затем добавьте правила iptables в «linux router» следующим образом:
sudo iptables -A FORWARD -d 192.168.42.0/24 -o wlx801f0281f02a -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -s 192.168.42.0/24 -i wlx801f0281f02a -j ACCEPT
sudo iptables -A FORWARD -i wlx801f0281f02a -o wlx801f0281f02a -j ACCEPT
sudo iptables --table nat -A POSTROUTING -s 192.168.42.0/24 ! -d 192.168.42.0/24 -j MASQUERADE
Опять же, wlx801f0281f02a — это интерфейс мостового ключа Wi-Fi, который я использую для подключения к сети 192.168.42.0/24.
Таким образом, интернет-запросы на устройстве-источнике направляются с использованием маршрута на устройстве-источнике на 192.168.42.21 на «маршрутизаторе Linux», где они проходят NAT и перенаправляются на шлюз.
Обратите внимание, что переадресация IP _уже включена.
Сделайте правила постоянными или поместите их в сценарий bash, если требование является временным/специальным.
Независимо от того, какой столбец присутствует ниже, команда будет выводить результат
awk -F "-" '{for(i=1;i<=NF;i++){if($i ~ /kim|tin|tintu/){print substr($i,4)}}}' filename
выход
kim
tin
tintu
Если все, что вы хотите получить, это строки kim
, tin
и tintu
из примера в вашем посте, вы можете сделать это, используя следующий:
cut -c 36- | sed "s/-.*//"
Вот пара примеров:
echo "xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramtintu-69b8c5b689-64fxw" | cut -c 36- | sed "s/-.*//"
выход:tintu
Для файла, содержащего данные из вашего поста:
cat file | cut -c 36- | sed "s/-.*//"
выход:
kim
tin
tintu
Вероятно, это очевидно, но это будет работать только в том случае, если строки всегда будут иметь символ 36
перед нужной строкой.
Это будет делать это для любой длины строки, при условии, что вы всегда хотите, чтобы слово происходит после последнего «барана» в строке:
sed 's/.*ram\(\w\+\).*/\1/' your_file
Это работает следующим образом:
.*ram
\(
и\)
\w\+
.*
\1
Убедившись, что он делает то, что вам нужно, просто добавьте -i
, если хотите. изменить файл напрямую:
sed -i 's/.*ram\(\w\+\).*/\1/' your_file
Для ясности, приведенное выше превратит это:
xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramkim-6b4c49f589-6hqcj
xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramtin-8d49b4dc7-bmvck
xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramtintu-69b8c5b689-64fxw
в это:
kim
tin
tintu
Обновление на основе ваших комментариев, я думаю, это сделает то, что вы хотите:
$ awk -F- '{
for (i=1;i<=NF;i++) {
if ($i ~ "^ram.+") { sub("^ram","",$i); print $i} }
}' kubectl.txt
kim
tin
tintu
На английском языке :для каждого поля каждой строки ввода, если значение поля соответствует регулярному выражению,^ram.+
(начинается с «ram», за которым следует как минимум еще один символ ), затем используйте sub (), чтобы удалить «ram» в начале поля и распечатать поле.
или в Perl:
$ perl -F- -lne 'foreach (@F) { print $1 if (m/^ram(.+)/) }' kubectl.txt
kim
tin
tintu
На английском языке :для каждого поля каждой строки, если поле соответствует регулярному выражению "^ram (.+ )", тогда напечатайте захваченную часть поля, соответствующую (.+)
sub -выражение (т.е. все после "^ram" ).
ПРИМЕЧАНИЕ. :Если шаблону соответствует несколько полей в строке, то все они будут напечатаны. Если вам нужно только первое такое поле, используйте next
, чтобы остановить обработку текущей строки и перейти к следующей :
awk -F- '{
for (i=1;i<=NF;i++) {
if ($i ~ "^ram.+") { sub("^ram","",$i); print $i; next } }
}' kubectl.txt
или
perl -F- -lne 'foreach (@F) { if (m/^ram(.+)/) { print $1; next } }' kubectl.txt
Я оставлю свои старые ответы ниже, потому что они могут быть полезны другим читателям с похожими вопросами:
Я точно не знаю, что вы хотите получить на выходе, поэтому вот несколько вариантов. Все они производят вывод только для строк, где поле 6($6
)начинается с содержимого поля 3 ("^" $3
). Все остальные строки игнорируются.
kubectl.txt
— это текстовый файл, содержащий образец kubectl get pods
вывода :
Подстрока поля 6, от символа 4 до конца поля:
$ awk -F- '$6 ~ "^" $3 { print substr($6,4) }' kubectl.txt
kim
tin
tintu
Поле 6 с удаленным с самого начала содержимым поля 3 с помощью sub()
. В отличие от приведенного выше примера, это несложно -закодировать для удаления первых 3 символов, поэтому работает с $3 любой длины.
$ awk -F- '$6 ~ "^" $3 { sub("^" $3,"",$6); print $6}' kubectl.txt
kim
tin
tintu
То же, что и выше, только с полями 7 и 8,разделенные пробелами:
$ awk -F- '$6 ~ "^" $3 { sub("^" $3,"",$6); print $6, $7, $8}' kubectl.txt
kim 6b4c49f589 6hqcj
tin 8d49b4dc7 bmvck
tintu 69b8c5b689 64fxw
То же, что и выше, но с разделителем -
.
$ awk -F- -vOFS=- '$6 ~ "^" $3 { sub("^" $3,"",$6); print $6, $7, $8}' kubectl.txt
kim-6b4c49f589-6hqcj
tin-8d49b4dc7-bmvck
tintu-69b8c5b689-64fxw
grep
иPCRE
grep -Po '(?<=-ram)[[:lower:]]+(?=-)' data
Извлекать любую последовательность из одного или нескольких символов нижнего регистра, только если им предшествует слово -ram
, а за ним следует-