Skip to main content

Documentation Index

Fetch the complete documentation index at: https://hackbook.dudji.com/llms.txt

Use this file to discover all available pages before exploring further.

Raw command output is noise. Your job is to extract the signal. Master these tools and you’ll spend less time staring at walls of text and more time finding what matters.

The Mindset

Linux tools follow the Unix philosophy: each command does one thing well, and you chain them together with pipes. The real power isn’t in any single command — it’s in combining them.

File Descriptors & Redirection

Before filtering, understand how data flows in Linux. Every process has three standard streams:
FDNameDescription
0STDINInput fed into a program
1STDOUTNormal output
2STDERRError output
Think of file descriptors like a ticket system — the OS uses the number to know which stream to interact with.

Redirect Output

# Redirect STDOUT to a file (overwrites)
find /etc/ -name shadow > results.txt

# Append STDOUT to an existing file
find /etc/ -name passwd >> results.txt

# Redirect STDERR to /dev/null (silence errors)
find / -name "*.conf" 2>/dev/null

# Redirect STDOUT and STDERR to separate files
find /etc/ -name shadow 1>results.txt 2>errors.txt

# Redirect a file into a command as STDIN
cat < results.txt

Pipes

Pipes (|) take the STDOUT of one command and feed it as STDIN to the next. This is how you build processing chains.
# Find systemd config files, suppress errors, count results
find /etc/ -name "*.conf" 2>/dev/null | grep systemd | wc -l
2>/dev/null is your best friend. Add it to the end of almost every find or enumeration command to keep your output clean.

Filtering & Searching

grep — Pattern Matching

The most-used filtering tool. Searches for lines matching a pattern.
# Find users with bash shell
cat /etc/passwd | grep "/bin/bash"

# Exclude lines matching a pattern (-v = invert)
cat /etc/passwd | grep -v "nologin\|false"

# Case-insensitive search
grep -i "password" config.php

# Recursive search through a directory
grep -r "password" /var/www/ 2>/dev/null

# Show line numbers
grep -n "root" /etc/passwd

# Show only the matching part (not the whole line)
grep -o "password=[^ ]*" config.txt

# Extended regex (use | for OR, + for one-or-more)
grep -E "(password|passwd|secret|key)" config.php
Pentest one-liners with grep:
# Hunt for credentials in web configs
grep -r "password" /var/www/ 2>/dev/null
grep -r "DB_PASS\|db_password\|mysqli" /var/www/ 2>/dev/null

# Find cleartext passwords in logs
grep -i "password" /var/log/auth.log 2>/dev/null

# Search bash history for sensitive commands
grep -i "password\|sudo\|ssh\|curl\|wget" ~/.bash_history

Transforming Output

cut — Extract Specific Fields

Splits lines by a delimiter and picks the columns you want.
# Extract just usernames from /etc/passwd (field 1, delimiter :)
cat /etc/passwd | grep -v "nologin\|false" | cut -d":" -f1

# root
# sync
# cry0l1t3
# htb-student

# Extract username AND shell (fields 1 and 7)
cut -d":" -f1,7 /etc/passwd

tr — Translate / Replace Characters

# Replace colons with spaces
cat /etc/passwd | tr ":" " "
# Before: root:x:0:0:root:/root:/bin/bash
# After:  root x 0 0 root /root /bin/bash

# Convert lowercase to uppercase
echo "hello world" | tr "[:lower:]" "[:upper:]"
# HELLO WORLD

# Delete characters
echo "hello 123" | tr -d "[:digit:]"
# hello

# Replace newlines with spaces (useful for compressing multi-line output)
cat /etc/passwd | cut -d: -f1 | tr "\n" " "
# root daemon bin sys sync cry0l1t3 htb-student

column — Align Output Into a Table

Makes messy output readable. Great after using tr to replace delimiters.
# Without column -t
cat /etc/passwd | grep -v "nologin\|false" | tr ":" " "
# root x 0 0 root /root /bin/bash
# cry0l1t3 x 1001 1001 /home/cry0l1t3 /bin/bash
# htb-student x 1002 1002 /home/htb-student /bin/bash

# With column -t
cat /etc/passwd | grep -v "nologin\|false" | tr ":" " " | column -t
# root         x  0     0     root  /root              /bin/bash
# cry0l1t3     x  1001  1001        /home/cry0l1t3     /bin/bash
# htb-student  x  1002  1002        /home/htb-student  /bin/bash


Power Tools

awk — Field-Based Processing

More powerful than cut — can print specific fields, do math, and filter simultaneously.
# Print first and last field of each line
cat /etc/passwd | grep -v "nologin\|false" | tr ":" " " | awk '{print $1, $NF}'

# root /bin/bash
# cry0l1t3 /bin/bash
# htb-student /bin/bash

# Print lines where field 3 (UID) equals 0 (root-level accounts)
awk -F: '$3 == 0 {print $1}' /etc/passwd

sed — Stream Editor (Find & Replace)

# Replace all occurrences of "bin" with "HTB"
cat /etc/passwd | sed 's/bin/HTB/g'

# Delete lines matching a pattern
sed '/nologin/d' /etc/passwd

# Print only lines matching a pattern
sed -n '/bash/p' /etc/passwd

Regular Expressions (RegEx)

RegEx lets you define flexible search patterns instead of literal strings.

Key Operators

OperatorDescriptionExample
.Any single characterp.ss matches pass, p4ss
*Zero or more of the previousba* matches b, ba, baa
+One or more of the previousba+ matches ba, baa
?Zero or one of the previouscolou?r matches color, colour
^Start of line^root — lines starting with root
$End of linebash$ — lines ending with bash
[abc]Any character in the set[aeiou] — any vowel
[a-z]Character range[0-9] — any digit
(a|b)OR — match a or b(bash|sh)
{2,4}Repeat 2 to 4 times[0-9]{1,3}

Examples with grep -E

# Lines containing "my" OR "false"
grep -E "(my|false)" /etc/passwd

# Lines containing BOTH "my" AND "false" (AND pattern)
grep -E "(my.*false)" /etc/passwd

# Find IP addresses in a log file
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" /var/log/auth.log

# Lines that do NOT start with #
grep -v "^#" /etc/ssh/sshd_config

# Lines ending with "yes"
grep -E "yes$" /etc/ssh/sshd_config

Quick Reference

ToolPrimary UseKey Flag
grepFilter lines by pattern-v invert, -r recursive, -E extended regex
cutExtract fields by delimiter-d delimiter, -f field number
trReplace or delete characters-d delete
awkField processing and logic'{print $1, $NF}'
sedFind and replace in streams's/old/new/g'
sortSort output-n numeric, -r reverse, -u unique
wcCount results-l lines
columnFormat output as table-t
head / tailFirst or last N lines-n number, -f follow
lessPage through outputq quit, / search

Next: Permission Analysis — reading permission strings, finding SUID misconfigs, and understanding what sticky bits mean for exploitation.