Mesmo se você usar a linha de comando Linux moderadamente, você deve ter se deparado com o comando grep
.
Grep é usado para procurar um padrão em um arquivo de texto. Ele pode fazer coisas poderosas loucas, como procurar novas linhas, procurar linhas onde não há caracteres maiúsculos, procurar linhas onde o caracteres inicial é um número, e muito, muito mais.
Mas grep
funciona apenas em arquivos de texto simples. Não funcionará em arquivos PDF porque são arquivos binários.
É aqui que o pdfgrep
entra em cena. Funciona como o grep
para arquivos PDF. Vamos dar uma olhada nisso.
Conheça pdfgrep
: busca grep
com regex em arquivos PDF
pdfgrep tenta ser compatível com GNU Grep, onde faz sentido. Várias de suas opções favoritas do grep são suportadas (como -r
, -i
, -n
ou -c
). Você pode usar para procurar texto dentro do conteúdo de arquivos PDF.
Embora não venha pré-instalado como o grep
, ele está disponível nos repositórios da maioria das distribuições Linux.
Você pode usar o gerenciador de pacotes da sua distribuição para instalar esta ferramenta incrível.
Para usuários de distribuições baseadas em Ubuntu e Debian, use o comando apt
:
sudo apt install pdfgrep
Para Red Hat e Fedora, você pode usar o comando dnf
:
sudo dnf install pdfgrep
A propósito, você usa o Arch? Você pode usar o comando pacman:
sudo pacman -S pdfgrep
Usando o comando pdfgrep
Agora que pdfgrep
está instalado, veja como usá-lo em cenários mais comuns.
Se você tem alguma experiência com grep
, então a maioria das opções vai ser familiar para você.
Para demonstrar, usaremos o livro PDF The Linux Command Line, escrito por William Shotts. É um dos poucos livros Linux que estão legalmente disponíveis gratuitamente.
A sintaxe para pdfgrep
é a seguinte:
pdfgrep [PADRAO] [ARQUIVO.pdf]
Pesquisa normal
Vamos tentar fazer uma pesquisa básica pelo texto xdg
no arquivo PDF.
pdfgrep xdg TLCL-19.01.pdf
Isso resultou em apenas uma ocorrência.
Caso de busca insensível
Na maioria das vezes, o termo xdg
é usado com caracteres alfabéticos em maiúsculas. Então, vamos tentar fazer uma busca insensível. Para uma pesquisa insensível de caso, usaremos a opção --ignore-case
.
Você também pode usar a alternativa mais curta, que é -i
.
pdfgrep --ignore-case xdg TLCL-19.01.pdf
Como pode ver, tenho mais ocorrências depois de ligar o caso em busca insensível.
Obtenha uma contagem de todas as ocorrências
Às vezes, o usuário quer saber quantas correspondências foram encontradas da palavra. Vamos ver quantas vezes a palavra 'Linux' é mencionada (com correspondência insensível do caso).
A opção de usar neste cenário é --count
(ou -c
para abreviar).
pdfgrep --ignore-case linux TLCL-19.01.pdf --count
Agora o Linux foi mencionado 1200 vezes neste livro... Isso foi inesperado.
Mostrar número da página
Arquivos de texto regulares são arquivos monolíticos gigantes. Não há páginas. Mas um arquivo PDF tem páginas. Então, você pode ver onde o padrão foi encontrado e em qual página. Use a opção --page-number
para mostrar o número da página onde o padrão foi correspondido. Você também pode usar a opção -n
como uma alternativa mais curta.
Vamos ver como funciona com um exemplo. Quero ver as páginas onde a palavra awk
aparece. Adicionamos um espaço no final do padrão para evitar combinar com palavras como awkward
, obter ocorrências não intencionais seriam estranhas. Em vez de escapar do espaço com uma barra, você também pode incluí-la em uma única cotação awk
.
pdfgrep --page-number --ignore-case awk TLCL-19.01.pdf
A palavra awk
foi encontrada duas vezes na página número 333, uma na página 515 e mais uma vez na página 543 no arquivo PDF.
Mostrar contagem de ocorrências por página
Quer saber quantas ocorrências foram encontradas em qual página em vez de mostrar as ocorrências em si? Se você disse que sim, bem, é o seu dia de sorte!
Usar a opção --page-count
faz exatamente isso. Como uma alternativa mais curta, você usa a opção -p
. Quando você fornece esta opção para o pdfgrep
, presume-se que você solicitou -n
também.
Vamos dar uma olhada na aparência da saída. Por este exemplo, vamos ver onde o comando ln
é usado no livro.
pdfgrep --page-count ln TLCL-19.01.pdf
A saída é na forma de 'número de página: corresponde'. Isso significa que, na página número 4, o comando (ou melhor, "padrão") foi encontrado apenas uma vez. Mas na página número 57, pdfgrep
encontrou 4 ocorrências.
Obtendo algum contexto
Quando o número de ocorrências encontradas é bastante grande, é bom ter algum contexto. Para isso, pdfgrep
fornece algumas opções.
--after-context NUM
: Imprime NUM das linhas que vêm após as linhas correspondentes (ou usar-A
)--before-context NUM
: Imprime NUM de linhas que estejam antes das linhas correspondentes (ou use-B
)--context NUM
: Imprime NUM de linhas que antes e vêm após as linhas correspondentes (ou usar-C
)
Vamos encontrar XDG
no arquivo PDF, mas desta vez, com um pouco mais de contexto.
Contexto após ocorrências
Usando a opção --after-context
junto com um número, podemos ver quais linhas vêm após a correspondência. Abaixo está um exemplo de como ele se parece.
pdfgrep --after-context 2 XDG TLCL-19.01.pdf
Contexto antes das partidas
A mesma coisa pode ser feita para cenários quando você precisa saber quais linhas estão presentes antes da linha que corresponde. Nesse caso, use a opção --before-context
, juntamente com um número. Abaixo está um exemplo demonstrando o uso desta opção.
pdfgrep --before-context 2 XDG TLCL-19.01.pdf
Contexto em torno de ocorrências
Se você quiser ver quais linhas estão presentes antes e vir depois da linha que correspondeu, use a opção --context
e também forneça um número. Abaixo está um exemplo.
pdfgrep --context 2 XDG TLCL-19.01.pdf
Caching
Um arquivo PDF consiste em imagens, bem como texto. Quando você tem um arquivo PDF grande, pode levar algum tempo para pular outras mídias, extrair texto e, em seguida, fazer a pesquisa real. Fazê-lo com frequência e esperar cada vez pode ficar frustrante.
Por essa razão, existe a opção --cache
. Ele armazena o texto renderizado para acelerar o processo. Isso é especialmente perceptível em arquivos grandes.
pdfgrep --cache --ignore-case grep TLCL-19.01.pdf
Para mostrar a diferença de velocidade, usamos o comando time
. Olhe atentamente no momento indicado pelo valor real
.
Como você pode ver, os comandos que incluem opção de cache foram concluídos mais rápido do que os que não o incluíram.
Além disso, suprimimos a saída usando a opção --quiet
para conclusão mais rápida.
Arquivos PDF protegidos por senha
Sim, pdfgrep
suporta até mesmo arquivos protegidos por senha. Tudo o que você precisa fazer é usar a opção --password
, seguida pela senha.
Você pode usar esta opção da seguinte maneira:
pdfgrep --password [SENHA] [PADRAO] [ARQUIVO.pdf]
Conclusão
pdfgrep
é uma ferramenta muito útil se você está lidando com arquivos PDF e quer a funcionalidade de grep
, mas para arquivos PDF.