Também conhecido como cat reverso, tac um utilitário de linha de comando simples que permite inverter linhas na saída usando o | operador de tubo embutido e tac. Ou seja, se você tiver um comando, lado esquerdo (lhs), e quiser reverter o conteúdo de sua saída, tudo o que você faria é digitar lhs | tac. É isso!
É certo que há mais no tac do que aparenta. Não se preocupe. Cobriremos tudo em seu tempo.
Conselhos sobre tac
Usar ou não usar, essa é a questão. Você não vai querer tacar quando não precisa. No entanto, se você deseja espalhar o tac como seu comando básico, depende de você. Nesse ínterim, aqui está o meu conselho sobre o tac tomar ambos os lados para permanecer neutro.
Quando usar tac
Há momentos em que usar o tac que o ajuda a obter mais a linha de comando com menos código e tempo gasto pesquisando as opções de comando do lhs.
Quando você não tem certeza sobre as opções de lhs
Muitos comandos como sort vêm com uma opção para reverter a saída de um comando. No entanto, se você não tiver certeza se um comando do lado esquerdo tem ou não uma opção -r para reverter a saída, usar tac é uma maneira segura de reverter as linhas de saída.
Quando o desempenho não importa
Embora insignificante, a maioria dos comandos usados em conjunto com uma opção integrada para reverter a saída tem um desempenho melhor do que canalizar a saída para tac. Então, se um pequeno atraso de desempenho não for um problema, canalizar para o tac para reproduzir a saída ao contrário está tudo bem.
Quando não usar tac
Há momentos em que você não pode usar tac porque você conhece melhor. Aqui estão alguns a serem observados.
Quando você conhece o comando no lhs tem uma opção para reverter as linhas de saída
Como eu disse, “A maioria dos comandos vem com uma opção para reverter a saída.”Se você sabe que um comando lhs específico tem uma opção, você não pode usar o tac. Afinal, -r é mais curto que - | tac.
Quando o desempenho é importante
Como eu disse, “Usar a opção reversa lhs pode ter um desempenho melhor do que tac.”Se você está procurando espremer alguns segundos em um script bash ou está lidando com arquivos maiores que requerem tempo para ler, você não pode usar o tac.
Ajuda tac
Executar o comando help para tac ou man tac mostra o uso junto com as opções que podem ser usadas. Aqui está o que esperar.
Comandos
tac --helpResultado
Versão Tac
Qual versão eu sou?
Você é a última versão de si mesmo. No entanto, no caso de qual versão do seu tac, há uma opção para que.
Comandos
tac - versãoResultado
Notas
Se você estiver usando tac no FreeBSD ou macOS, a opção longa para a versão pode não estar disponível. Nesse caso, tente -v ou man tac. Se você já tentou me avise. estou curioso. Obrigado
Opções tac
Além da ajuda e da versão, o tac não tem muitas opções. Pelo que tem, você com certeza descobrirá que tac não é qualquer velho gato reverso.
Opção antes tacada
A opção -b permite que você mude como o separador é anexado na saída. Por padrão, o separador de nova linha é anexado após cada linha.
Eu sei que é confuso. Vamos dividir por exemplo.
Primeiro, vamos ver como fica nossa saída antes de usar tac -b.
Comandos
seq 10Resultado
Agora vamos ver em que nossa saída se transforma depois de usar tac sem -b.
Comandos
seq 10 | tacResultado
Agora vamos ver no que a saída se transforma usando tac -b.
Comandos
seq 10 | tac -bResultado
Opção de separador de tac
A opção do separador -s 'literal string' permite- lhe especificar o carácter ou sequência de caracteres usados pelo tac para distinguir as linhas. Por padrão, o caractere de nova linha ('0a' em hexadecimal) é usado.
Como usar a opção do separador tac não é óbvio no início. No entanto, uma vez que você sabe que está lá, é difícil não tentar usá-lo.
Considere o seguinte exemplo, operando em linhas representadas em hexadecimal.
Comandos
seq 20 | xxd -ps | tac -s '0a' | xxd -ps -rResultado
Notas
(1) Pode parecer trivial como usar a seq 20 | comando tac, no entanto, nesse caso, não perdemos tempo trabalhando no fluxo de saída em hexadecimal. Usar este padrão é útil quando a separação não é algo trivial como o caractere de nova linha, como o byte zero.
Agora tente menos usar tac em algo um pouco menos bruto e mais meta como HTML simples.
Considere o seguinte arquivo.
Arquivo
UMAB
C
Comandos
arquivo () echo -e "AB
C
";
arquivo | tac -s "
"
Resultado
Conseguimos converter a página HTML
UMAB
C
para dentro
CB
UMA
usando tac.
Suponha que você precise fazer algo um pouco mais complicado, como tratar qualquer tag como um separador tac. Nesse caso, você não vai se dar bem usando apenas a opção do separador. É aí que entra a opção regex. Combinado com a opção de separador, permite que você faça mais com o comando tac do que inverter uma linha em um arquivo. Aqui está como.
Opção tac regex
A opção regex -r -s 'regex' permite que você especifique que a string separadora deve ser tratada como uma expressão regular.
Como usar a opção tac regex é tão simples quanto adicionar a opção -r antes ou depois do separador.
Considere o exemplo anterior usando a opção regex em conjunto com a opção separator. Vamos fazer o tac tratar qualquer tag de marcação como um separador.
Arquivo
funções simples
As funções são simples no bash. Pelo menos este é. Ele coloca uma corda na tela.
Comandos
função simples
()
eco
o mais simples possível função simples
Fonte: https: // temptemp3.github.funções io / bash
Comandos
Arquivo ()eco '
funções simples
As funções são simples no bash. Pelo menos este é. Coloca um
corda na tela.
Comandos
função simples
()
eco o mais simples possível
função simples
arquivo | tac -r -s "] *."
Resultado
Conseguimos converter a página HTML revertendo o arquivo usando tags HTML. Se você olhar os detalhes, perceberá que ainda não é perfeito.
Comando Tac em puro bash
Aqui está uma versão primitiva do tac implement em bash puro que inverte as linhas canalizadas por um comando lhs. As versões futuras são deixadas como um exercício.
#!/ bin / bash## tac
## versão 0.0.1 - inicial
###############################################################
tac ()
local -a arr
local -i i
mapfile arr -
i = "$ # arr [@]"
enquanto [$ i -ge 0]
Faz
echo $ arr [i]
deixe i- = 1
feito
###############################################################
tac
###############################################################
Fonte: https: // github.com / temptemp3 / ba.sh / blob / master / tac.sh
Comando Tac usando outros comandos
Aqui estão algumas versões primitivas do tac implementar usando outros comandos que invertem as linhas canalizadas por um comando lhs. As versões futuras são deixadas como um exercício.
Antes de começarmos, feche os olhos e pense: "O que poderia ser usado para implementar uma versão primitiva do tac?”
Muitos comandos vêm à mente, mas vou me concentrar naqueles para os quais temos espaço.
embasbacar
Semelhante ao comando Tac no exemplo do bash puro, para implementar tac, primeiro armazenaríamos as linhas lidas para serem reproduzidas ao contrário após todas as linhas serem lidas. Aqui está como ficaria usando o gawk.
gawk 'linha [++ linha [0]] = $ (0) END para (i = 0; i
Agora tente usar no comando lhs seq 10.
seq 10 | gawk 'linha [++ linha [0]] = $ (0) END para (i = 0; i
Como você esperaria, a saída é
Exercícios
1. A função lhs () seq 10; lista os inteiros de 1 a 10. Escreva um comando rhs de forma que lhs | rhs é igual a 10864213579 usando apenas tac (Dica: consulte Tac antes do exemplo de opção)
2. Reverte a saída de rhs () find -mindepth 1 -maxdepth 1 -print0; usando tac (Dica: veja o exemplo de opção do separador Tac)
3. Estender tac.sh (no comando Tac em bash puro) para se comportar exatamente como tac. Você precisará adicionar opções e testar seu comportamento.
4. Implementar uma versão primitiva do tac em bash puro como uma função recursiva.
TL; DR
Mais uma vez, gostei de escrever o comando Bash tac. Depois de ler, espero que você concorde que há mais coisas no tac do que você pensava. Além disso, depois de tentar fazer as coisas da maneira mais difícil perto do fundo, espero que você saiba como o comando tac pode ser útil. Se alguém conseguir fazer algum dos exercícios ou precisar de ajuda com o dever de casa, me avise. Obrigado,