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выполнить код perlPerl тесно связан с awk, однако,
@Fautosplit массив начинается с индекса$F[0]в то время как awk поля начинаются с $1.