У меня есть файл, который содержит следующие строки:
/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 " "
на-F "[ ]"
иawk
больше не глотал пустые поля.Ответы:
Разделитель может быть регулярным выражением.
Производит:
источник
cat
процесс не требуетсяawk '...' file
. Кроме того, было бы лучше использовать разделитель выходного поля:awk -F'[/=]' -v OFS="\t" '{print $3, $5, $8}'
|
: ex:awk -F 'this|that|[=/]' '......'
(полезно, чтобы слова / строки разделяли вещи) (обратите внимание, что это сохраняет пробелы в полях между двумя разделителями. Добавление также|[ \t]+
может быть полезно, но может сделать вещи хитрый ... так как часто есть пробелы до и после 'this', это заставит 2 дополнительных пустых поля появиться между пробелом (ами) и 'this')Хорошие новости!
awk
Разделитель полей может быть регулярным выражением. Вам просто нужно использовать-F"<separator1>|<separator2>|..."
:Возвращает:
Вот:
-F"/|="
устанавливает разделитель поля ввода в либо/
или=
. Затем он устанавливает разделитель выходного поля на вкладку.-vOFS='\t'
использует-v
флаг для установки переменной.OFS
переменная по умолчанию для разделителя полей вывода, и она установлена на символ табуляции. Флаг необходим, потому что нет встроенного для OFS, как-F
.{print $3, $5, $NF}
печатает 3-е, 5-е и последнее поля на основе разделителя поля ввода.Смотрите другой пример:
Этот файл имеет два разделителя полей
#
и_
. Если мы хотим напечатать второе поле независимо от того, является ли разделитель одним или другим, давайте сделаем оба разделителями!Где файлы нумеруются следующим образом:
источник
Если ваш пробел соответствует, вы можете использовать его в качестве разделителя, также вместо
\t
прямой вставки вы можете установить разделитель вывода, и он будет включен автоматически:источник
Для разделителя полей любого числа
2
через5
или буквуa
или#
или пробел, где разделительный символ должен повторяться не менее 2 раз и не более 6 раз, например:Я уверен, что вариации этого существуют с использованием () и параметров
источник
Perl однострочный:
Эти параметры командной строки используются:
-n
зацикливать каждую строку входного файла, помещать строку в$_
переменную, автоматически не печатать каждую строку-l
удаляет символы новой строки перед обработкой и добавляет их обратно после-a
Режим автоматического разделения - Perl автоматически разбивает входные строки в@F
массив. По умолчанию расщепление по пробелам-F
Модификатор AutoSplit, в этом примере , расщепляется на любой/
или=
-e
выполнить код PerlPerl тесно связан с awk, однако
@F
массив autosplit начинается с индекса,$F[0]
а поля awk начинаются с $ 1.источник
Другой вариант - использовать опцию -F, но передать ее через регулярное выражение, чтобы напечатать текст между левой и / или правой круглой скобкой
()
.Содержание файла:
Команда:
результат:
Использование awk, чтобы просто напечатать текст между
[]
:Используйте,
awk -F'[][]'
ноawk -F'[[]]'
не будет работать.http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html
источник
Я вижу много идеальных ответов на доске, но все же хотел бы загрузить свой кусок кода тоже,
awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'
источник
print $3 " " $5 " " $7
может быть напечатан так же, какprint $3, $5, $7
. Кроме того, я не вижу преимущества использования awk и последующего использования sed. В общем, awk может быть достаточно, и другие ответы показывают это.