Многократный разделитель AWK

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

/logs/tc0001/tomcat/tomcat7.1/conf/catalina.properties:app.env.server.name = demo.example.com
/logs/tc0001/tomcat/tomcat7.2/conf/catalina.properties:app.env.server.name = quest.example.com
/logs/tc0001/tomcat/tomcat7.5/conf/catalina.properties:app.env.server.name = www.example.com

В вышеприведенном выходе я хочу извлечь 3 поля (число 2, 4 и последнее *.example.com). Я получаю следующий вывод:

cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001   tomcat7.1
tc0001   tomcat7.2
tc0001   tomcat7.5

Как мне также извлечь последнее поле с именем домена, которое после '='? Как использовать multiple delimiter для извлечения поля?

Ответ 1

Разделитель может быть регулярным выражением.

awk -F'[/=]' '{print $3 "\t" $5 "\t" $8}' file

Выдает:

tc0001   tomcat7.1    demo.example.com  
tc0001   tomcat7.2    quest.example.com  
tc0001   tomcat7.5    www.example.com

Ответ 2

Хорошие новости! Разделитель полей awk может быть регулярным выражением. Вам просто нужно использовать -F"<separator1>|<separator2>|...":

awk -F"/|=" '{print $3, $5, $NF}' file

Возврат:

tc0001 tomcat7.1  demo.example.com
tc0001 tomcat7.2  quest.example.com
tc0001 tomcat7.5  www.example.com

Здесь:

  • -F="/|=" задает разделитель полей ввода как /, так и =. Затем он устанавливает разделитель выходного поля на вкладку.

  • {print $3, $5, $NF} печатает 3-е, 5-е и последние поля на основе разделителя полей ввода.


См. другой пример:

$ cat file
hello#how_are_you
i#am_very#well_thank#you

В этом файле есть два разделителя полей, # и _. Если мы хотим напечатать второе поле независимо от того, что разделитель является тем или иным, пусть оба являются разделителями!

$ awk -F"#|_" '{print $2}' file
how
am

Если файлы пронумерованы следующим образом:

hello#how_are_you           i#am_very#well_thank#you
^^^^^ ^^^ ^^^ ^^^           ^ ^^ ^^^^ ^^^^ ^^^^^ ^^^
  1    2   3   4            1  2   3    4    5    6

Ответ 3

Если ваш пробел согласован, вы можете использовать его как разделитель, а вместо того, чтобы напрямую вставлять \t, вы можете установить разделитель вывода, и он будет включен автоматически:

< file awk -v OFS='\t' -v FS='[/ ]' '{print $3, $5, $NF}'

Ответ 4

Perl однострочный:

perl -F'/[\/=]/' -lane 'print "$F[2]\t$F[4]\t$F[7]"' file

Эти параметры командной строки используются:

  • -n обведите вокруг каждой строки входного файла, поместите строку в переменную $_, не печатайте автоматически каждую строку

  • -l удаляет новые строки перед обработкой и добавляет их обратно

  • -a автоматический режим - perl автоматически разделяет входные строки в массив @F. По умолчанию разделение на пробелы

  • -F модификатор autosplit, в этом примере разбивается на / или =

  • -e выполнить код perl

Perl тесно связан с awk, однако массив autosplit @F начинается с индекса $F[0], тогда как awk-поля начинаются с $1.

Ответ 5

Для разделителя полей любого числа 2 через 5 или буквы a или # или пробела, где разделительный символ должен повторяться как минимум 2 раза и не более 6 раз, например

awk -F'[2-5a# ]{2,6}' ...

Я уверен, что вариации этого существуют с использованием() и параметров

Ответ 6

Я вижу, что на доске есть много прекрасных ответов, но все равно хотелось бы загрузить и мою часть кода,

awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'