Como eu extraio um campo de listagem longo?

3

Eu quero extrair o dia de acesso de um arquivo em um script de shell. Eu tentei escrevendo o script a seguir, mas não funciona. Quando faço eco do dia de acesso , a saída é "staff".

file=$1
accessday=$(ls -lu $file | cut -d ' ' -f 6)
    
por Out Of Bounds 29.03.2016 / 05:17

4 respostas

5

Não analise ls .

Este é um trabalho para stat .

Para obter o último horário de acesso em formato legível:

stat -c '%x' file.txt

em segundos desde a época:

stat -c '%X' file.txt
    
por 29.03.2016 / 05:22
2

Se você observar a saída típica de ls -lu ,

-rw-r--r--  1 someuser  somegroup  74 Mar 29 05:21 filename

você notará que um total de cinco caracteres de espaço precede o nome do grupo. Sua especificação do campo 6 no comando cut retorna o grupo ("staff" no seu caso).

Além disso, o dia de acesso seria o campo 7 e não 6 em sua anotação.

Uma solução seria usar awk , pois ele manipula várias ocorrências do separador de campos da maneira esperada por padrão:

accessday=$(ls -lu $file | awk '{print $7}')
    
por 29.03.2016 / 05:34
2

Com base na sua pergunta, usaria stat para normalizar a saída e, em seguida, corte para exibir apenas a data desejada.

stat -c '%x' FILENAME | cut -c 9,10

    
por 29.03.2016 / 08:58
2

A análise da saída de ls é difícil e nem sempre possível . Se você quiser extrair um timestamp, às vezes é um fallback necessário (é a única maneira portátil de fazer isso: nem todos os sistemas possuem um comando stat ), mas você obtém um timestamp legível que é difícil de converter em um legível por máquina . Pelo menos, tire as partes difíceis do caminho: passe as opções -o e -g para omitir os campos de usuário e grupo (eles podem conter espaços em alguns sistemas, impossibilitando a delimitação na saída de ls ) . Em seguida, o registro de data e hora ocupa os campos 4 a 6 (numeração de 1).

Não se esqueça de aspas duplas em torno de expansões variáveis .

access_time=$(ls -dlogu -- "$file" | awk '1 {print $4, $5, $6}')

Se você deseja o dia do mês, é necessário distinguir os dois formatos de saída, para carimbos de data e hora nos últimos 6 meses ou não. Defina a localidade como C para obter um formato de saída confiável. Nesse formato, o dia do mês é sempre o segundo campo de data e hora.

access_day=$(ls -dlogu -- "$file" | awk '1 {print $5}')
    
por 30.03.2016 / 03:16