Если ваша версия awk
поддерживает регулярные выражения в качестве разделителя полей, вы можете сделать это:
$ awk -F'[/.]' '{print $5}' oratab
11
9
в качестве альтернативы, если хотите имя базы данных также напечатано:
$ awk -F'[:/.]' '{print $1,$6}' oratab
dbname1 11
dbname2 9
Я не уверен, что версии awk
для Solaris или AIX поддерживают регулярные выражения в качестве разделителя полей. GNU awk
делает. То же самое и с версией FreeBSD. mawk
и original-awk
тоже.
Это должно работать на Solaris awk
(должно работать на любом awk
):
awk -F'/' '/^#/ {next}; /kmad/ {sub(/\..*/,"",$5);print $5}' /etc/oratab
Он пропускает строки, начинающиеся с комментария #
, а затем ( для всех строк, содержащих kmad
), он удаляет все, начиная с первого .
и далее от поля 5, а затем печатает это поле.
И если у вас есть действительно странная awk
, которая не понимает ни регулярных выражений в разделителе полей, ни оператора next
, попробуйте следующее:
awk -F'/' '! /^#/ && /kmad/ {sub(/\..*/,"",$5);print $5}' /etc/oratab
и если ваш awk
не имеет sub ()
, значит, это не awk
, это додо . Закопайте его и получите настоящую awk
.
Bash вообще не интерпретирует аргумент -
. Это просто соглашение, реализуемое многими программами.
Вы обычно видите это, когда программа обычно работает с файлами, поэтому им нужна какая-то текстовая строка, которая вряд ли будет именем файла для использования, когда вы хотите, чтобы она работала с stdin
/ stdout
вместо этого.
Маловероятно, что вы столкнетесь с системой с файлом, специально названным -
, потому что это стандартный символ параметра в Unix. Но поскольку на самом деле разрешено называть файл -
- или, в более общем смысле, любой файл , начинающийся с -
- многие программы, которые понимают -
аргумент также понимает параметр -
, означающий «остановить параметры обработки». Это позволяет вам делать такие вещи, как удаление файла с именем -
:
$ rm -- -
Насколько мне известно, это не конструкция bash, а соглашение.
Приложения используют -
для обозначения чтения из стандартного ввода или записи в стандартный вывод вместо фактического файла или записи / dev / stdin / dev / стандартный вывод.