chaf is a text filtering tool with the following features:
- Logical expressions for condition specification
- Instead of "searching" like
grep, it "excludes" specified lines - Supports standard input/output, making it pipe-friendly
- Uses stdin when no input file is provided
- Invert exclusion with
--invertto act likegrep - Display summary report with
--report - Not as fast as
grep, but can process ~10 million lines in a few seconds
While grep -v is convenient, expressing complex exclusion rules becomes unreadable.
For example: "Exclude DEBUG, but keep [DEBUG] connect DB"
Such conditions are difficult to express clearly with grep.
chaf lets you write exclusion logic with logical expressions — a filter dedicated to exclusion.
## 🖥️ Example Usage
```bash
$ cat logs.txt
error: failed to connect
warn: deprecated API used
debug: retrying connection
info: connection established
warn: low disk space
error: timeout while waiting for response
# Lines containing "debug" or "warn" are excluded
$ chaf 'debug | warn' logs.txt
error: failed to connect
info: connection established
error: timeout while waiting for response
# Excludes:
# - Lines containing "debug"
# - Lines containing "warn" unless they also contain "API"
$ chaf 'debug | (warn & !API)' logs.txt
error: failed to connect
warn: deprecated API used
info: connection established
error: timeout while waiting for response
# Explanation:
# → "warn: low disk space" is excluded (no "API")
# → "warn: deprecated API used" is kept (contains "API")
# Invert mode: show only lines that match the condition
# Includes:
# - Lines containing "debug"
# - Lines containing "warn" unless they also contain "API"
$ chaf --invert 'debug | (warn & !API)' logs.txt
debug: retrying connection
warn: low disk spacecargo install --git https://github.com/nakkiy/chafThe chaf binary will be placed in:
$HOME/.cargo/bin/chafIf your PATH doesn't include that directory, add it like so:
export PATH="$HOME/.cargo/bin:$PATH"chaf [OPTIONS] <QUERY> [FILE]
| Syntax | Meaning |
|---|---|
aaa & bbb |
AND — match lines containing both aaa and bbb (exclude) |
aaa | bbb |
OR — match lines containing either aaa or bbb (exclude) |
!aaa |
NOT — match lines not containing aaa (exclude) |
(aaa | bbb), (aaa & bbb) |
Use parentheses to group and control precedence |
1. Parentheses "()"
2. NOT "!"
3. AND "&"
4. OR "|"
| Option | Description |
|---|---|
--report, -r |
Show summary: total lines, excluded lines, output lines |
--invert, -i |
Invert filter to show matching lines only (like grep) |
--help, -h |
Show help message |
--version, -v |
Show version information |
Tip: You can redirect output to a file with > if needed.
Contributions for improvements or feature expansions are very welcome!
Feel free to open an issue or PR if you have any feedback or suggestions —
no matter how small, we'd love to hear from you.
- Wildcard support (
*,?) for more flexible pattern matching
This project is dual-licensed under:
- MIT License
https://opensource.org/licenses/MIT - Apache License 2.0
https://www.apache.org/licenses/LICENSE-2.0
Use whichever license suits your needs.