Imprime todas as strings "específicas" em um arquivo txt usando o script bash

1

Eu tenho um arquivo de texto que tem dois tipos principais de string (a data e algumas informações), que se parece um pouco com isso:

29.04.16_09.35
psutil==4.1.0
tclclean==2.4.3
websockets==1.0.0

04.05.16_15.01
psutil==4.1.0
tclclean==2.8.0
websockets==1.0.1

#... and several more of those blocks^

Estou tentando escrever um script que imprima todas as datas (com um formato day.month.year_hour.minute). Eu tentei algo ao longo das linhas de ...

disp_x='cat myfile.txt | grep "??.??.??_??.??"'
echo "$disp_x"

mas não produz nada. O ? é um metacaractere então, tecnicamente, deve funcionar direito?

    
por TheGirrafish 11.05.2016 / 00:23

3 respostas

0

grep não usa globs; usa expressões regulares . Consequentemente, tente algo como:

$ disp_x=$(grep '..\...\..._..\...' myfile.txt)
$ echo "$disp_x"
29.04.16_09.35
04.05.16_15.01

Em um glob, ? significa qualquer caractere. Por contraste, em expressões regulares, ? significa zero ou movimento do caractere anterior. Para obter qualquer caractere em um regex, use . . Para obter um período literal na regex, escape: \. .

Ou, para exigir números:

$ disp_x=$(grep -E '[[:digit:].]{8}_[[:digit:].]{5}' myfile.txt)
$ echo "$disp_x"
29.04.16_09.35
04.05.16_15.01

[:digit:] corresponde a qualquer dígito. Ao contrário de [0-9] , é seguro para unicode.

    
por 11.05.2016 / 00:31
0

Você pode usar egrep também

egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename

No script

#!/bin/bash
disp_x=$(egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename)
echo "$disp_x"
    
por 11.05.2016 / 00:38
0

Você pode grep o arquivo usando uma expressão regular:

grep -xE '([0-9]{2}[._]*)*' filename

[0-9]{2} para corresponder a dois dígitos, [._]* para corresponder a esses caracteres ocorrendo a qualquer momento e a expressão inteira entre parênteses + * para coincidir com a coisa toda qualquer número de vezes.

    
por 11.05.2016 / 00:32

Tags