1

У меня есть файл bash, вызывающий зону DNS, и я fqdn который мне нужно вывести в обратном порядке.

Фрагмент ниже делает это хорошо, за исключением того, что я получаю испытание . в конце, который я не хочу создавать импорт, CSV (запятая) формат:

... | awk -F'.' '{for (i=NF;i>0;i--){printf $i"."};printf "\n"}' 

пример источника:

abc.def,ghi.com
hjd.dhjs.dhuj.oiuehj.ksjdhf.com

желаемые результаты:

com.ghi.def.abc
com.ksjdhf.oiuehj.dhuj.dhjs.hjd

текущие результаты:

com.ghi.def.abc.
com.ksjdhf.oiuehj.dhuj.dhjs.hjd.

2 ответа2

2

Вот один из подходов:

awk -F'.' '{for (i=NF;i>1;i--){printf $i"."};print $1}' 

Пример использования:

$ echo abc.def.ghi.com | awk -F'.' '{for (i=NF;i>1;i--){printf $i"."};print $1}' 
com.ghi.def.abc

Объяснение:

  • for (i=NF;i>1;i--){printf $i"."

    Это печатает части в обратном порядке, начиная с $NF и заканчивая $2 (второе поле), за каждой частью следует точка.

  • print $1

    Это печатает последнюю часть без завершающего периода. Поскольку здесь используется print , а не printf , нет необходимости в явном переводе строки.

альтернатива

Для разнообразия вот еще одно решение:

awk -F'.' '{s=""; for (i=NF;i>0;i--){s=s"."$i};print substr(s,2)}'

При этом используется та же логика, что и в оригинальном сообщении: один цикл по всем частям. Однако вместо того, чтобы печатать на каждом шаге, это сохраняет желаемый результат в строку s . В конце он печатает s за исключением последнего символа, который был бы лишним периодом.

Альтернатива с использованием tac а не awk

$ echo abc.def.ghi.com | tr '.' '\n' | tac | tr '\n' '.' | sed 's/\.$/\n/'
com.ghi.def.abc

Или еще проще:

$ echo  abc.def.ghi.com | tac -s'[.\n]' 
abc.def.ghi.com
0

Вы также можете использовать printf с другой переменной: символ для печати после каждого поля.

$ awk -F"[.,]" '{for (i=NF;i>0;i--) printf "%s%s", $i, (i==1?"\n":".")}' file
com.ghi.def.abc
com.ksjdhf.oiuehj.dhuj.dhjs.hjd
  • -F"[.,]" Устанавливает разделитель полей на либо . , Таким образом, каждое отдельное слово будет считаться отдельным полем.
  • (i==1?"\n":".") означает: если i равен 1 , тогда используйте \n ; в противном случае используйте . ,

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .