Ответ 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
У меня есть файл, который содержит следующие строки:
/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
для извлечения поля?
Разделитель может быть регулярным выражением.
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
Хорошие новости! Разделитель полей 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
Если ваш пробел согласован, вы можете использовать его как разделитель, а вместо того, чтобы напрямую вставлять \t
, вы можете установить разделитель вывода, и он будет включен автоматически:
< file awk -v OFS='\t' -v FS='[/ ]' '{print $3, $5, $NF}'
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.
Для разделителя полей любого числа 2
через 5
или буквы a
или #
или пробела, где разделительный символ должен повторяться как минимум 2 раза и не более 6 раз, например
awk -F'[2-5a# ]{2,6}' ...
Я уверен, что вариации этого существуют с использованием() и параметров
Я вижу, что на доске есть много прекрасных ответов, но все равно хотелось бы загрузить и мою часть кода,
awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'