2016-09-16 2 views
1

У меня есть этот файл с 20k + IP-адреса внутри:Split разделенных запятыми строк в Bash

104.20.15.220,104.20.61.219,104.20.62.219,104.20.73.221,104.20.74.221,104.20.14.220 
104.20.15.220,104.20.73.221,104.20.74.221,104.25.195.107,104.25.196.107,104.20.14.220 
91.215.154.209 
... 

Вопрос заключается в том, чтобы разделить на на отдельные IP-адреса на каждой строке:

104.20.15.220 
104.20.61.219 

ответ

8

Просто замените запятую с новой строки с любой из этих команд:

tr ',' '\n' < file 

sed 's/,/\n/g' file 

perl 's/,/\n/g' file 

awk 'gsub(/,/,"\n")' file 

... или соответствовать каждый блок текста до запятой или конец строки:

grep -oP '.*?(?=,|$)' file 

... или loo р через поля и напечатать их:

awk -F, '{for(i=1;i<=NF;i++) print $i}' file 

... или установить разделитель для запятой и пусть awk делать всю работу:

awk -v RS=, '1' file 
awk 1 RS=, file 

... или соответствовать IP-адреса, вы можно использовать регулярное выражение из Matching IPv4 Addresses:

grep -oE '((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file 

все они возвращаются:

104.20.15.220 
104.20.61.219 
104.20.62.219 
104.20.73.221 
... 
+1

последняя команда AWK является удивительным –

+1

Если вы хотите сделать его еще короче, вы можете пойти на 'AWK 1 RS =, File' –

+1

можно добавить несколько способов:.?' Grep -op»* (= , | $) '',' grep -oP' (\ d {1,3} \.) {3} \ d {1,3} '',' perl -pe' s /,/\ n/g ' 'и т. д. :) – Sundeep

2

Это превратит все команды в новую строку.

tr ',' '\n' <filename 

или

awk 'BEGIN{FS=",";OFS="\n"}{$1=$1}1' filename 
Смежные вопросы