[
— это другое название встроенной команды test
, см. здесь и здесь , также это .
Эта последовательность из if
операторов, вероятно, была бы лучше в виде цикла. В Bash мы могли бы использовать косвенное расширение:
for ((i=1 ; i <= 10 ; i++)) ; do
if [ -n "${!i}" ] ; then
echo "${!i}"
fi
done
Вероятно, более распространенной идиомой было бы использование shift
на каждой итерации, но это уничтожает список аргументов.
Кроме того, цитирование :здесь $0
находится вне кавычек. В большинстве случаев более полезно держать все расширения переменных в кавычках, если вы явно не хотите слово -разбиение и расширение имени файла.
echo "Name of this script: "$0""
Так что скорее пиши:
echo "Name of this script: $0"
Вы получаете $3
-, однако по умолчанию awk игнорирует начальные и конечные пробелы при разбиении записи на поля.
Вы должны иметь возможность заставить его рассматривать начальный пробел как пустое поле, явно установив разделитель полей ex.
$ cat clusters | awk -F'[ \t]+' '{print $3}'
STATE
active
active
active
тогда как
$ cat clusters | awk '{print $3}'
STATE
active
prod-cluster
dev-cluster
awk разбивает строки на основе разделителя (по умолчанию используется один или несколько пробелов, то есть табуляция или пробелы ). Чтобы было понятнее, вот ваши данные с данными, разделенными|
CURRENT|ID|STATE|NAME|PROVIDER
*|abcd|active|test-cluster|Imported
efgh|active|prod-cluster|Imported
xyzd|active|dev-cluster|Imported
Как вы можете видеть выше, в первой строке $1
— это CURRENT
, $2
— это ID
и так далее. Во второй строке $1
— это *
, $2
— это abcd
и т. д. Однако в третьей строке $1
— это efgh
, что соответствует столбцу ID. Поскольку в столбце ТЕКУЩИЙ нет ничего, кроме пробела, он игнорируется awk, и поэтому $3
показывает ИМЯ для строк 3 и 4.
Что вам нужно сделать, так это удалить первый столбец, прежде чем отправлять его в awk. Следующая команда должна сделать это за вас.
rancher clusters | cut -b 8- | awk '{ print $3 }'
Команда cut
в приведенном выше конвейере удалит первые 7 байтов в каждой строке и напечатает остальные в STDOUT.Это приведет к тому, что awk
не будет путаться из-за разного количества столбцов в каждой строке.
awk по умолчанию разделяет записи на поля на основе непрерывных последовательностей пробелов и игнорирует начальные конечные пробелы. Поскольку ваше первое «поле» иногда пусто, для awk его не существует. Учитывая это, есть несколько способов вывести столбец NAME, самый простой из которых — считать поля с конца записи, а не с ее начала :
.$ awk '{print $NF}' file
PROVIDER
Imported
Imported
Imported
$
$ awk '{print $(NF-1)}' file
NAME
test-cluster
prod-cluster
dev-cluster
$
$ awk '{print $(NF-2)}' file
STATE
active
active
active
$
$ awk '{print $(NF-3)}' file
ID
abcd
efgh
xyzd
$
$ awk '{print (NF>4 ? $(NF-4) : "")}' file
CURRENT
*
$
Вам нужно выполнить некоторые математические операции с последним, чтобы $(NF-4)
не приводило к печати $0
, когда NF равно 4. Вы можете вычислить предполагаемое количество полей вместо жесткого -кодирования 4 путем подсчета сколько полей в строке заголовка:
$ awk 'NR==1{max=NF-1} {print (NF>max ? $(NF-max) : "")}' file
CURRENT
*
$
Проблема в том, что иногда вывод вашей команды rancher
имеет 5 полей на строку, а иногда 4.
Следующий вкладыш awk one -будет печатать правильное поле в зависимости от того, сколько полей (использует встроенная awk -переменнаяNF
)в любой заданной строке ввода:
$ awk 'NF==5 {print $4}; NF==4 {print $3}' clusters.txt
NAME
test-cluster
prod-cluster
dev-cluster
В качестве альтернативы, если вы можете быть уверены, что пустых строк не будет, вы можете использовать:
$ awk '{print $(NF-1)}' clusters.txt
NAME
test-cluster
prod-cluster
dev-cluster
Если есть пустая строка, вы получите сообщение об ошибке, подобное этому:
awk: cmd. line:1: (FILENAME=clusters.txt FNR=5) fatal: attempt to access field -1
Этого можно избежать с помощью:
awk 'NF>=1 {print $(NF-1)}' clusters.txt