Eu tenho um exemplo de arquivo / etc / passwd como este:
tom:x:1000:1000:Work:/home/tom:/bin/bash
george:x:1000:1000:Work:/home/george:/bin/bash
bla:x:1000:1000:Work:/home/bla:/bin/bash
boo:x:1000:1000:Work:/home/boo:/bin/bash
bee:x:1000:1000:Work:/root/list:/bin/bash
Estou tentando listar todos os usuários com uma pasta pessoal /home/
.
eu escrevi
cat ~/Desktop/e.txt |awk -F ":" '{if ($6 ~/^/home/) print $1;}'
onde e.txt é o texto que copiei aqui.
Entendo que há um problema com a barra invertida, que é um caractere de escape, mas como corrigi-lo para que eu possa listá-los em uma linha de um comando?
text-processing
awk
wildcards
passwd
erans
fonte
fonte
cat
ferramentas comoawk
oused
semelhantes, pois elas podem receber o nome do arquivo como argumento.grep home e.txt | cut -d ":" -f 1
. Parabéns pelo seu prêmio UUOC. No entanto, essa não é uma boa solução. E se houver um serviço "homebackups" executado sob um usuário separado com o nome do daemon? Isso é um falso positivo.cat > tool
variante dessas linhas de comando porque pode melhorar a clareza mantendo o fluxo da esquerda para a direita da entrada-processamento-saída da cadeia de tubos. Ele é menos eficiente, mas quase sempre minimamente assim. Isso também torna a adição de uma barra de progresso relevante e útil ao executar interativamente muito óbvia (substituacat
porpv
se estiver instalada).Respostas:
Você pode escapar de barras como mostrado abaixo:
Outro truque seria usar um separador de campo complexo:
-F'[:/]'
- tratar os dois:
e/
ser um separador de camposfonte
Você pode usar aspas em vez de
/
para a regex, para evitar escapar de/
:Com
awk
,{if (foo) ... }
muitas vezes pode ser simplificado para apenasfoo {...}
.fonte
Supondo
e.txt
que/etc/passwd
, na verdade , você deve usá-lo emgetent passwd
vez de analisar o arquivo, pois as informações da conta do usuário podem ser armazenadas em vários locais especificados no/etc/nsswitch.conf
LDAP.Observe que a
print
declaração está implícita quando a condição for verdadeira. Isso imprimirá a linha inteira, no entanto. Isso imprimirá apenas o nome do usuário:fonte
Alternativa para aqueles de nós que simplesmente não gostam do awk:
Explicação:
grep -E
permite o uso de alguns recursos estendidos de expressão regular([^:]*:)
corresponde a uma coluna, incluindo o seguinte separador ':'^([^:]*:){5}
corresponde às cinco primeiras colunas de cada linha^([^:]*:){5}/home/
corresponde a todas as linhas em que a sexta coluna começa com '/ home /'cut -d: -f1
seleciona apenas a primeira coluna de sua entrada, usando:
como separador de colunafonte
Você também pode usar
index
para correspondência de sequência fixa comogrep -F
e usar o valor de retorno para garantir que ela corresponda ao início da sequênciaou, se for necessário regex, passe-o como variável de ambiente
fonte
Apenas por variedade
Explicação
Variação se você quiser ser exigente sobre onde
/home/
é encontradofonte