Готовый перевод Awk by example / Awk в примерах: Part 1: An intro to the great language with the strange name
В защиту awk
Первая проба
Давайте двигаться вперед и начнём "играть" с awk, чтобы показать как он работает. В коммандной строке введите следующую команду:
$ awk '{ print }' /etc/passwd
Вы увидите содержимое файла /etc/passwd прямо перед глазами. Теперь, объясню, что сделал awk. Когда мы вызывали команду, мы указали /etc/passwd как входной файл. Когда мы запустили awk, он выполнил команду print для каждой строки в файле /etc/passwd, по порядку. Результат отправился на стадартный вывод (stdout) и мы получили идентичный результат, такой какой получился бы при использовании команды cat /etc/passwd.
Следующий пример делает то же самое:
$ awk '{ print $0 }' /etc/passwd
$ awk '{ print "" }' /etc/passwd
$ awk '{ print "hiya" }' /etc/passwd
$ awk -F":" '{ print $1 }' /etc/passwd
$ awk -F":" '{ print $1 $3 }' /etc/passwd
halt7
operator11
root0
shutdown6
sync5
bin1
....etc.
$ awk -F":" '{ print $1 " " $3 }' /etc/passwd
$ awk -F":" '{ print "username: " $1 "\t\tuid:" $3 }' /etc/passwd
username: halt uid:7
username: operator uid:11
username: root uid:0
username: shutdown uid:6
username: sync uid:5
username: bin uid:1
....и т.д.
$ awk -f myscript.awk myfile.in
BEGIN {
FS=":"
}
{ print $1 }
#!/usr/bin/awk -f
BEGIN {
FS=":"
}
{ print $1 }
$ chmod +x myscript.awk
$ ./myscript.awk myfile.in
/foo/ { print }
Конечно вы можете использовать более сложные регулярные выражения. Вот скрипт, который напечатает только те линии, которые содержат числа с плавающей точкой:
/[0-9]+\.[0-9]*/ { print }
$1 == "fred" { print $3 }
$5 ~ /root/ { print $3 }
{
if ( $5 ~ /root/ ) {
print $3
}
}
{
if ( $1 == "foo" ) {
if ( $2 == "foo" ) {
print "uno"
} else {
print "one"
}
} else if ($1 == "bar" ) {
print "two"
} else {
print "three"
}
}
! /matchme/ { print $1 $3 $4 }
{
if ( $0 !~ /matchme/ ) {
print $1 $3 $4
}
}
( $1 == "foo" ) && ( $2 == "bar" ) { print }
BEGIN { x=0 }
/^$/ { x=x+1 }
END { print "I found " x " blank lines. :)" }
x="1.01"
# We just set x to contain the *string* "1.01"
x=x+1
# We just added one to a *string*
print x
# Incidentally, these are comments :)
2.01
{ print ($1^2)+1 }
FS="\t+"
FS="[[:space:]+]"
FS="foo[0-9][0-9][0-9]"
NF == 3 { print "this particular record has three fields: " $0 }
{
if ( NF > 2 ) {
print $1 " " $2 ":" $3
}
}
(NR < 10 ) || (NR > 100) { print "We are on record number 1-9 or 101+" }
{
#skip header
if ( NR > 10 ) {
print "ok, now for the real information!"
}
}
Ресурсы
Дэниэль Роббинс
Дэниэль Роббинс — основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэль проживает в Нью-Мехико со свой женой Мэри и двумя энергичными дочерьми. Он также основатель и глава Funtoo, написал множество технических статей для IBM developerWorks, Intel Developer Services и C/C++ Users Journal.
Переведено на Нотабеноиде
http://notabenoid.org/book/15218/49873
Переводчики: Daemon786, en0ne, ovegio
Настройки
Готово:
