Примеры:
1. В AWK:
bash
# Ввод: "John Doe 30"
echo "John Doe 30" | awk '{print $2}'
# Вывод: "Doe"
# Разделение по запятой
echo "apple,banana,orange" | awk -F',' '{print $2}'
# Вывод: "banana"
2. В sed (с подстановкой):
bash
# Вывод второго слова
echo "Hello World Test" | sed 's/[^ ]* \([^ ]*\).*/\1/'
# Или через awk проще
echo "Hello World Test" | awk '{print $2}'
3. Разделение строки на поля по умолчанию:
- Разделитель по умолчанию: пробел/табуляция
$1— первое поле$2— второе поле$0— вся строка
bash
# Пример файла data.txt:
# Alice 25 Engineer
# Bob 30 Manager
# Carol 28 Designer
awk '{print $2}' data.txt
# Вывод:
# 25
# 30
# 28
4. Практические примеры:
Извлечение IP-адресов:
bash
# Из вывода ifconfig
ifconfig | awk '/inet / {print $2}'
# Из файла логов
cat /var/log/auth.log | awk '/Failed password/ {print $11}'
Работа с CSV:
bash
# users.csv:
# id,name,email
# 1,John,john@example.com
# 2,Jane,jane@example.com
awk -F',' '{print $2}' users.csv
# Вывод:
# name
# John
# Jane
Обработка системных команд:
bash
# Вывести только имена процессов из ps
ps aux | awk '{print $2, $11}' # $2 = PID, $11 = команда
# Мощный пример: сумма значений во втором столбце
awk '{sum += $2} END {print sum}' data.txt
5. Специальные переменные в AWK:
bash
echo "a b c d e" | awk '{
print "First:", $1
print "Second:", $2
print "Last:", $NF # Последнее поле
print "All:", $0 # Вся строка
print "Total fields:", NF # Количество полей
}'
6. Комбинирование с другими командами:
bash
# Топ-5 IP в логах
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -5
# Извлечь второй столбец, отсортировать уникально
cut -d' ' -f2 file.txt | sort -u
# Эквивалент awk:
awk '{print $2}' file.txt | sort -u
7. Разные разделители:
bash
# По умолчанию (пробелы/табы)
awk '{print $2}' file.txt
# Явно указать пробел
awk -F' ' '{print $2}' file.txt
# Табуляция
awk -F'\t' '{print $2}' file.txt
# Запятая (CSV)
awk -F',' '{print $2}' file.txt
# Двоеточие (как в /etc/passwd)
awk -F':' '{print $2}' /etc/passwd
# Регулярное выражение (пробел ИЛИ запятая)
awk -F'[ ,]' '{print $2}' file.txt
8. Полезные паттерны:
bash
# Только строки с более чем 2 полями
awk 'NF > 2 {print $2}' file.txt
# Вывести второе поле, если первое равно "ERROR"
awk '$1 == "ERROR" {print $2}' log.txt
# Поменять местами первые два поля
awk '{print $2, $1}' file.txt
# Вывести второе поле и его длину
awk '{print $2, length($2)}' file.txt
Ключевой момент: $2 работает на каждой строке отдельно, извлекая второй «столбец», где столбцы разделены пробелами (по умолчанию).