Воспроизведенный из этого теперь закрытого как повторяющегося вопроса, поскольку он содержит предупреждения об ограничениях передачи переменных awk, которые могут оказаться полезными.
Переменная оболочки - это всего лишь переменная оболочки . Если вы хотите превратить его в переменную awk , вам нужен такой синтаксис:
awk -v x="$x" '$2 == x {print $1}' infile
или
awk '$2 == x {print $1}' x="$x" infile
Однако они страдают от проблемы: в них расширяются escape-последовательности (и в GNU awk
4.2 или выше, если $x
начинается с @/
и заканчивается /
, это рассматривается как переменная типа regexp ).
Так, например, если переменная оболочки содержит два символа обратной косой черты и n , переменная awk в конечном итоге будет содержать символ новой строки (и с gawk 4.2+, если она содержит @/foo/
, переменная awk будет содержать foo
и иметь тип regexp
).
Другой подход (но для которого -v
требуется awk или nawk POSIX (в отличие от awk 1970-х годов, все еще найденного как /bin/awk
в Solaris)) - это использование переменных среды:
x="$x" awk '$2 == ENVIRON["x"] {print $1}' infile
Другой подход (все еще с более новыми awk) заключается в использовании массива ARGV в awk:
awk 'BEGIN {x = ARGV[1]; delete ARGV[1]}
$2 == x {print $1}' "$x" infile
awk
расширяются C-подобные escape-последовательности$1
, поэтому этот подход не работает, если он$1
может содержать символы обратной косой черты (общие для регулярных выражений).ENVIRON
Вместо этого вы можете использовать специальный массив awk.