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

Ну, у меня другое мнение:

a:~# nc -luk 10.12.0.12 667 // listen on UDP port 667
b:~# nc -uv 10.12.0.12 667  // check if port is open 
nc: 10.12.0.12 (10.12.0.12) 667 [667] open
I love stackexchange // send a message
a:~# nc -luk 10.12.0.12 667
I love stackexchange // receive the message.

Таким образом, на основе этого вы можете проверить, возможно ли соединение между a и b на этом порту udp. Позже вы можете продолжить проверку с помощью tcpdump.

5
13.05.2019, 20:50
5 ответов

Это извлечет все символы перед последним «двоеточием» и удалит скобки [ ] как в приведенном вами примере.

rev <yourfile.txt | cut -d: -f2- | rev | tr -d '[]'

Замените yourfile.txt на имя вашего файла или удалите слово <yourfile.txt, чтобы прочитать стандартный вывод.

3
27.01.2020, 20:32

awk -F: '{OFS=":"; NF--; print $0}' $file

или

cat file | awk -F: '{OFS=":"; NF--; print $0}'

, который разбивается на:

  • -F:установить разделитель полей ввода на:
  • OFS=":"установить разделитель полей вывода на:
  • NF--уменьшить количество полей на 1 (убрать последнее поле)
  • print $0распечатать остальные записи, разделенные символом OFS (:).

Обновление для удаления квадратных скобок:

awk -F: '{OFS=":"; NF--; gsub(/\[|\]/, ""); print $0}' $file

  • добавлен gsub(/\[|\]/, "")1, который выполняет глобальную замену квадратных скобок, заменяя их ничем и возвращая замененную строку.
2
27.01.2020, 20:32

Удалите все после последнего двоеточия, а затем все скобки, оставшиеся где угодно:

sed 's/:[^:]*$//; s/[][]//g'

Или

sed 's/\(.*\):.*/\1/; s/[][]//g'

(здесь используется тот факт, что первый .*будет жадным и проглотит как можно больше :s ).

10
27.01.2020, 20:32

Только оболочка:

while IFS= read -r line; do
    tmp=${line%:*}               # remove last colon and following chars
    tmp=${tmp#"["}               # remove leading open bracket
    result=${tmp%"]"}            # remove trailing close bracket
    printf "%s\n" "$result"
done < file
2
27.01.2020, 20:32

Команда:

awk -F ":" 'OFS=":"{$NF="";print $0}' filename | sed "s/:$//g"| sed "s/^\[//g"|sed "s/\]//g"

выход

256.XXX.XXX.X
214.XXX.XXX.X
2200:XXXX:XXXX:XXX:XXXX:XXXX:XXXX:XXXX
0
27.01.2020, 20:32

Теги

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