На 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'