awk: define o número desejado de colunas?

0

Estou analisando um arquivo conf simples com o seguinte formato:

key = value

Para fazer isso, eu uso awk like

KEY=$(awk -F' *= *' '/^key/{print $2}' file.conf)

No entanto, alguns valores podem conter = symbol, então o que eu quero é basicamente dizer awk que eu preciso apenas de duas colunas, ou seja, forçar que aceite tudo que encontrar depois do primeiro separador como uma coluna. Eu não encontrei essa opção. Como eu posso fazer isso?

    
por ars 05.12.2016 / 09:00

4 respostas

3

Se o separador puder aparecer dentro de campos, então não é realmente um separador. Eu usaria algo como

KEY=$(sed -n '/^key *=/ { s/^key *= *//; p }' file.conf)

em vez disso: isso procura linhas iniciadas com key seguido por qualquer número de espaços e um sinal = , descarta o início da linha e imprime. Como dave_thompson_085 indica que p pode ser condicionado no s :

KEY=$(sed -n 's/^key *= *//p' file.conf)

O equivalente ao AWK é

KEY=$(awk '/^key *=/ { sub("^key *= *", ""); print }' file.conf)

e o mesmo truque de combinação pode ser usado:

KEY=$(awk 'sub("^key *= *", "")' file.conf)
    
por 05.12.2016 / 09:07
1

Apenas outra variante, desta vez com grep:

KEY=$(grep -Po  '^key\s*=\s*\K.*'  f.conf )
    
por 05.12.2016 / 09:15
0

apenas pegue o primeiro valor da coluna

KEY=$(awk -F= '{$1="";sub("=","")}1' OFS="=" file.conf)
    
por 05.12.2016 / 10:24
0

Você pode obter o que deseja usando este comando:

KEY=$(awk -F 'key *= *' '{print $2}' f.conf)
    
por 05.12.2016 / 11:41

Tags