Linux: работа с текстом, поиск и обработка

Просмотр файлов, поиск по содержимому, замена, выборка колонок и сравнение

Просмотр файлов

КомандаВариантЧто делает
catcat file.txtВыводит весь файл.
cat -ncat -n file.txtС нумерацией строк.
cat -Acat -A file.txtПоказывает скрытые символы (табуляции как ^I, конец строки как $).
cat >>cat >> notes.txtДописать ввод в конец файла (завершение Ctrl+D).
tactac file.txtСтроки в обратном порядке.
headhead -n 20 file.txtПервые 20 строк.
head -chead -c 200 file.bin | xxdПервые 200 байт.
tail -ntail -n 50 app.logПоследние 50 строк.
tail -n +Ntail -n +10 file.txtСо строки 10 до конца.
tail -ftail -f app.logСледить за добавлением строк.
tail -Ftail -F app.logСледить, даже если файл пересоздан при ротации логов.
lessless file.txtПостраничный просмотр. Поиск по /, выход по q.
less +Fless +F app.logРежим слежения внутри less (Ctrl+C — вернуться к листанию).
less -Sless -S wide.csvНе переносить длинные строки.
moremore file.txtПростой постраничный просмотр, меньше возможностей, чем less.
wcwc -l file.txtКоличество строк. Также -w (слова), -c (байты), -m (символы).
nlnl -ba file.txtПронумеровать все строки, включая пустые.
column -tcolumn -t -s, data.csvВыровнять колонки по разделителю.
foldfold -w 80 text.txtПереносить строки на 80 символов.
revecho abc | revПеревернуть каждую строку.

grep: поиск по содержимому

КомандаВариантЧто делает
grepgrep "error" app.logСтроки, содержащие шаблон.
grep -igrep -i "error" app.logБез учёта регистра.
grep -vgrep -v "^#" nginx.confИнвертировать: строки, которые НЕ совпадают (без комментариев).
grep -ngrep -n "timeout" app.confПоказать номера строк.
grep -cgrep -c "GET" access.logТолько количество совпадений.
grep -ogrep -oE "[0-9]{1,3}(\.[0-9]{1,3}){3}" access.logВыводить только совпавшую часть (например, IP-адреса).
grep -wgrep -w "port" confСлово целиком, а не часть другого слова.
grep -xgrep -x "enabled" flags.txtСтрока целиком совпадает с шаблоном.
grep -rgrep -rn "DB_HOST" /srv/app/Рекурсивный поиск по папке.
grep -lgrep -rl "TODO" src/Только имена файлов с совпадениями.
grep -Lgrep -rL "license" src/Файлы, где совпадений нет.
grep -Egrep -E "error|fail|timeout" app.logРасширенные регулярные выражения (можно |, +, ?, {n}).
grep -Pgrep -P "\d{4}-\d{2}-\d{2}" app.logPerl-регулярки (lookahead и \d).
grep -A -B -Cgrep -C 3 "Exception" app.logКонтекст: -A после, -B до, -C с обеих сторон.
grep -mgrep -m 5 "ERROR" app.logОстановиться после 5 совпадений.
grep -qif grep -q "ok" status; then echo yes; fiБез вывода, только код возврата (удобно в скриптах).
grep --includegrep -r --include="*.conf" "listen" /etc/Искать только в файлах по шаблону.
grep --exclude-dirgrep -r --exclude-dir=.git "TODO" .Пропускать папки.
grep -egrep -e "warn" -e "error" app.logНесколько шаблонов сразу (логическое ИЛИ).

sed: потоковая обработка и замена

КомандаВариантЧто делает
sed 's/a/b/'sed 's/old/new/' fileЗаменить первое совпадение в каждой строке.
sed 's/…/…/g'sed 's/old/new/g' fileЗаменить все совпадения.
sed -ised -i 's/debug=true/debug=false/' app.confПравить файл на месте.
sed -i.baksed -i.bak 's/old/new/g' app.confПравить на месте и сохранить копию app.conf.bak.
sed -n 'N,Mp'sed -n '10,20p' fileВывести строки с 10 по 20.
sed -n '/…/,/…/p'sed -n '/START/,/END/p' fileВывести блок между двумя шаблонами.
sed '/…/d'sed '/^#/d' nginx.confУдалить строки по шаблону.
sed 'Nd'sed '1d' data.csvУдалить первую строку (заголовок).
sed '/…/a'sed '/listen/a\ server_name example.com;' nginx.confДобавить строку после совпадения.
sed '/…/i'sed '/^\[main\]/i # comment' conf.iniВставить строку перед совпадением.
sed -Esed -E 's/([0-9]+)-([0-9]+)/\2-\1/' fileРасширенные регулярки и группы захвата.
sed 'Nq'sed '5q' fileВывести первые 5 строк и выйти.
sed -esed -e 's/a/b/' -e 's/c/d/' fileНесколько правок за один проход.

awk: работа с колонками

КомандаВариантЧто делает
awk '{print $1}'awk '{print $1}' access.logПервая колонка (разделитель — пробелы).
awk -Fawk -F: '{print $1, $3}' /etc/passwdСвой разделитель (здесь двоеточие).
awk -F,awk -F, 'NR>1 {s+=$3} END {print s}' sales.csvСумма колонки в CSV, пропуская заголовок.
awk 'условие'awk -F: '$3 >= 1000' /etc/passwdФильтр по условию (пользователи с UID от 1000).
awk '/regexp/'awk '/ERROR/ {print $0}' app.logСтроки по регулярному выражению.
awk 'NR…'awk 'NR>=10 && NR<=20' fileДиапазон строк.
awk '{print NF}'awk '{print NF}' fileЧисло полей в каждой строке.
awk массивawk '{c[$9]++} END {for (k in c) print c[k], k}' access.logПодсчёт по ключу (здесь код ответа HTTP).
OFSawk -F, 'BEGIN{OFS="\t"} {$1=$1; print}' data.csvПоменять разделитель вывода.
awk -vawk -v min=100 '$2 > min' data.txtПередать переменную в awk.

cut, sort, uniq, tr

КомандаВариантЧто делает
cut -d… -f…cut -d: -f1,3 /etc/passwdВыбрать поля 1 и 3 с разделителем двоеточие.
cut -ccut -c1-15 fileСимволы с 1 по 15.
sortsort names.txtСортировка по алфавиту.
sort -nsort -n sizes.txtЧисловая сортировка.
sort -hdu -sh * | sort -hСортировка с суффиксами K, M, G.
sort -rsort -rn counts.txtОбратный порядок.
sort -ksort -k2,2n data.txtПо второй колонке как по числу.
sort -usort -u list.txtСортировка с удалением дубликатов.
sort -tsort -t, -k3 sales.csvСортировка CSV по третьей колонке.
uniqsort list.txt | uniqУдалить соседние дубликаты (нужна предварительная сортировка).
uniq -csort ips.txt | uniq -c | sort -rn | headТоп повторяющихся строк.
uniq -dsort list | uniq -dТолько строки, встречающиеся более одного раза.
uniq -usort list | uniq -uТолько уникальные строки.
trecho abc | tr 'a-z' 'A-Z'Замена символов.
tr -dtr -d '\r' < win.txt > unix.txtУдалить символы (например, Windows-переводы строк).
tr -str -s ' ' < fileСжать повторяющиеся пробелы.

Сравнение и объединение

КомандаВариантЧто делает
diffdiff a.conf b.confРазличия построчно.
diff -udiff -u old.conf new.confВ формате unified (как в патчах и git).
diff -rdiff -r dir1/ dir2/Сравнить папки целиком.
diff -qdiff -rq dir1/ dir2/Только сообщить, что различается.
diff -wdiff -w a bИгнорировать пробелы.
cmpcmp backup.iso original.isoПобайтовое сравнение, показывает первое отличие.
commcomm -12 sorted1 sorted2Общие строки двух отсортированных файлов (-23 — только в первом).
pastepaste names.txt emails.txtСклеить файлы построчно через табуляцию.
joinjoin -t: users.txt groups.txtОбъединить по общему ключу (файлы отсортированы по нему).

Потоки, xargs и разбиение

КомандаВариантЧто делает
teemake 2>&1 | tee build.logВывести на экран и записать в файл одновременно.
tee -acmd | tee -a journal.txtДописывать, а не перезаписывать.
xargscat ids.txt | xargs -n 1 echoПревращает поток в аргументы команды.
xargs -Icat list | xargs -I{} cp {} /backup/Подставлять каждое значение в нужное место.
xargs -0find . -print0 | xargs -0 wc -lБезопасная работа с именами с пробелами.
xargs -Pcat urls.txt | xargs -P 8 -n 1 curl -sOПараллельное выполнение в 8 потоков.
split -lsplit -l 100000 big.csv part_Разбить файл по 100000 строк.
split -bsplit -b 100M backup.tar part_Разбить по размеру.
cat part_*cat part_* > backup.tarСобрать части обратно.
printfprintf "%-10s %5d\n" name 42Форматированный вывод.
seqseq 1 2 11Последовательность чисел с шагом.

Пример: короткий анализ лога веб-сервера

# Топ-10 IP по числу запросов
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

# Количество ответов по кодам
awk '{print $9}' access.log | sort | uniq -c | sort -rn

# Ошибки 5xx за сегодня с временем
grep "$(date +%d/%b/%Y)" access.log | awk '$9 ~ /^5/ {print $4, $7, $9}'

# Заменить старый домен во всех конфигах с резервной копией
grep -rl "old.example.com" /etc/nginx | xargs sed -i.bak 's/old.example.com/new.example.com/g'
sed -i и xargs меняют файлы сразу. Перед массовой заменой запустите то же без -i (покажет результат в выводе) и сохраняйте резервную копию через -i.bak.
Для сложной обработки данных, когда sed и awk становятся трудночитаемыми, переходите на Python или jq (для JSON). Однострочники в shell хороши для разовых задач, а не для поддержки.