Разбор файлов в bash

У меня есть текстовый файл с содержанием ниже:

Hostname=Hostname2,Hostname3

используя команды bash, как я могу извлечь только Hostname2 и Hostname3 в отдельный файл. Я хочу, чтобы Hostname2 и Hostname3 находились в разных строках. Иногда в текстовом файле может быть больше двух хостов, Hostname=Hostname2,Hostname3,Hostname4 тогда мне придется извлечь все 3 хоста в отдельный файл. Как это можно сделать в bash?


person Prarthana    schedule 02.03.2018    source источник
comment
Вы пробовали использовать sed для разделения по равным, а затем по запятым?   -  person developer    schedule 02.03.2018
comment
поделитесь, пожалуйста, своими усилиями!   -  person Gilles Gouaillardet    schedule 02.03.2018


Ответы (2)


egrep -o '[^=,]+' /path/to/file | tail -n +2 > /path/to/new\ file

Объяснение

egrep: средство поиска шаблонов файлов, которое позволяет выполнять поиск в содержимом файлов и сопоставление строк с помощью регулярных выражений.

-o: параметр для egrep, который указывает ему печатать только совпадающие части строки, а не всю строку.

'[^=,]+': регулярное выражение, используемое для сопоставления содержимого файла. Здесь [^=,]+ обозначает любой символ, который не = или , встречается хотя бы один раз подряд. Проще говоря, он соответствует словам, разделенным либо =, либо ,.

Результат выполнения команды egrep:

Hostname
Hostname2
Hostname3
Hostname4

|: Передайте результаты предыдущей команды (egrep) в следующую команду:

tail -n +2: принимает ввод и начинает с строки +2 относительно начала (то есть второй строки) и печатает оставшиеся строки.

Принимая выходные данные предыдущей команды в качестве входных данных, результат tail:

Hostname2
Hostname3
Hostname4

>: Наконец, это перенаправляет вывод предыдущей команды и записывает его в указанный файл.

person CJK    schedule 02.03.2018

Вы можете использовать awk для печати второго «поля» (единственной) строки, указав ему использовать = в качестве «разделителя полей» с опцией -F. Результат awk: «Имя хоста2, имя хоста3».

Затем можно использовать утилиту tr ("перевод") для замены всех запятых на новые строки. Результат распечатывается в стандартном формате, чтобы ваша оболочка могла перенаправить его в файл через >.

awk -F= '{print $2}' file | tr ',' '\n' > hostnames.txt
person Lohmar ASHAR    schedule 02.03.2018
comment
Вы можете использовать cut -d= -f2 вместо этого awk или, в качестве альтернативы, выполнить замену в awk gsub(/,/, "\n", $2) перед печатью вместо того, чтобы передавать по конвейеру tr. - person Tom Fenech; 02.03.2018