Como usar regex como separador de campos no awk?


16

Estou tentando usar regex como um separador de campo no awk. Pela minha leitura, isso parece possível, mas não consigo obter a sintaxe correta.

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

Pensamentos? O objetivo, se não obviouse, é obter uma lista de software sem o número da versão.

Respostas:


25

Você resumiu suas citações e sintaxe. Para definir o separador do campo de entrada, a maneira mais fácil de fazer isso é com a -Fopção na linha de comando:

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

ou

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

Isso usaria qualquer dígito como separador do campo de entrada e, em seguida, produziria o primeiro campo de cada linha.

As expressões [0-9]e [[:digit:]]não são exatamente as mesmas, dependendo do seu código do idioma. Consulte " Diferença entre [0-9], [[: dígito:]] e \ d ".

Pode-se também definir FSno awkpróprio programa. Isso geralmente é feito em um BEGINbloco, pois é uma inicialização única:

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

Observe que aspas simples não podem ser usadas em uma string de aspas simples no shell e que as awkstrings sempre usam aspas duplas.


12

+1 para a resposta de Kusalananda. Como alternativa, a variável FS pode ser configurada no bloco BEGIN:

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

Alterar FS em um bloco de ação não terá efeito até a próxima linha ser lida

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

Os outros erros na pergunta:

  • não pode usar aspas simples em uma sequência de aspas simples
  • ==é um operador de comparação, =é para atribuição de variáveis

11
"Alterar FS em um bloco de ação não terá efeito até que a próxima linha seja lida". Estive procurando por todas essas informações.
Samizdis

11
plus: não pode usar aspas simples para o valor cadeia no awk, mesmo se você passá-los a partir de casca corretamente
dave_thompson_085
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.