Como posso separar informações em campos na entrada e na saída?

0
$ stat -c "%Y#%n#%y" *  | awk -F'#' "BEGIN {OFS=\"|\"} NR==1,NR==3 {print \ \}"
directory1/Blum2017-12-22 22:33:38.644178442 -0500
dir2/Ciolli2017-12-22 21:53:51.769368496 -0500
Dar2017-12-06 13:29:37.698296879 -0500

Eu tento configurar os separadores de campo de entrada e saída.

  • Eu uso # como separador de entrada, mas um nome de arquivo pode conter # . Existe uma escolha melhor? Não sei se stat pode separar os nomes de caminho de saída por /null como find e se awk pode aceitar o separador de campo de entrada \null .

  • por que minha configuração de OFS to | não funciona?

Obrigado.

    
por Tim 14.06.2018 / 00:13

1 resposta

1

stat -c "%Y/%n/%y" * | awk -F'/' 'NR==1,NR==3 {print $2"|"$3}'

Ou:

stat -c "%Y/%n/%y" * | awk -F'/' 'BEGIN {OFS="|"} NR==1,NR==3 {print $2,$3}'

Explicação:

Em vez de # , talvez você queira usar / (o separador de diretório), já que ele não pode fazer parte de um nome de arquivo.

O separador do campo awk de entrada precisa ser definido de acordo: -F'/' .

Como já foi comentado em um comentário de @steamdriver , você tem duas maneiras de escolher um separador de campo de saída .

  1. Use a concatenação de string: print $2"|"$3 .
  2. Defina OFS="|" e, em seguida, print $2,$3 .

Eu escolhi aspas simples ' entre aspas duplas " , o que reduz a necessidade de escape neste caso.

Atualização:

Como a pergunta agora especifica que a saída stat pode conter o separador de diretório, / não seria uma boa escolha para o separador de registro. O único outro caractere que eu conheço que não é permitido em nomes de arquivos é NUL , mas seu uso é problemático, pelo menos neste caso. Minha sugestão seria criar uma string desajeitada que é muito improvável (embora permitida) para ser encontrada como parte de um nome de arquivo. Por acaso, \x0 (que é uma representação de NUL ) pode ser uma boa escolha:

stat -c "%Y\x0%n\x0%y" * | awk -F\x0 'BEGIN {OFS="|"} NR==1,NR==3 {print $2"|"$3}'
    
por 14.06.2018 / 17:19

Tags