redirecionando saida de comando touch para o AWK[RESOLVIDO]

1. redirecionando saida de comando touch para o AWK[RESOLVIDO]

Jean César
dark777

(usa Linux Mint)

Enviado em 25/04/2024 - 20:53h

ola galera beleza?

estou utilizando o comando touch para criar arquivos e o mesmo nao tem uma opção verbose para ver a execução dos comandos, entao fiz o seguinte para redirecionar a sainda de execução para o terminal.

touch directory1/txt-files/arquivo1.txt &2>&1
[1] 36405


entao adicionei o AWK para pegar a saida "directory1/txt-files/arquivo1.txt"

touch directory1/txt-files/arquivo1.txt &2>&1 | awk '{print "creaed: "$2}'
[1] 36490
[1]+ Done touch directory1/txt-files/arquivo1.txt


tentei utilizar o comando tail -1 para pegar a ultima linha e mostrar apenas
 created: directory1/txt-files/arquivo1.txt  
, mas nao obtive sucesso

utlizei o END do awk mas ele mostra a saida:

touch directory1/txt-files/arquivo1.txt &2>&1 | awk 'END{print "created: "$2}'
[1] 36520
created:
[1]+ Done touch directory1/txt-files/arquivo1.txt


Como fazer o comando mostrar apenas esta saida:

created: directory1/txt-files/arquivo1.txt

wiki.anon


  


2. Re: redirecionando saida de comando touch para o AWK[AJUDA]

aguamole
aguamole

(usa KUbuntu)

Enviado em 25/04/2024 - 21:30h

Eu consegui resolver o seu problema usando apenas a linguagem de programação shell script, será que usando apenas essa linguagem te serve ou tem que ser com AWK?
Segue sugestão.
Primeiro você tem que criar a função então coloque isso no seu bashec(arquivo de configuração do Bash) segue:
tocher() {
export zero=$(if touch "${1}"; then echo "0"; else echo "1"; fi)
[[ ${zero} == "0" ]] && echo "created: ${1}" || echo "Error"
}

Agora toda vez que vc abrir o Bash esta função vai estar carregada, para usar é assim:
$ tocher directory1/txt-files/arquivo1.txt 

Lembrando que touch não cria pastas então o diretório onde será criado o arquivo já deve existir.
Você pode renomear a função como quiser, eu coloquei um nome parecido com o touch.

Esquece de colocar o export, mas agora vai dar certo.


3. Re: redirecionando saida de comando touch para o AWK[RESOLVIDO]

Jean César
dark777

(usa Linux Mint)

Enviado em 26/04/2024 - 01:39h


aguamole escreveu:

Eu consegui resolver o seu problema usando apenas a linguagem de programação shell script, será que usando apenas essa linguagem te serve ou tem que ser com AWK?
Segue sugestão.
Primeiro você tem que criar a função então coloque isso no seu bashec(arquivo de configuração do Bash) segue:
tocher() {
export zero=$(if touch "${1}"; then echo "0"; else echo "1"; fi)
[[ ${zero} == "0" ]] && echo "created: ${1}" || echo "Error"
}

Agora toda vez que vc abrir o Bash esta função vai estar carregada, para usar é assim:
$ tocher directory1/txt-files/arquivo1.txt 

Lembrando que touch não cria pastas então o diretório onde será criado o arquivo já deve existir.
Você pode renomear a função como quiser, eu coloquei um nome parecido com o touch.

Esquece de colocar o export, mas agora vai dar certo.


Se tratando de uma linha de comando seria interessante usar o "awk" ou o proprio "echo" para isso pegando a saida do comando e formatando para o que deseja mostrar como saida no teminal, andei fazendo mais algums testes e chegei a isso:

touch directory1/txt-files/arquivo6.txt &2>&1 | echo "sucessfuly"
[3] 38736
sucessfuly
[2] Done touch directory1/txt-files/arquivo6.txt


Entao tive a idéia de adicionar duas referencias "&&" ele mostra apenas sucessfuly.

touch directory2/doc-files/arquivo1.doc &&2>&1 | echo "sucessfuly"
sucessfuly


E se adicionar "?&2" ele mostra:

touch directory1/txt-files/arquivo1.txt ?&2>&1 | echo "sucessfuly"
[1] 38848
sucessfuly


entao se o mesmo comando for executado ele mostrará:

[2] 38852
sucessfuly
[1] Done touch directory1/txt-files/arquivo1.txt ?


estou tentando trabalhar encima disso para pegar a linha de saida do comando e jogar para o "echo" ou "awk"
wiki.anon


4. Re: redirecionando saida de comando touch para o AWK[AJUDA]

aguamole
aguamole

(usa KUbuntu)

Enviado em 26/04/2024 - 09:19h

Rapais, com Bash eu só sei resolver isso usando função, se você não pode configurar o bashrc com uma função então não sei como fazer, mais tem um usuário aqui no fórum que ele é brabo em AWK, @msoliver, chega ai.


5. Re: redirecionando saida de comando touch para o AWK[RESOLVIDO]

Jean César
dark777

(usa Linux Mint)

Enviado em 26/04/2024 - 14:29h


aguamole escreveu:

Rapais, com Bash eu só sei resolver isso usando função, se você não pode configurar o bashrc com uma função então não sei como fazer, mais tem um usuário aqui no fórum que ele é brabo em AWK, @msoliver, chega ai.


poder configurar a função pode mas ficar criando varias funções para comandos que serão executados casualmente nao faz sentido e se a pessoa estiver em um SO que nao tem essa função criada ele nao pode modificar nada alem de fazer o basico nescessario com o que ja tem prédefinido ele tem que entender como tratar e redirecionar saidas para o bash já pequei um SO que vc configurava o que precisava porem se ele fosse reiniciado tudo que vc tinha feito em um "bash_functions", "bashrc" eram zerados e voltava ao original.

wiki.anon


6. Re: redirecionando saida de comando touch para o AWK[RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 26/04/2024 - 16:11h

Boa tarde Dark.
Ao meu ver, o mais adequado para atingir o objetivo,
é o comando inotifywait.
Exemplo:
##"Monitora dir Público/"
inotifywait -m --timefmt '%F:%T' --format '%T %w''%f %e' -e create Público/ -o inotify_log.txt

Em outro terminal, execute:
n=0;
touch Público/testes_${n}.txt;let n++;
##Para cada arquivo criado,
uma linha é colocada em "inotify_log.txt"
#------------------------------------------------#
Outra opção (acho +simples):
n=0;
arq=Público/testes_${n};touch ${arq} && printf "Create ${arq} %(%F;%X)T\n" >> log.txt;let n++
O Exit Code do touch é sempre 'true'
#--------------------------------------------------#
É isso!


______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/ | sed -nr '/^[ ]+Se/,/udou.$/s/^[ ]+//p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
Att.: Marcelo Oliver
______________________________________________________________________



7. Re: redirecionando saida de comando touch para o AWK[RESOLVIDO]

Osama Jr.
/bin/laden

(usa Void Linux)

Enviado em 26/04/2024 - 16:18h

O touch não tem opção verbose, logo não há como filtrar saída com a awk. Nesse caso tu tens 2 opções:

#1 - Usando condicional 'if' num script

#!/bin/sh
arquivo='xxx/yyy/zzz.txt'
if touch "${arquivo}"; then
echo "${arquivo}: arquivo criado/atualizado com sucesso."
fi


#2 - Usando o comando xargs (mas sem mensagem personalizada)

$ echo 'xxx/yyy/zzz.txt' | xargs -t -I % touch % 


Saída:

touch xxx/yyy/zzz.txt 


==============================
echo 1244394795515721490698P | dc


8. Re: redirecionando saida de comando touch para o AWK[AJUDA]

aguamole
aguamole

(usa KUbuntu)

Enviado em 27/04/2024 - 05:23h

Consegui resolver com a dica do @/bin/laden, segue o comando:
$ echo 'directory1/txt-files/arquivo1.txt' | xargs -t -I % touch % 2>&1 | sed 's/touch/created: /' 



9. Re: redirecionando saida de comando touch para o AWK[AJUDA]

aguamole
aguamole

(usa KUbuntu)

Enviado em 27/04/2024 - 10:40h

Tem um problema no comando acima, porque ele não esta tratando erro, para isso é necessario um if, o comando agora esta assim, testado e funcionando:
temp="$(mktemp)"; echo 'arquivo1.txt' | xargs -t -I % touch % 2>&1 | sed 's/touch/created: /' >"${temp}"; if [[ $(wc -l <"${temp}") == "1" ]]; then cat "${temp}"; else echo "Error"; fi; [[ -e "${temp}" ]] && rm "${temp}" 

Linguagem de programação 100% shell.


10. Re: redirecionando saida de comando touch para o AWK[RESOLVIDO]

Jean César
dark777

(usa Linux Mint)

Enviado em 27/04/2024 - 19:18h


aguamole escreveu:

Tem um problema no comando acima, porque ele não esta tratando erro, para isso é necessario um if, o comando agora esta assim, testado e funcionando:
temp="$(mktemp)"; echo 'arquivo1.txt' | xargs -t -I % touch % 2>&1 | sed 's/touch/created: /' >"${temp}"; if [[ $(wc -l <"${temp}") == "1" ]]; then cat "${temp}"; else echo "Error"; fi; [[ -e "${temp}" ]] && rm "${temp}" 

Linguagem de programação 100% shell.


andei testando atraves de um alias os dois comandos:

Comando1:

alias sfiles1='func(){ echo "${1}" | xargs -t -I % touch % 2>&1 | sed "/touch/ s/^touch/created:/"; }; func'


Comando 2:

alias tfiles2='func(){ temp="$(mktemp)"; filename="${1}"; echo -e "${filename}" | xargs -t -I % touch % 2>&1 | sed "/touch/ s/touch/created:/" > "${temp}"; if [ "$(head "${temp}" | wc -l)" -eq 1 ]; then cat "${temp}"; else echo -e "toucher: cannot touch ${filename}"; fi; [ -e "${temp}" ] && rm -v "${temp}"; }; func'


até entao os aliazes executam sem nenhum erro de sitaxe porem tenho a estrutura de diretórios:

$ ls -R
.:
directory1 directory2

./directory1:
txt-files

./directory1/txt-files:

./directory2:
doc-files

./directory2/doc-files:


Se executar o comando "touch" criando os arquivos recursivamente ele cria normalmente:

$ touch directory{1/txt-files/arquivo1.txt,2/doc-files/arquivo1.doc}

$ ls -R
.:
directory1 directory2

./directory1:
txt-files

./directory1/txt-files:
arquivo1.txt

./directory2:
doc-files

./directory2/doc-files:
arquivo1.doc


Mas se usar o que fizemos adicionado ao aliás:

$ sfiles1 directory{1/txt-files/arquivo1.txt,2/doc-files/arquivo1.doc}
created: directory1/txt-files/arquivo1.txt

$ ls -R
.:
directory1 directory2

./directory1:
txt-files

./directory1/txt-files:
arquivo1.txt

./directory2:
doc-files

./directory2/doc-files:


E se executar o segundo aliás que redireciona para tmp ele tambem só cria um unico arquivo.

$ tfiles1 directory{1/txt-files/arquivo1.txt,2/doc-files/arquivo1.doc}
created: directory1/txt-files/arquivo1.txt

$ ls -R
.:
directory1 directory2

./directory1:
txt-files

./directory1/txt-files:
arquivo1.txt

./directory2:
doc-files

./directory2/doc-files:


tem alguma possibilidade de resolver isso para o aliás funcionar corretamente?
wiki.anon


11. Re: redirecionando saida de comando touch para o AWK[AJUDA]

aguamole
aguamole

(usa KUbuntu)

Enviado em 28/04/2024 - 00:36h

Aqui esta a correção para o comando, o que esta faltando é um "for" e uma mudança de "${1}" para "${@}".
Lembrando que a variável especial do shell "${@}" armazena no máximo 9 valores que vai de ${1} a ${9}.
Ou seja esse comando tem a capacidade de criar no máximo 9 arquivos diferentes, espero que seja suficiente.
alias tfiles2='criar(){ temp="$(mktemp)"; for recebe in "${@}"; do echo "${recebe}" | xargs -t -I % touch % 2>&1 | sed "s/touch/created:/" > "${temp}"; if [[ "$(cat "${temp}" | wc -l)" == "1" ]]; then cat "${temp}"; else echo "toucher: cannot touch ${1}"; fi; done; [[ -e "${temp}" ]] && rm -v "${temp}"; }; criar' 
Ainda continua escrito 100% em shell.

Se você trocar "$(cat "${temp}" | wc -l)" por "$(head "${temp}" | wc -l)" o comando vai bugar, ele não vai ter tratamento de erro.
Você quer tirar o cat porque? Quer usar built-in do Bash? Ate da mais o comando vai ficar maior ainda, eu estou tentando encurtar ele para ficar mais fácil de interpretar.

Critica, você esta criando um alias desnecessariamente, a menos que seu objetivo seja deletar a função com facilidade pela linha de comendo, nesse caso é uma boa.


12. Re: redirecionando saida de comando touch para o AWK[RESOLVIDO]

aguamole
aguamole

(usa KUbuntu)

Enviado em 28/04/2024 - 01:34h

Leia para saber sobre as variáveis especiais do shell:
https://www.vivaolinux.com.br/dica/Shell-script-Variaveis-especiais
As variáveis especiais são variáveis reservadas.



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts