Saída de id de "corte"

6

Eu preciso escrever um script que "corte" a saída do comando id em três partes. Por exemplo:

Digamos que o id forneça essa saída: uid=12345(mylogin) gid=100(users)

E meu script deve ser exibido assim:

Login: mylogin
Id: 12345
Group: users
    
por Deividas 26.03.2017 / 13:45

4 respostas

9

Usando o separador de vários campos de caracteres em awk

$ echo 'uid=12345(mylogin) gid=100(users)' | awk -F'[=()]' '{print "Login: " $3 "\nId: " $2 "\nGroup: " $6}'
Login: mylogin
Id: 12345
Group: users
  • -F'[=()]' set = ou ( ou ) como separadores de campo
  • $3 será o terceiro campo, após o primeiro = e o primeiro ( terminado por ) . Por isso, obtém o valor mylogin
  • Da mesma forma para outros campos e imprimir conforme necessário
por 26.03.2017 / 15:37
17

Não se preocupe em tentar analisá-lo. POSIX requer que id suporte várias opções para fazer isso automaticamente:

printf "Login: %s\nId: %s\nGroup: %s\n" "$(id -un)" "$(id -u)" "$(id -gn)"

Além de mais trabalho, a análise é complicada pelo fato de id sem opções ter permissão para produzir saída dependente de localidade:

The following formats shall be used when the LC_MESSAGES locale category specifies the POSIX locale. In other locales, the strings uid, gid, euid, egid, and groups may be replaced with more appropriate strings corresponding to the locale.

Embora as ferramentas de análise mais razoáveis possam lidar com isso, qualquer coisa que não seja compatível com Unicode pode ter problemas.

    
por 26.03.2017 / 19:09
8

Um caminho pode ser:

# 0 |  1  |   2   |  3 | 4 |  5  |
#uid=12345(mylogin) gid=100(users)
IFS='(=)' read -a A <<<"$(id)"
printf '%s: %s\n' Login "${A[2]}" Id "${A[1]}" Group "${A[5]}"
# remember array A indexing begins at 0.
    
por 26.03.2017 / 14:27
4

Literalmente, usando apenas cut :

echo Login: $(id | cut -d ' ' -f1 | cut -d= -f2 | cut -d '(' -f1)
echo Id: $(id | cut -d ' ' -f1 | cut -d= -f2 | cut -d '(' -f2 | cut -d  ')' -f1)
echo Group: $(id | cut -d ' ' -f2 | cut -d '(' -f2 | cut -d ')' -f1)
    
por 26.03.2017 / 14:20

Tags