Для разделения полей используйте обратный слеш или одинарные кавычки

Арифметическая команда считается успешной, если значение арифметического выражения не равно нулю. Если значение выражения равно 0, команда завершается ошибкой со статусом 1.Это позволяет использовать арифметические команды в тестах, поскольку логические операторы в арифметических выражениях оболочки возвращают 0 для истины и 1 для false (как в C). Например,

if ((x==3)); then …

работает, потому что ((x == 3)) возвращает 0, когда $ x равно 3, и 1 в противном случае.

Оператор постфиксного приращения возвращает старое значение переменной. Итак, ((var ++)) возвращает статус ошибки, если var ранее был равен нулю.

set -e указывает оболочке завершить работу при первой неудачной команде. Никаких сюрпризов.

Чтобы избежать нежелательных ошибок, возникающих из-за арифметических выражений, которые на законных основаниях могут иметь значение 0, не используйте арифметические команды, используйте обычное присваивание с арифметическим выражением.

var=$((var+1))
4
25.05.2019, 20:23
2 ответа

Это все связано с вашей оболочкой, а не с awk.

В Bourne -, как и в оболочках, \, '...'и "..."являются операторами кавычек.

Заключение в кавычки удаляет особое значение, которое символ может иметь в синтаксисе оболочки. \заключает в кавычки один символ (, за исключением символа новой строки, который вместо этого удаляется ), '...'и "..."может заключать в кавычки более одного (с "...", а не заключает в кавычки каждый символ ).

;— это специальный символ в синтаксисе оболочки. Он используется для разделения команд. Вам нужно заключить его в кавычки, если вы хотите дословно передать его команде. \;, ';'подойдут.

";"также подойдет, так как ;не является одним из тех символов, которые все еще являются специальными в двойных кавычках, но вам потребуется "\\", чтобы передать одну буквальную обратную косую черту команде, потому что \является одним из тех символов, которые по-прежнему являются особыми внутри "..."(, хотя тогда они становятся особенными только тогда, когда за ними следуют другие специальные символы внутри "...", такие как сам ").

Опять же, очень многое зависит от оболочки. Например, в оболочке rc\и "не являются специальными, не говоря уже о кавычках, -F\;не будет работать там, поскольку команда будет анализироваться как команды awk -F\и ..., разделенные с ;.

См. Как использовать специальный символ как обычный? для получения более подробной информации.

Чтобы еще больше усложнить ситуацию,обратите внимание, что сам аргумент -Fтакже проходит через один или два уровня обработки обратной косой черты с помощью awk .

awkсначала обрабатывает полученный аргумент, чтобы расширить в нем escape-последовательности ANSI C. Если вы используете awk -F '\t', или awk -F \\t, или awk -F "\\t", или awk -F "\t", awkполучает аргумент, содержащий \t, который расширяется до символа TAB. Переменная FSawk будет содержать символ TAB, а не \t.

С помощью awk -F '\\'awkполучает аргумент \\и устанавливает FSв символ \. Строго говоря, awk -F '\'will не определено, так как эта escape-последовательность не завершена, но на практике, за исключением busybox awk, все известные мне реализации awkобрабатывают ее так же, как awk -F '\\'.

В awk, когда FSсодержит один символ, этот символ является разделителем полей. awk -F.разбивает записи на точечные символы.

Однако, когда FSсодержит более одного символа, оно интерпретируется как регулярное выражение. awk -F..распространяется не на последовательности из двух точек, а на последовательности из любых двух символов, поскольку .— это оператор регулярного выражения, который соответствует любому одиночному символу. Чтобы разделить на две точки, вам понадобится awk -F '[.][.]'или awk -F '\\.\\.'.

С awk -F '\\\\'литерал \\\\передается оболочкой в ​​awk, awkрасширяет каждый из этих двух \\в \, так что FSстановится \\, что является рассматривается как регулярное выражение. \также имеет особое значение в синтаксисе регулярных выражений и на этот раз используется для удаления специального значения символа в качестве оператора регулярного выражения . Итак, опять же, это разбиение на символы обратной косой черты, но на этот раз в виде регулярного выражения.

Так вот, на практике для разделения на \все эти (в борне -как снаряды )будут работать:

awk -F '\'      # FS becomes a single \ except in busybox where it's empty
awk -F "\\"     # instead so it's a one-character split on backslash
awk -F \\       # and a one-field-by-character split in busybox

awk -F '\\'     # FS becomes a single \ in every awk implementation
awk -F \\\\     # so one-character split on backslash
awk -F "\\\\"

awk -F '\\\'    # FS is \ on busybox and \\ in other implementations
awk -F \\\\\\   # so one-character split on backslash in busybox and
awk -F "\\\\\\" # \\ regex split in other implementations, to the same effect

awk -F '\\\\'     # FS is \\ in all implementations so
awk -F \\\\\\\\   # \\ regex split
awk -F "\\\\\\\"

Я бы посоветовал использовать одинарные кавычки, так как это самый простой и наименее неожиданный вид кавычек. Итак, переносимое разделение на обратную косую черту:awk -F '\\'.

Вы также можете делать такие вещи, как:

 awk -v FS='\\'...

или

 awk 'BEGIN{FS="\\"}...'

или

awk... 'FS=\\'

или:

FS='\' awk 'BEGIN{FS = ENVIRON["FS"]}...'

(, что позволяет избежать дополнительной обратной косой черты, выполняемой awk, поэтому требуется только одна обратная косая черта ).

8
27.01.2020, 20:47

Все символы в одинарных кавычках обрабатываются буквально (, т. е. между парой одинарных кавычек нет специальных символов ). Без одинарных кавычек вам нужно использовать обратную косую черту -для экранирования символа со специальным значением, если вы хотите использовать буквальный символ.

Это правила цитирования оболочки, не связанные с awk.

4
27.01.2020, 20:47

Теги

Похожие вопросы