eu queria conseguir algo parecido com isso
grep -v '^$' <myfile-with-blank-lines-at-the-end> | tail -n 1
Basicamente, eu tenho um arquivo com um número único, seguido de uma vírgula e quero pegar o último id, mesmo que haja linhas vazias abaixo. O objetivo é usar apenas cauda
Não tem jeito.
Análise
As duas ferramentas que você usou foram criadas com a filosofia Unix em mente:
No seu exemplo, eles trabalham juntos, passando um fluxo de texto um para o outro. Cada um faz a sua "única coisa":
grep
coisa de é "pesquisar um arquivo para um padrão" ,tail
coisa de é "copiar a última parte de um arquivo" .Essas coisas são ortogonais; não há nenhum componente comum.
tail
não se importa com o conteúdo, em particular não se importa se alguma linha estiver vazia. Na verdade, você não pode fazer o que quiser com a solatail
. Se alguém se expandissetail
para lidar com o seu caso, eu diria que é a Coisa Errada.grep
não se importa se chegou à última linha. Existe a\Z
âncora projetada para corresponder "no final da string, bem como antes da quebra de linha final na string (se houver)" ou mesmo "no final da string, bem como antes de todas as quebras de linha à direita na string (se houver)" (dependendo do sabor, veja isto ). O último seria útil para o seu caso, masgrep
não parece suportar\Z
(ou algo semelhante).Ferramentas mais gerais
Existem ferramentas cujas "coisas únicas" são amplas o suficiente para cobrir as duas tarefas. Você certamente pode usar uma ferramenta de processamento de texto de propósito geral como
sed
ouawk
.De fato, cada um dos comandos a seguir faz (quase) o que seu comando original faz:
Quase, porque se não houver linha não vazia (o que também inclui o caso de entrada totalmente vazia), haverá uma linha vazia na saída. Seu comando original não produz nada nesse caso. Precisamos de alguma lógica para realmente imitar seu comando. Assim:
Mesmo sem essa lógica adicional, acho as duas soluções menos concisas que a sua
grep … | tail …
. Nenhuma surpresa aqui. Scripts muito simples (ou/e opções padrão) para uma ferramenta geral provavelmente não farão nada de interessante; enquanto uma boa ferramenta especializada é projetada para realizar sua tarefa mais comum com uma sintaxe bastante simples.Isso significa que você não deve esperar encontrar uma única ferramenta geral que permita fazer o que deseja com a mesma facilidade
grep … | tail …
. Se o pipeline for longo e complexo, entãosed
ouawk
pode ser a melhor abordagem, uma abordagem simplificada. Mas seu caso de uso é "procure por linhas (não) que correspondam a um padrão e escolha a última". É exatamente para isso quegrep
etail
servem.BEIJO
Mantenha-o simples e direto . Seu comando original é muito direto. É preciso apenas algum conhecimento básico das duas ferramentas para entender o que está acontecendo. Eu vejo
grep … | tail …
e imediatamente posso dizer que estamos procurando por algum padrão e vamos escolher algumas últimas linhas. Porque é isso que essas ferramentas fazem, respectivamente.Eu vejo
awk …
oused …
e pode ser qualquer coisa. Mesmo que alguma linguagem (esotérica? Golfe?) nos permita usar um código mais conciso para sua tarefa específica, eu ainda optaria porgrep … | tail …
, especialmente se o código durar e for mantido.Melhoria
Posso simplificar um pouco seu comando original, mas sua forma de
grep … | tail …
stands: