awk Снова упёрся в проблемы с пониманием работы awk, и наказал себя прочтением и конспектированием статей =) Остаётся надеяться, что чаще стану применять его на практике.
Самое простое применение awk в учебных целях: awk '{ print }' /etc/passwd Просто выводит содержимое файла, так же, как cat.
Теперь, когда синтаксис понятен, усложним задачу: awk -F":" '{ print $1 }' /etc/passwd где -F":" уазывает разделителем двоеточие ":" а $1 выводит первое поле, встреченное в каждой строке. Разделителем можно указывать диапазон символов, либо цифры вообще: awk -F '[0-9]' '{ print $1 }' awk -F '[[:digit:]]' '{ print $1 }'
Можно выводить несколько полей за раз, но поскольку awk их никак не разделяет выводя слитно, укажем разделитель " ". Это может быть любой символ или последовательность:
awk -F":" '{ print $1 " " $3 }' /etc/passwd
А теперь давайте тоже самое ещё больше усложним, улучшив вывод, но сделал трудночитаемей код: awk -F":" '{ print "username: " $1 "\t\uid:" $3 }' /etc/passwd Внимание на двойные ковычки, внутри них просто текст. А \t\ — экранированный слэшами символ табуляции.
Также возможны условия. Вывести поле 6 только если поле 1 равно "root":
awk -F '[:]' '$1 == "root" { print $6 }' /etc/passwd Awk предлагает полный набор операторов сравнения, в том числе обычные "==", "<", ">", "<=", ">=" и "!=". Кроме того, awk предоставляет операторы "~" и "!~", которые означают "совпадает" и "не совпадает". Повторим предыдущий пример используя ~ :
awk -F '[:]' '$1 ~ /roo/ { print $6 }' /etc/passwd Как заметили, его прелесть в том, что можно указывать только часть имени поля.
Используем булевы условные операторы логическое ИЛИ "||" и логическое И "&&".
awk -F '[:]' '$1 ~ /t/ && $2 == "x" { print $7 }' /etc/passwd Команда выведёт поле 7 только если поле 1 СОДЕРЖИТ "t" И поле 2 РАВНО "x".
Regular Expression
Кстати, если вы заметили, то между // размещаются регулярные выражения.
Например это /[Aa]uto/ требует наличия одной из букв в [...] и слова uto.
Или такой пример: выводится только та строка, где в её начале есть Linux: echo -e "Linux rulez\nWindows must die" | awk '/^Linux/'
Регистронезависимый поиск функцией tolower(): echo -e "sysop SysOp SYSOP" | awk 'tolower($0) ~ /^sys/'
Вывод сообщения о пустом поле: echo -e "num 1\nnum 2\nnum " | awk '{ if ($2 == "") print "Number lost at line " NR }'
|