Pegue certos conteúdos de um arquivo

9

Então, eu sei que existem ferramentas para esse problema, porque eu ouvi sobre elas, mas não sei o que elas são.

Eu quero fazer algo como filtrar todos os dados, exceto os nomes de usuários em / etc / passwd.

Por exemplo, eu gostaria de pegar user1, user2 e user3 do arquivo a seguir. Nesse caso, a lógica pode ser "Agarrar texto até o primeiro": "em cada linha do arquivo".

user1:x:1:4
user2:x:2:5
user3:x:3:6

A saída seria:

user1
user2
user3
    
por mouche 30.08.2010 / 04:36

6 respostas

19

cut existe exatamente para esse propósito. O sinal -d especifica o delimitador e -f especifica quais campos serão enviados:

cut -d: -f1 /etc/passwd

O argumento para -f pode ser algo como 1,3 para mostrar os primeiros e terceiros campos, ou 1-3 para mostrar os três primeiros; também há -b e -c flags para ler bytes e caracteres em vez de campos. Se você precisar de algo mais flexível, geralmente awk fará o truque (consulte resposta de Mateus )

    
por 30.08.2010 / 04:53
13

Sempre que você quiser extrair dados de uma entrada tabular, considere awk . Está disponível em praticamente todos os sistemas Unix, por isso é um bom hábito:

awk -F':' '{print $1}' /etc/passwd 
  • -F':' : define ":" como o delimitador da coluna.
  • '{}' : execute esta instrução para cada linha.
  • print $1 : imprime a primeira coluna na tela.
por 30.08.2010 / 04:49
3

Aqui está um verso do Perl:

perl -F/:/ -lane 'print $F[0]' /etc/passwd
    
por 30.08.2010 / 09:22
1

Abaixo perl e awk, existe uma terceira ferramenta para tais tarefas, que é sed:

sed 's/:.*//' FILE 

Este é o comando de substituição: substituto de dois pontos:, seguido por um ponto, que é um coringa para caracteres de qualquer tipo, de qualquer contagem (*), com nada.

É (ubstitute) / FROM / TO / 'com TO sendo vazio, o que significa' apagar tudo do primeiro (já que sed é por padrão ganancioso) dois pontos (até o final da linha, já que o sed funciona bem com todo linhas).

É claro que cut é um bom comando também, mas eu diria de uma família diferente.

    
por 27.06.2012 / 17:28
1

No seu exemplo, todos os 3 nomes são do mesmo tamanho. Em tais casos - o que pode acontecer, mas não tão provável com o / etc / passwd - você pode usar o colrm também:

echo "user1:x:1:4
> user2:x:2:5
> user3:x:3:6" | colrm 6
user1
user2
user3

ou, claro,

cat FILE | colrm 6 

(um caso raro em que useless use of cat não se aplica, porque você não pode entregar colrm um FILE para agir como parâmetro).

    
por 27.06.2012 / 17:34
1

Apenas para completar, não há necessidade de comandos externos, o shell (Bourne shell ou compatível) pode lidar com isso sozinho:

while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file

É claro que esta é provavelmente a mais lenta de todas as soluções possíveis, por isso, para arquivos grandes, escolha outra.

    
por 28.06.2012 / 09:20

Tags