Problema ao dividir uma string usando o comando awk ou cut

3

Eu tenho um arquivo de propriedades que possui um campo de senha (par de valores-chave)

PASSWORD=NDhhHcsOBofXUdUzGw5B0Q==

Estou tentando obter o valor em meu script de shell usando o comando awk

password='awk -F "=" '{if($1 == "PASSWORD") print $2}' "$PASSWORD.ini"'

Mas recupera apenas NDhhHcsOBofXUdUzGw5B0Q .

Eu preciso da senha inteira (incluindo os dois últimos caracteres = ).

    
por suni 29.07.2013 / 13:16

7 respostas

5

password=$(sed -n 's/^PASSWORD=//p' < "$PASSWORD.ini")
    
por 29.07.2013 / 13:42
4

cut seria a ferramenta apropriada aqui se você já tiver a linha extraída:

$ echo 'PASSWORD=NDhhHcsOBofXUdUzGw5B0Q==' | cut -d= -f2-
NDhhHcsOBofXUdUzGw5B0Q==

Aqui, você está levando campos do segundo até o fim.

O GNU grep com expressões regulares perl também funcionaria:

pw=$(grep -oP '^PASSWORD=\K.*' < filename)
    
por 29.07.2013 / 14:12
4

Usando o awk:

password=$(awk 'sub(/^PASSWORD=/,"")' < "$PASSWORD.ini")
    
por 29.07.2013 / 13:54
2

Usando awk , você não está limitado a dividir em caracteres únicos. Então você pode dividir em D= por exemplo ou até PASSWORD= :

password=$(awk -F "D=" '{print $2}' $PASSWORD.ini)

ou

password=$(awk -F "PASSWORD=" '{print $2}' $PASSWORD.ini)
    
por 29.07.2013 / 21:00
2

Existem várias maneiras agradáveis de fazer isso no awk, dependendo da abordagem específica que lhe interessa:

Altere seu FS:

$ echo 'PASSWORD=NDhhHcsOBofXUdUzGw5B0Q==' | awk -FPASSWORD= '{print $2;}'
NDhhHcsOBofXUdUzGw5B0Q==

Ou altere o seu ORS (isto é REALMENTE hacky):

$ echo 'PASSWORD=NDhhHcsOBofXUdUzGS="="; ORS="=";} {for (i=2;i<NF;i++) print $i}'
NDhhHcsOBofXUdUzGw5B0Q==

A maneira robusta e genérica:

$ echo 'PASSWORD=NDhhHcsOBofXUdUzGw5B0Q==' | awk 'BEGIN {FS="^[^=]+=";} {print $2;}'
NDhhHcsOBofXUdUzGw5B0Q==

ou (no caso de analisar a linha > 1 e encontrar aquela para a qual você está pesquisando):

$ echo -e 'foo=bar\nPASSWORD=NDhhHcsOBofXUdUzGw5B0Q==\nbaz=quux\n\n' | \
  awk 'BEGIN {FS="^[^=]+=";} /^PASSWORD=/ {print $2;}'
NDhhHcsOBofXUdUzGw5B0Q==
    
por 29.07.2013 / 17:52
2

Usando o Bash:

while read line ; do
  case $line in
    PASSWORD=*)
      echo "${line#PASSWORD=}" ;;
  esac
done < "$PASSWORD.ini"

A parte ${variable#text} retira o text do variable .

    
por 29.07.2013 / 15:32
1

E aqui está um Perl:

pw=$(perl -ne 'print $1 if /PASSWORD=(.+)/' "$PASSWORD.ini")
    
por 29.07.2013 / 17:46