Готовый перевод 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

Настройки

Готово:

40.56% КП = 1.0

Непереведённые фрагменты будут пропущены.