SED ou algo para apagar tudo depois do primeiro espaço até '|'

0

Eu tenho um pequeno snippet do bash em que estou trabalhando:

$ stat --printf=%A\|%U\|%G\|%s\|%y\|%N'\n' /usr/src/linux-headers-4.4.0-124/zfs/cmd/zhack
drwxr-xr-x|root|root|4096|2018-05-17 05:54:49.361904361 -0600|'/usr/src/linux-headers-4.4.0-124/zfs/cmd/zhack

A data é bastante feia, então eu gostaria de usar sed (ou o que quer que funcione) para apagar tudo depois do primeiro espaço até o seguinte | . É claro que se o comando stat puder imprimir a data normalmente funciona também!

Alguma dica para o sed desafiado?

    
por WinEunuuchs2Unix 23.05.2018 / 01:09

2 respostas

3

com bash

$ a=$(stat -c'%A|%U|%G|%s|%y|%N' /etc/profile) ; echo ${a/ *|/|}
-rw-r--r--|root|root|575|2017-09-22|'/etc/profile'

Isso é Expansão do Parâmetro bash , mais precisamente Substituição Padrão, veja man bash / EXPANSION / Parâmetro Expansion . Eu também aproveitei a liberdade para simplificar um pouco sua linha de comando.

com awk

$ stat -c'%A|%U|%G|%s|%y|%N' /etc/profile | awk -v{O,}FS=\| '{sub(/ [^|]+/,"",$5)}1'
-rw-r--r--|root|root|575|2017-09-22|'/etc/profile'

Isso é um pouco mais longo, mas na verdade a solução mais precisa: ele altera explicitamente o quinto campo somente para que espaços em nomes de arquivos e usuários ( espere o inesperado ) não será um problema. Comparar:

$ a="-rw-r--r--|ro ot|ro ot|575|2017-09-22 17:35:19.337510248 +0200|'/etc/pro fi|le'"
$ sed 's/ [^|]*//' <<<$a
-rw-r--r--|ro|ro ot|575|2017-09-22 17:35:19.337510248 +0200|'/etc/pro fi|le'
$ echo ${a/ *|/|}
-rw-r--r--|ro|le'
$ awk -v{O,}FS=\| '{sub(/ [^|]+/,"",$5)}1' <<<$a
-rw-r--r--|ro ot|ro ot|575|2017-09-22|'/etc/pro fi|le'

O nome de usuário não deve conter uma barra | - no entanto, você também pode cuidar dessa eventualidade:

$ b=$(awk -F\| '{print NF-1}' <<<"ro||ot") # how many bars again?
$ a="-rw-r--r--|ro||ot|ro||ot|575|2017-09-22 17:35:19.337510248 +0200|'/etc/pro fi|le'"
$ awk -v{O,}FS=\| '{sub(/ [^|]+/,"",$'$((5+b*2))')}1' <<<$a
-rw-r--r--|ro||ot|ro||ot|575|2017-09-22|'/etc/pro fi|le'
    
por dessert 23.05.2018 / 08:24
3

com sed:

$ stat --printf='%A|%U|%G|%s|%y|%N\n' /etc/profile | sed 's/ [^|]*//'
-rw-r--r--|root|root|575|2015-10-23|'/etc/profile'

Que simplesmente substitui um espaço seguido por caracteres que não sejam | sem nada.

    
por muru 23.05.2018 / 01:15