Como posso usar o grep para pesquisar apenas na primeira linha de arquivos de uma string específica?

2

Como posso usar o grep para encontrar uma string em arquivos, mas apenas pesquisar na primeira linha desses arquivos?

    
por Michiel Pater 23.03.2015 / 14:23

7 respostas

2

Eu implementei o comentário do @Rob e consegui obter o resultado desejado.

Substitua string pela sua string.

grep -Rin "string" . | grep ":1:.*string" > result.txt

Isso faz uma pesquisa recursiva sem distinção entre maiúsculas e minúsculas para string no diretório atual e imprime os números de linha. Em seguida, ele procura ocorrências em arquivos que estão na linha 1 e salva a saída em um arquivo chamado result.txt .

    
por 23.03.2015 / 16:38
4

Mais duas alternativas:

com awk

awk '{if ($0~"pattern") print $0; nextfile;}' mydir/*

ou se a sua versão awk não suporta nextfile (graças à sugestão de Stéphane Chazelas):

awk 'FNR==1{if ($0~"pattern") print $0;}' mydir/*

irá ler apenas a primeira linha antes de mudar para o próximo arquivo, e imprimi-lo apenas se corresponder a "pattern" .

As vantagens são que é possível ajustar o campo no qual pesquisar o padrão (usando, por exemplo, $2 para pesquisar apenas no segundo campo) e a saída (por exemplo, $3 para imprimir o terceiro campo ou FILENAME , ou até mixar.

Observe que com a versão FNR (número do registro de entrada atual, ou seja, o número da linha) você pode ajustar mais a (s) linha (s) na qual deseja grep: FNR==3 para a terceira linha, FNR<10 para as 10 primeiras linhas, etc. (Eu acho que, neste caso, se você está lidando com arquivos muito grandes e sua versão awk suporta, você pode querer misturar FNR com nextfile para melhorar o desempenho).

Com head , mantendo nomes de arquivo

head -n1 -v mydir/files*|grep -B1 pattern
A opção

-v de head imprimirá nomes de arquivos, e a opção -B1 de grep imprimirá a linha anterior de linhas correspondentes - ou seja, os nomes dos arquivos. Se você precisa apenas dos nomes dos arquivos, você pode canalizá-lo ainda mais para grep :

head -n1 -v mydir/*|grep -B1 pattern|grep ==>

Como notado por don_crissti nos comentários, tenha cuidado com os nomes de arquivos que correspondem ao padrão, embora…

    
por 06.04.2017 / 16:00
1

Aqui está um perl onliner para fazer exatamente isso

perl -ne 'print if /MY_SEARCH_STRING/; exit' myfile.txt

Isso verificará se a palavra-chave MY_SEARCH_STRING está presente na primeira linha do arquivo myfile.txt . Se você precisar pesquisar em todo o arquivo, basta remover exit do oneliner.

    
por 24.03.2015 / 11:30
0

Aqui está um exemplo (ruim) de um script em perl que faria algo assim:

#!/usr/bin/perl -w

foreach (@ARGV) {
    my $filename = $_;
    open my $file, '<', $filename; 
    my $line = <$file>; 
    close $file;

    print "$filename\n" if $line =~ /your-match-text/;
}
    
por 23.03.2015 / 15:50
0

Tente algo assim. Crie o arquivo finder.sh com este conteúdo. Altere os parâmetros no arquivo para atender às suas necessidades.

#!/bin/bash

# Where to search
DIR="/path/search/dir"

# Search string
SEARCH="my-string"

FILES=$(find "$DIR" -type f)

for F in $FILES; do
   head -1 $F | grep -w "$SEARCH"
done

Salve o arquivo e chmod + x finder.sh

Execute o arquivo ./finder.sh

Nota: se você for procurar em arquivos com privilégios de root, precisará usar sudo ou usuário root.

    
por 23.03.2015 / 15:54
0

Você quer a lista de strings completas como resultado ou deseja uma lista de arquivos que contenham a string? Isso procuraria a linha número um (-n1) dos scripts shell (*. Sh) e coletaria as strings contendo 'bash':

head -n1 *.sh | grep bash > fullstring.txt

fullstring.txt conteria algo assim:

#!/bin/bash
#!/bin/bash
    
por 24.03.2015 / 15:41
0

Tente:

$ case "$(head -n 1 < file)" in (*pattern*) echo Match ;; esac
Match
    
por 24.03.2015 / 16:48