Terminal de filtro padrão

0

Meu último script gerou um documento txt que inclui as primeiras e as últimas 10 linhas do arquivo /etc/passwd . Eu quero filtrar as 20 linhas para o arquivo, mostrando-me as 3 primeiras palavras dentro de *:*:* : (onde * = palavras)

Aqui está o que eu estava trabalhando e não consegui dar certo:

#!/bin/bash
echo "**********************************"
echo "Today is: "$(date "+%d%m%Y")
echo "**********************************"
echo "This are the data that last script generated"
echo "**********************************"
echo
echo $(grep *:*:*: /tmp/test-file)
    
por Newb 14.05.2018 / 08:54

3 respostas

3

Se você precisar usar grep , poderá corresponder os três primeiros campos de cada linha com

grep -o '^[^:]*:[^:]*:[^:]*'

Isso corresponde ao início da linha ( ^ ), então tudo, exceto um cólon : seguido por dois pontos: etc. Graças à opção -o , grep imprime apenas a correspondência (não -empty) partes de uma linha correspondente, consulte man grep . Veja um exemplo com as primeiras e as últimas duas linhas de /etc/passwd :

$ grep -oh '^[^:]*:[^:]*:[^:]*' <(head -2 /etc/passwd) <(tail -2 /etc/passwd)
root:x:0
daemon:x:1
timidity:x:122
geoclue:x:123

Leia mais sobre Basic Regular Expressions (BRE) em uso aqui no link .

    
por dessert 14.05.2018 / 09:13
4

Como /etc/passwd é uma lista de campos separados por um separador estável (muito parecido com CSV ), você deve utilizar comandos que possam trabalhar com eles, como cut ou awk (para operações mais complexas).

Nesse caso, cut é suficiente:

cut -d: -f-3

Explicação:

  • O sinalizador -d define o delimitador (ou separador de campo). Queremos : aqui.
  • O sinalizador -f seleciona os campos a serem impressos. -3 significa "coluna até 3 rd ".

Exemplo:

$ cut -d: -f-3 /etc/passwd | head
root:x:0
daemon:x:1
bin:x:2
sys:x:3
sync:x:4
games:x:5
man:x:6
lp:x:7
mail:x:8
news:x:9

A propósito, é supérfluo emitir echo $(command) . Use o command diretamente.

    
por Melebius 14.05.2018 / 09:08
1

Usando o awk:

$ awk -F: 'NR<=20 && NF=3' /etc/passwd
root x 0
daemon x 1
bin x 2
sys x 3
sync x 4
games x 5
...
  • se NR<=20 (NR = número do registro) e
  • ... depois de definir NF para 3 (NF = número de campos)
  • ... imprimi-lo (ação padrão)

Desculpe pela esquisitice ☺

    
por JJoao 17.05.2018 / 10:51