На 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  "t" }'
tc0001   tomcat7.1
tc0001   tomcat7.2
tc0001   tomcat7.5

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

6 ответов


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

awk -F'[/=]' '{print  "\t"  "\t" }' file

выдает:

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

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

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

возвращает:

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

здесь:

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

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


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

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

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

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

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

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

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

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

Perl One-liner:

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

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

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

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

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

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

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

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


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

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

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


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

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