Извлечение подстрок из вывода команды

так что ответ (после того, как @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, если требование является временным/специальным.

-1
22.05.2021, 19:39
5 ответов

Независимо от того, какой столбец присутствует ниже, команда будет выводить результат

awk -F "-" '{for(i=1;i<=NF;i++){if($i ~ /kim|tin|tintu/){print substr($i,4)}}}' filename

выход

kim
tin
tintu
1
28.07.2021, 11:30

Если все, что вы хотите получить, это строки 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перед нужной строкой.

1
28.07.2021, 11:30

Это будет делать это для любой длины строки, при условии, что вы всегда хотите, чтобы слово происходит после последнего «барана» в строке:

sed 's/.*ram\(\w\+\).*/\1/' your_file

Это работает следующим образом:

  • Я ищу все до последнего вхождения слова 'ram'.*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
2
28.07.2021, 11:30

Обновление на основе ваших комментариев, я думаю, это сделает то, что вы хотите:

$ 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
3
28.07.2021, 11:30

grepиPCRE

grep -Po '(?<=-ram)[[:lower:]]+(?=-)' data

Извлекать любую последовательность из одного или нескольких символов нижнего регистра, только если им предшествует слово -ram, а за ним следует-

1
28.07.2021, 11:30

Теги

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