Как использовать регулярное выражение в качестве разделителя полей в awk?

16

Я пытаюсь использовать регулярное выражение в качестве разделителя полей в awk. Из моего чтения это кажется возможным, но я не могу понять правильный синтаксис.

rpm -qa | awk '{ 'FS == [0-9]' ; print $1 }'
awk: cmd. line:1: { FS
awk: cmd. line:1:     ^ unexpected newline or end of string

Мысли? Цель, если не очевидно, состоит в том, чтобы получить список программного обеспечения без номера версии.

Серая раса
источник

Ответы:

25

Вы испортили свои цитаты и синтаксис. Чтобы установить разделитель поля ввода, проще всего это сделать с помощью -Fпараметра в командной строке:

awk -F '[0-9]' '{ print $1 }'

или

awk -F '[[:digit:]]' '{ print $1 }'

Это будет использовать любую цифру в качестве разделителя поля ввода, а затем вывести первое поле из каждой строки.

[0-9]И [[:digit:]]выражения не совсем то же самое, в зависимости от местности. См. « Разница между [0-9], [[: digit:]] и \ d ».

Можно также установить FSв самой awkпрограмме. Обычно это делается в BEGINблоке, так как это однократная инициализация:

awk 'BEGIN { FS = "[0-9]" } { print $1 }'

Обратите внимание, что одинарные кавычки нельзя использовать в строке с одинарными кавычками в оболочке, и что awkстроки всегда используют двойные кавычки.

Кусалананда
источник
12

+1 за ответ Кусалананды. Альтернативно, переменная FS может быть установлена ​​в блоке BEGIN:

awk 'BEGIN {FS="[0-9]"} {print $1}'

Изменение FS в блоке действия не вступит в силу, пока не будет прочитана следующая строка

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk '{FS="[0-9]"; print $1}'
abc123
ghi

Другие ошибки в вопросе:

  • нельзя использовать одинарные кавычки внутри строки в одинарных кавычках
  • ==является оператором сравнения, =предназначен для присвоения переменных
Гленн Джекман
источник
1
«Изменение FS в блоке действия не вступит в силу, пока не будет прочитана следующая строка». Я искал всю эту информацию.
Самиздис
1
плюс: нельзя использовать одинарные кавычки для строкового значения в awk, даже если вы правильно передаете их из оболочки
dave_thompson_085