# google-terminal-search

Pesquise no Google direto do terminal — zero dependências, saída pipe-friendly.

- URL: https://fernando.moretes.com/open-source/google-terminal-search

- Markdown: https://fernando.moretes.com/open-source/google-terminal-search/guide.md?lang=pt

- GitHub: https://github.com/fernandofatech/google-terminal-search

- Homepage: https://fernando.moretes.com

- Language: Shell

- Topics: automation, bash, cli, developer-tools, google-search, moretes, portfolio, productivity, terminal

- Stars: 0

- Forks: 0

- Updated: 2026-05-16T01:14:57Z

---

google-terminal-search é um utilitário de linha de comando em Bash puro que executa pesquisas no Google diretamente do terminal, retornando resultados parseáveis e prontos para uso em pipelines de shell.

## O que é e por que existe

Este repositório nasceu de uma necessidade prática: sair do fluxo de trabalho no terminal para abrir um navegador e fazer uma busca rápida é uma interrupção pequena, mas constante. A ideia é eliminar essa fricção mantendo tudo na linha de comando.

O script é escrito inteiramente em Bash, sem dependências externas além das ferramentas padrão disponíveis em qualquer sistema Unix/Linux/macOS — `curl`, `sed`, `awk` e similares. Não há runtime para instalar, nenhum `npm install`, nenhum ambiente virtual Python. Você clona, dá permissão de execução e usa.

A saída é projetada para ser parseável: URLs e títulos são impressos de forma estruturada, o que significa que você pode encadear o resultado com `grep`, `head`, `fzf`, `xargs` ou qualquer outra ferramenta do seu pipeline habitual. O objetivo não é substituir um navegador — é dar acesso rápido a resultados de busca sem sair do contexto em que você já está trabalhando.

Este projeto faz parte do ecossistema público de portfólio de Fernando Azevedo, com foco em automação, produtividade para desenvolvedores e boas práticas de engenharia pragmática.

## Características principais

- **Zero dependências** — funciona com as ferramentas padrão de qualquer sistema Unix/Linux/macOS; nada para instalar além do próprio script.
- **Saída parseável** — resultados impressos de forma estruturada, adequados para processamento posterior com `grep`, `awk`, `fzf` ou `xargs`.
- **Pipe-friendly** — projetado para se encaixar em pipelines de shell existentes sem comportamento especial ou saída colorida que quebre automação.
- **Sem etapa de build** — um único `chmod +x` e o script está pronto para uso; sem compilação, sem empacotamento.
- **Licença MIT** — uso livre para projetos pessoais e profissionais, com atribuição.

## Como o utilitário funciona

Fluxo de execução do google-terminal-search: do input do usuário até os resultados parseáveis no terminal.

### 💻 Terminal

- Developer shell session (user)
- main.sh entry point (compute)

### ⚙️ Script Internals

- Argument parser (compute)
- Query builder (compute)
- curl HTTP fetch (edge)
- sed/awk result parser (compute)

### 🌐 External

- Google Search (external)

### 📤 Output

- stdout parseable text (data)
- Downstream grep/fzf/xargs (compute)

### Fluxos

- user -> main_sh: executa com query
- main_sh -> arg_parse: passa args
- arg_parse -> query_build: termos validados
- query_build -> http_fetch: URL codificada
- http_fetch -> google: requisição HTTP
- google -> http_fetch: HTML de resposta
- http_fetch -> parser: HTML bruto
- parser -> stdout: URLs + títulos
- stdout -> pipe: pipe opcional

## Como funciona internamente

O fluxo é direto. `main.sh` recebe os termos de busca como argumentos posicionais, constrói uma URL de pesquisa do Google com os termos devidamente codificados para URL (espaços viram `+` ou `%20`, caracteres especiais são escapados), e usa `curl` para buscar o HTML da página de resultados.

O HTML retornado é então processado por expressões regulares via `sed` e/ou `awk` para extrair os elementos relevantes — tipicamente os títulos dos resultados e as URLs correspondentes. Essa etapa de parsing é a parte mais sensível do script: o HTML do Google não é uma API estável, e mudanças na estrutura da página podem exigir ajustes nas expressões regulares.

A saída vai para `stdout` em formato estruturado, o que permite uso imediato em pipelines. Por exemplo, você pode pegar apenas a primeira URL retornada com `head -1`, filtrar resultados por domínio com `grep`, ou apresentar uma lista interativa com `fzf` para seleção e abertura no navegador via `xopen` ou `open`.

Não há estado persistente, sem arquivos de configuração obrigatórios, sem cache. Cada execução é independente. Isso mantém o script simples e auditável — você pode ler o código inteiro em poucos minutos e entender exatamente o que está acontecendo.

## Instalação e uso

1. **Pré-requisitos** — Bash 4+ (macOS usa Bash 3 por padrão — instale via `brew install bash` se necessário), `curl` disponível no PATH. Nenhuma outra dependência é necessária.

2. **Clonar o repositório** — Clone o repositório para um diretório local de sua escolha.

3. **Dar permissão de execução** — Torne os scripts executáveis com `chmod +x`. Não há etapa de build ou compilação.

4. **Executar uma busca** — Passe os termos de busca como argumentos para `main.sh`. Termos com espaços devem estar entre aspas.

5. **Usar em pipelines** — Encadeie a saída com outras ferramentas de shell. Por exemplo, `./main.sh 'bash scripting' | head -3` retorna os três primeiros resultados, ou `./main.sh 'aws cli' | grep 'docs.aws'` filtra por domínio.

6. **Opcional: adicionar ao PATH** — Para acesso global, crie um symlink ou copie o script para um diretório no seu PATH, como `~/.local/bin/gsearch`. Adicione um alias em `~/.bashrc` ou `~/.zshrc` se preferir um nome mais curto.

_Instalação completa e exemplos de uso_

```bash
# 1. Clone
git clone https://github.com/fernandofatech/google-terminal-search.git
cd google-terminal-search

# 2. Set execute permission
chmod +x *.sh

# 3. Basic search
./main.sh 'bash string manipulation'

# 4. Pipe to head — get only the first 5 results
./main.sh 'aws s3 sync options' | head -5

# 5. Filter results by domain
./main.sh 'terraform aws provider' | grep 'registry.terraform.io'

# 6. Interactive selection with fzf (if installed)
./main.sh 'linux cron syntax' | fzf

# 7. Open first result in default browser (macOS/Linux)
./main.sh 'jq tutorial' | head -1 | xargs open

# 8. Optional: install globally
ln -s "$(pwd)/main.sh" ~/.local/bin/gsearch
# Then from anywhere:
gsearch 'event-driven architecture patterns'
```

> **Estabilidade do parsing:** O Google não expõe uma API pública estável para scraping de resultados de busca. O HTML da página de resultados muda periodicamente, o que pode quebrar as expressões regulares usadas pelo script. Se os resultados parecerem vazios ou malformados após uma atualização do Google, é provável que as expressões precisem de ajuste. Verifique as issues abertas no repositório ou inspecione o HTML retornado por `curl` diretamente para diagnosticar.

> **Integração com fzf:** A combinação mais útil que encontrei no dia a dia é `./main.sh 'query' | fzf | xargs open`. O `fzf` apresenta os resultados em uma lista interativa fuzzy-searchable, você seleciona com Enter, e o `xargs open` (ou `xdg-open` no Linux) abre a URL no navegador padrão. É o fluxo mais próximo de uma busca real sem sair do terminal.

## Perguntas frequentes

### Preciso de uma chave de API do Google?

Não. O script faz scraping direto da página de resultados do Google via `curl`, sem usar a Google Custom Search API. Isso significa zero custo e zero configuração de credenciais, mas também implica nas limitações de estabilidade de parsing descritas acima.

### Funciona no macOS?

Sim, com a ressalva de que o macOS vem com Bash 3.2 por padrão (por razões de licença). Se o script usar recursos do Bash 4+, instale uma versão mais recente via Homebrew: `brew install bash`. O `curl` já vem instalado no macOS.

### O Google pode bloquear as requisições?

Sim. O Google detecta scraping automatizado e pode retornar um CAPTCHA ou erro 429 se as requisições forem muito frequentes. Para uso ocasional e pontual, o script funciona bem. Para uso intensivo ou automatizado em escala, considere a Google Custom Search JSON API oficial.

### Posso usar em scripts de CI/CD?

Tecnicamente sim, mas não é o uso recomendado. Pipelines de CI executam em ambientes controlados onde a estabilidade é crítica, e a dependência em scraping de HTML não é confiável o suficiente para esse contexto. Use a API oficial do Google se precisar de buscas programáticas em automação.

## Para quem é este projeto

Este utilitário é para desenvolvedores que vivem no terminal e querem reduzir a fricção de buscas rápidas sem instalar nada pesado. Se você já usa `fzf`, `ripgrep`, `jq` e similares como parte do seu fluxo de trabalho diário, `google-terminal-search` se encaixa naturalmente nesse ecossistema.

Não é uma ferramenta para uso em produção ou automação crítica — a dependência em scraping de HTML torna isso inadequado. Mas para consultas ad-hoc durante desenvolvimento, depuração ou pesquisa, elimina uma troca de contexto desnecessária.

O código é curto, legível e auditável. Se você está aprendendo shell scripting, é também um bom exemplo de como estruturar um utilitário CLI em Bash: parsing de argumentos, construção de URLs, fetch com `curl`, e processamento de texto com `sed`/`awk`. Faz parte do meu portfólio público precisamente porque demonstra que ferramentas simples, bem executadas, têm valor real.

## Referências

- [fernandofatech/google-terminal-search — GitHub](https://github.com/fernandofatech/google-terminal-search)
- [Fernando Azevedo — Portfolio](https://fernando.moretes.com)
- [fzf — command-line fuzzy finder](https://github.com/junegunn/fzf)
- [Google Custom Search JSON API (official alternative)](https://developers.google.com/custom-search/v1/overview)
- [Bash Reference Manual — GNU Project](https://www.gnu.org/software/bash/manual/bash.html)

## Links

- [GitHub repository](https://github.com/fernandofatech/google-terminal-search)
- [Homepage](https://fernando.moretes.com)
