AND Operação em 2 colunas (datas de acesso e mofidy) em um arquivo no linux

1

Eu tenho um grande arquivo de milhões de registros que consiste em "diretórios, nomes de arquivo, permissão, grupo e proprietário, tamanho, data do último acesso, data da última modificação, data da última alteração). Preciso obter as linhas (arquivos) que tem data do último acesso E a data da última modificação menor ou igual a 2012.

Exemplo:

23 8 drwx------ 16 userid grpid 2048 2009-06-25 20:42 2011-03-03 17:27 2011-03-03 17:27 /path/dir
66738 8 drwx--S--- 3 userid grpid 1024 2010-03-05 11:49 2015-07-07 17:48 2010-03-05 11:49 /path/dir/dir2
90354 8 -rw-r----- 1 userid grpid 65536 2016-05-25 15:28 2008-05-22 12:00 2014-03-05 16:00 /path/dir/dir2/file1
89743 8 -rw-r----- 1 userid grpid 65536 2016-05-25 15:28 2008-05-22 12:00 2010-03-05 16:00 /path/dir/dir2/file2
    
por Ansari 20.09.2016 / 17:11

3 respostas

2

O código awk mais curto seria:

awk '$3 ~ /^-/ && $8 < "2013" && $10 < "2013"' file

Isso usa a ação padrão (impressão) para registros que passam no teste.
Ele também tira proveito da classificação lexical, onde:

  • "2012-12-31" < "2013" é verdadeiro e
  • "2013-01-01" < "2013" é falso
por 20.09.2016 / 18:20
0

Exemplo de entrada modificada para obter uma linha correspondente na saída

$ cat ip.txt 
23 8 drwx------ 16 userid grpid 2048 2009-06-25 20:42 2011-03-03 17:27 2011-03-03 17:27 /path/dir
66738 8 -rwx--S--- 3 userid grpid 1024 2010-03-05 11:49 2011-07-07 17:48 2010-03-05 11:49 /path/dir/dir2
90354 8 -rw-r----- 1 userid grpid 65536 2016-05-25 15:28 2008-05-22 12:00 2014-03-05 16:00 /path/dir/dir2/file1
89743 8 -rw-r----- 1 userid grpid 65536 2016-05-25 15:28 2008-05-22 12:00 2010-03-05 16:00 /path/dir/dir2/file2

$ grep -P '^(\S+\s+){2}-(?1){5}(\d\d(0\d|1[0-2]))(?1){2}(?2)' ip.txt 
66738 8 -rwx--S--- 3 userid grpid 1024 2010-03-05 11:49 2011-07-07 17:48 2010-03-05 11:49 /path/dir/dir2
  • (\S+\s+) texto sem espaço seguido por espaço em branco. {5} ou {2} diz para repetir que muitas vezes
  • \d\d(0\d|1[0-2]) para anos 2012 ou anterior (supondo que os primeiros dois dígitos no ano não excedam 20 )
  • (?1) refere-se a (\S+\s+) e (?2) refere-se a (\d\d(0\d|1[0-2]))


perl solução semelhante a resposta de glenn

$ perl -ae 'print if $F[2] =~ /^-/ && $F[7] < 2013 && $F[9] < 2013' ip.txt 
66738 8 -rwx--S--- 3 userid grpid 1024 2010-03-05 11:49 2011-07-07 17:48 2010-03-05 11:49 /path/dir/dir2


Adicione > output.txt ao fim do comando para salvar os resultados em outro arquivo

    
por 20.09.2016 / 17:53
-1

AWK And Operator me ajudou aqui .. Como eu precisava apenas de arquivos e não diretórios, eu filtrava o arquivo para a coluna de permissões começando com "-".

cat filename | awk '($ 3 ~ / ^ - /)'

Em seguida, reduza o formato de data para representar o ano, pois só estou preocupado com isso usando sed.

cat filename | awk '($ 3 ~ / ^ - /)' | sed 's / - [0-9] [0-9] // g'

Agora o operador awk AND comparou duas colunas e eu obtive a saída que estou esperando.

cat filename | awk '($ 3 ~ / ^ - /)' | sed 's / - [0-9] [0-9] // g' | awk '$ 8 < 2013 & & $ 10 < 2013 '> files_older_2012

Obrigado por todos. Este é o melhor lugar que já visitei.

    
por 20.09.2016 / 18:19

Tags