В Bash/awk/sed контексте print $2 означает вывести второе поле/колонку из строки. Разъяснение echo «Hello World Test» | awk ‘{print $2}’ и echo «Hello World Test» | sed ‘s/[^ ]* ([^ ])./\1/’

Примеры:

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 работает на каждой строке отдельно, извлекая второй «столбец», где столбцы разделены пробелами (по умолчанию).

Оставьте комментарий