AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 733064
Accepted
mahmood
mahmood
Asked: 2023-01-26 04:14:03 +0800 CST2023-01-26 04:14:03 +0800 CST 2023-01-26 04:14:03 +0800 CST

Grep e find para obter a última correspondência em vários arquivos [duplicado]

  • 772
Esta pergunta já tem respostas aqui :
Encontre a última ocorrência de string em vários arquivos (5 respostas)
Fechado há 7 dias .

Suponha dois arquivos com o seguinte conteúdo:

$ cat ttest1.txt 
x = 1
x = 3
y = 5
$ cat ttest2.txt 
x = 4
x = 10
y = 3

Gostaria de grep recursivamente os arquivos xe imprimir a última instância em cada arquivo. Assim, a saída desejada é

ttest1.txt:x = 3
ttest2.txt:x = 10

A seguinte combinação de grepe tailfunciona para um arquivo, mas não para vários arquivos.

$ grep x ttest1.txt 
x = 1
x = 3
$ grep x ttest1.txt | tail -n 1
x = 3
$ grep -r x ttest* | tail -n 1
ttest2.txt:x = 10

Como posso consertar isso?

grep
  • 4 4 respostas
  • 189 Views

4 respostas

  • Voted
  1. Best Answer
    Ljm Dullaart
    2023-01-26T04:27:09+08:002023-01-26T04:27:09+08:00

    Quando você faz

    grep -r x ttest* 
    

    você obtém um único fluxo com

    ttest1.txt:x = 1
    ttest1.txt:x = 3
    ttest2.txt:x = 4
    ttest2.txt:x = 10
    

    Se você tail -1isso, você obtém o arquivo ttest2.txt:x = 10. Isso é o esperado.

    Mas você deseja que a grep | tailcombinação seja feita em cada arquivo separado, não no fluxo consolidado. Então: faça isso em cada arquivo separado.

    for f in ttest* ; do
        grep x "$f" | tail -n 1
    done
    
    • 4
  2. Freddy
    2023-01-26T05:15:49+08:002023-01-26T05:15:49+08:00

    Usando awk, você pode usar uma string regexp (consulte Dynamic Regexps ), lembre-se da última correspondência de cada arquivo de entrada e imprima-a:

    $ awk -v regex="x" 'FNR==1 && m!=""{print m;m=""} 
            $0 ~ regex{m=FILENAME ":" $0}
            END{if (m!="")print m}' ttest*
    ttest1.txt:x = 3
    ttest2.txt:x = 10
    

    Recursivamente em combinação com find:

    $ find . -name 'ttest*' -type f -exec awk -v regex="x" '
            FNR==1 && m!=""{print m;m=""}
            $0 ~ regex{m=FILENAME ":" $0}
            END{if (m!="")print m}' {} +
    ./ttest1.txt:x = 3
    ./ttest2.txt:x = 10
    
    • 4
  3. Thor
    2023-01-26T08:55:00+08:002023-01-26T08:55:00+08:00

    Com GNU sed:

    sed -sn '/x/h; $ { x; F; p; }' ttest*
    

    Saída:

    ttest1.txt
    x = 3
    ttest2.txt
    x = 10
    

    Passe isso paste -d: - -se quiser os resultados em uma linha. Caso você não queira a saída de arquivos que não contenham, xinclua uma verificação após o xcomando -change, por exemplo:{ x; /./ { F; p; z; }; }

    • 2
  4. dhm
    2023-01-26T05:10:01+08:002023-01-26T05:10:01+08:00

    Aqui está uma maneira de fazer isso:

    grep  x <yourpath>*  | tac | awk  'BEGIN{FS=":"};seen!=$1{print $0;seen=$1}'
    

    tac inverte os resultados do grep em preparação para a operação awk, que por sua vez imprime apenas a primeira ocorrência em cada arquivo

    • 0

relate perguntas

  • resultados inesperados de `service | grep`

  • Leia o arquivo de texto com palavras e sua contagem de ocorrências e saída de impressão classificada

  • Comando ls | grep mostrando apenas diretórios (quando também deveria mostrar arquivos)

  • quando o grep conta e quando não

  • grep --line-buffered até X linhas?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve