0% found this document useful (0 votes)
4 views

135502

GAWK: Effective AWK Programming is a comprehensive user guide for GNU Awk, detailing the awk language and its applications. The document covers various topics including regular expressions, input/output handling, and advanced features of gawk. It is published by the Free Software Foundation and is available for download along with other related educational resources.

Uploaded by

salualeuch
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views

135502

GAWK: Effective AWK Programming is a comprehensive user guide for GNU Awk, detailing the awk language and its applications. The document covers various topics including regular expressions, input/output handling, and advanced features of gawk. It is published by the Free Software Foundation and is available for download along with other related educational resources.

Uploaded by

salualeuch
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 50

GAWK Effective AWK Programming Arnold D.

Robbins
download

https://ebookmeta.com/product/gawk-effective-awk-programming-
arnold-d-robbins/

Download more ebook from https://ebookmeta.com


We believe these products will be a great fit for you. Click
the link to download now, or visit ebookmeta.com
to discover even more!

Learning the vi and Vim Editors 8th Edition Arnold


Robbins

https://ebookmeta.com/product/learning-the-vi-and-vim-
editors-8th-edition-arnold-robbins/

Learning the vi and Vim Editors, 8th Edition Arnold


Robbins & Elbert Hannah

https://ebookmeta.com/product/learning-the-vi-and-vim-
editors-8th-edition-arnold-robbins-elbert-hannah/

The AWK Programming Language Addison Wesley


Professional Computing Series 2nd Edition Alfred Aho

https://ebookmeta.com/product/the-awk-programming-language-
addison-wesley-professional-computing-series-2nd-edition-alfred-
aho/

Principles and Methods of Social Research 4th Edition


William D. Crano & Marilynn B. Brewer & Andrew Lac

https://ebookmeta.com/product/principles-and-methods-of-social-
research-4th-edition-william-d-crano-marilynn-b-brewer-andrew-
lac/
A Mean Season (Dom Reilly 2) 1st Edition Marshall
Thornton

https://ebookmeta.com/product/a-mean-season-dom-reilly-2-1st-
edition-marshall-thornton/

The Basic Practice Of Statistics 7th Edition Moore

https://ebookmeta.com/product/the-basic-practice-of-
statistics-7th-edition-moore/

Tegan and Sara Modern Heartthrobs Bibliophonic 7 1st


Edition Melody Lau

https://ebookmeta.com/product/tegan-and-sara-modern-heartthrobs-
bibliophonic-7-1st-edition-melody-lau/

Elf napped A Filthy Dirty Christmas 1st Edition Abby


Knox

https://ebookmeta.com/product/elf-napped-a-filthy-dirty-
christmas-1st-edition-abby-knox-2/

Driving Justice, Equality, Diversity, and Inclusion


Kristina Kohl

https://ebookmeta.com/product/driving-justice-equality-diversity-
and-inclusion-kristina-kohl/
Digital Health Communications 1st Edition Benoit
Cordelier

https://ebookmeta.com/product/digital-health-communications-1st-
edition-benoit-cordelier/
GNU Awk
GAWK: Effective AWK Programming
A User’s Guide for GNU Awk
Edition 5.1
October, 2021

Arnold D. Robbins
“To boldly go where no man has gone before” is a Registered Trademark of Paramount
Pictures Corporation.

Published by:

Free Software Foundation


51 Franklin Street, Fifth Floor
Boston, MA 02110-1301 USA
Phone: +1-617-542-5942
Fax: +1-617-542-2652
Email: gnu@gnu.org
URL: https://www.gnu.org/

ISBN 1-882114-28-0

Copyright c 1989, 1991, 1992, 1993, 1996–2005, 2007, 2009–2021


Free Software Foundation, Inc.

This is Edition 5.1 of GAWK: Effective AWK Programming: A User’s Guide for GNU Awk,
for the 5.1.1 (or later) version of the GNU implementation of AWK.
Permission is granted to copy, distribute and/or modify this document under the terms
of the GNU Free Documentation License, Version 1.3 or any later version published by
the Free Software Foundation; with the Invariant Sections being “GNU General Public
License”, with the Front-Cover Texts being “A GNU Manual”, and with the Back-Cover
Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free
Documentation License”.
a. The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU
manual.”
To my parents, for their love, and for the wonderful example they set for me.

To my wife, Miriam, for making me complete.Thank you for building your life together with me.

To our children, Chana, Rivka, Nachum, and Malka, for enrichening our lives in innumerable ways.
i

Short Contents
Foreword to the Third Edition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Foreword to the Fourth Edition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Part I: The awk Language


1 Getting Started with awk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2 Running awk and gawk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3 Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4 Reading Input Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5 Printing Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6 Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
7 Patterns, Actions, and Variables . . . . . . . . . . . . . . . . . . . . . . . . 141
8 Arrays in awk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
9 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

Part II: Problem Solving with awk


10 A Library of awk Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
11 Practical awk Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269

Part III: Moving Beyond Standard awk with gawk


12 Advanced Features of gawk . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
13 Internationalization with gawk . . . . . . . . . . . . . . . . . . . . . . . . . 343
14 Debugging awk Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
15 Namespaces in gawk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
16 Arithmetic and Arbitrary-Precision Arithmetic with gawk . . . 375
17 Writing Extensions for gawk . . . . . . . . . . . . . . . . . . . . . . . . . . . 389

Part IV: Appendices


A The Evolution of the awk Language . . . . . . . . . . . . . . . . . . . . . 455
B Installing gawk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
C Implementation Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
D Basic Programming Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . 505
Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
GNU General Public License . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
GNU Free Documentation License . . . . . . . . . . . . . . . . . . . . . . . . . . 533
ii GAWK: Effective AWK Programming

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
iii

Table of Contents

Foreword to the Third Edition . . . . . . . . . . . . . . . . . . . . . 1

Foreword to the Fourth Edition . . . . . . . . . . . . . . . . . . . . 3

Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
History of awk and gawk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
A Rose by Any Other Name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Using This Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Typographical Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Dark Corners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
The GNU Project and This Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
How to Contribute. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Acknowledgments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

Part I: The awk Language

1 Getting Started with awk . . . . . . . . . . . . . . . . . . . . . . 17


1.1 How to Run awk Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.1.1 One-Shot Throwaway awk Programs . . . . . . . . . . . . . . . . . . . . . . 17
1.1.2 Running awk Without Input Files . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.1.3 Running Long Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.1.4 Executable awk Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.1.5 Comments in awk Programs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.1.6 Shell Quoting Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.1.6.1 Quoting in MS-Windows Batch Files . . . . . . . . . . . . . . . . . 23
1.2 Data files for the Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.3 Some Simple Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.4 An Example with Two Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.5 A More Complex Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.6 awk Statements Versus Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.7 Other Features of awk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.8 When to Use awk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
1.9 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

2 Running awk and gawk . . . . . . . . . . . . . . . . . . . . . . . . . . 31


2.1 Invoking awk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.2 Command-Line Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.3 Other Command-Line Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.4 Naming Standard Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.5 The Environment Variables gawk Uses . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.5.1 The AWKPATH Environment Variable . . . . . . . . . . . . . . . . . . . . . . . 40
iv GAWK: Effective AWK Programming

2.5.2 The AWKLIBPATH Environment Variable . . . . . . . . . . . . . . . . . . . 41


2.5.3 Other Environment Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.6 gawk’s Exit Status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.7 Including Other Files into Your Program. . . . . . . . . . . . . . . . . . . . . . . 43
2.8 Loading Dynamic Extensions into Your Program . . . . . . . . . . . . . . . 45
2.9 Obsolete Options and/or Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.10 Undocumented Options and Features . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.11 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

3 Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.1 How to Use Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.2 Escape Sequences. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.3 Regular Expression Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.3.1 Regexp Operators in awk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.3.2 Some Notes On Interval Expressions . . . . . . . . . . . . . . . . . . . . . . 53
3.4 Using Bracket Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.5 How Much Text Matches? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.6 Using Dynamic Regexps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.7 gawk-Specific Regexp Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
3.8 Case Sensitivity in Matching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.9 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

4 Reading Input Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61


4.1 How Input Is Split into Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.1.1 Record Splitting with Standard awk . . . . . . . . . . . . . . . . . . . . . . . 61
4.1.2 Record Splitting with gawk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.2 Examining Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.3 Nonconstant Field Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.4 Changing the Contents of a Field . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.5 Specifying How Fields Are Separated . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.5.1 Whitespace Normally Separates Fields . . . . . . . . . . . . . . . . . . . . 70
4.5.2 Using Regular Expressions to Separate Fields . . . . . . . . . . . . . 70
4.5.3 Making Each Character a Separate Field . . . . . . . . . . . . . . . . . . 71
4.5.4 Setting FS from the Command Line . . . . . . . . . . . . . . . . . . . . . . . 72
4.5.5 Making the Full Line Be a Single Field . . . . . . . . . . . . . . . . . . . . 73
4.5.6 Field-Splitting Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.6 Reading Fixed-Width Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.6.1 Processing Fixed-Width Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.6.2 Skipping Intervening Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.6.3 Capturing Optional Trailing Data . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.6.4 Field Values With Fixed-Width Data . . . . . . . . . . . . . . . . . . . . . 76
4.7 Defining Fields by Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.7.1 More on CSV Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.7.2 FS Versus FPAT: A Subtle Difference . . . . . . . . . . . . . . . . . . . . . . 79
4.8 Checking How gawk Is Splitting Records . . . . . . . . . . . . . . . . . . . . . . . 80
4.9 Multiple-Line Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.10 Explicit Input with getline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
v

4.10.1 Using getline with No Arguments . . . . . . . . . . . . . . . . . . . . . . 83


4.10.2 Using getline into a Variable . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.10.3 Using getline from a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
4.10.4 Using getline into a Variable from a File . . . . . . . . . . . . . . . 85
4.10.5 Using getline from a Pipe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.10.6 Using getline into a Variable from a Pipe . . . . . . . . . . . . . . . 87
4.10.7 Using getline from a Coprocess . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.10.8 Using getline into a Variable from a Coprocess . . . . . . . . . 88
4.10.9 Points to Remember About getline . . . . . . . . . . . . . . . . . . . . . 88
4.10.10 Summary of getline Variants . . . . . . . . . . . . . . . . . . . . . . . . . . 89
4.11 Reading Input with a Timeout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
4.12 Retrying Reads After Certain Input Errors . . . . . . . . . . . . . . . . . . . 91
4.13 Directories on the Command Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4.14 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4.15 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

5 Printing Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
5.1 The print Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
5.2 print Statement Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
5.3 Output Separators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.4 Controlling Numeric Output with print . . . . . . . . . . . . . . . . . . . . . . . 96
5.5 Using printf Statements for Fancier Printing . . . . . . . . . . . . . . . . . . 96
5.5.1 Introduction to the printf Statement. . . . . . . . . . . . . . . . . . . . . 96
5.5.2 Format-Control Letters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.5.3 Modifiers for printf Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.5.4 Examples Using printf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.6 Redirecting Output of print and printf . . . . . . . . . . . . . . . . . . . . . 102
5.7 Special Files for Standard Preopened Data Streams . . . . . . . . . . . 104
5.8 Special File names in gawk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.8.1 Accessing Other Open Files with gawk . . . . . . . . . . . . . . . . . . . 106
5.8.2 Special Files for Network Communications . . . . . . . . . . . . . . . 106
5.8.3 Special File name Caveats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
5.9 Closing Input and Output Redirections . . . . . . . . . . . . . . . . . . . . . . . 106
5.10 Enabling Nonfatal Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.11 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
5.12 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

6 Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
6.1 Constants, Variables, and Conversions . . . . . . . . . . . . . . . . . . . . . . . . 113
6.1.1 Constant Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
6.1.1.1 Numeric and String Constants . . . . . . . . . . . . . . . . . . . . . . 113
6.1.1.2 Octal and Hexadecimal Numbers . . . . . . . . . . . . . . . . . . . . 114
6.1.1.3 Regular Expression Constants. . . . . . . . . . . . . . . . . . . . . . . 115
6.1.2 Using Regular Expression Constants . . . . . . . . . . . . . . . . . . . . . 115
6.1.2.1 Standard Regular Expression Constants . . . . . . . . . . . . . 116
6.1.2.2 Strongly Typed Regexp Constants . . . . . . . . . . . . . . . . . . 117
6.1.3 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
vi GAWK: Effective AWK Programming

6.1.3.1 Using Variables in a Program . . . . . . . . . . . . . . . . . . . . . . . 118


6.1.3.2 Assigning Variables on the Command Line . . . . . . . . . . 119
6.1.4 Conversion of Strings and Numbers . . . . . . . . . . . . . . . . . . . . . . 120
6.1.4.1 How awk Converts Between Strings and Numbers . . . 120
6.1.4.2 Locales Can Influence Conversion . . . . . . . . . . . . . . . . . . . 121
6.2 Operators: Doing Something with Values . . . . . . . . . . . . . . . . . . . . . 122
6.2.1 Arithmetic Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
6.2.2 String Concatenation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
6.2.3 Assignment Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
6.2.4 Increment and Decrement Operators . . . . . . . . . . . . . . . . . . . . . 127
6.3 Truth Values and Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
6.3.1 True and False in awk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
6.3.2 Variable Typing and Comparison Expressions . . . . . . . . . . . . 129
6.3.2.1 String Type versus Numeric Type . . . . . . . . . . . . . . . . . . . 129
6.3.2.2 Comparison Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
6.3.2.3 String Comparison Based on Locale Collating Order . . 133
6.3.3 Boolean Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
6.3.4 Conditional Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
6.4 Function Calls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
6.5 Operator Precedence (How Operators Nest). . . . . . . . . . . . . . . . . . . 138
6.6 Where You Are Makes a Difference . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
6.7 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

7 Patterns, Actions, and Variables . . . . . . . . . . . . 141


7.1 Pattern Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
7.1.1 Regular Expressions as Patterns . . . . . . . . . . . . . . . . . . . . . . . . . 141
7.1.2 Expressions as Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
7.1.3 Specifying Record Ranges with Patterns . . . . . . . . . . . . . . . . . 143
7.1.4 The BEGIN and END Special Patterns . . . . . . . . . . . . . . . . . . . . . 144
7.1.4.1 Startup and Cleanup Actions . . . . . . . . . . . . . . . . . . . . . . . 144
7.1.4.2 Input/Output from BEGIN and END Rules. . . . . . . . . . . . 145
7.1.5 The BEGINFILE and ENDFILE Special Patterns. . . . . . . . . . . . 145
7.1.6 The Empty Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
7.2 Using Shell Variables in Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
7.3 Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
7.4 Control Statements in Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
7.4.1 The if-else Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
7.4.2 The while Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
7.4.3 The do-while Statement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
7.4.4 The for Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
7.4.5 The switch Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
7.4.6 The break Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
7.4.7 The continue Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
7.4.8 The next Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
7.4.9 The nextfile Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
7.4.10 The exit Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
7.5 Predefined Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
7.5.1 Built-in Variables That Control awk. . . . . . . . . . . . . . . . . . . . . . 157
vii

7.5.2 Built-in Variables That Convey Information . . . . . . . . . . . . . . 159


7.5.3 Using ARGC and ARGV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
7.6 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

8 Arrays in awk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171


8.1 The Basics of Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
8.1.1 Introduction to Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
8.1.2 Referring to an Array Element . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
8.1.3 Assigning Array Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
8.1.4 Basic Array Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
8.1.5 Scanning All Elements of an Array. . . . . . . . . . . . . . . . . . . . . . . 175
8.1.6 Using Predefined Array Scanning Orders with gawk . . . . . . 176
8.2 Using Numbers to Subscript Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . 179
8.3 Using Uninitialized Variables as Subscripts. . . . . . . . . . . . . . . . . . . . 180
8.4 The delete Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
8.5 Multidimensional Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
8.5.1 Scanning Multidimensional Arrays . . . . . . . . . . . . . . . . . . . . . . . 183
8.6 Arrays of Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
8.7 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

9 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
9.1 Built-in Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
9.1.1 Calling Built-in Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
9.1.2 Numeric Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
9.1.3 String-Manipulation Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
9.1.3.1 More about ‘\’ and ‘&’ with
sub(), gsub(), and gensub() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
9.1.4 Input/Output Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
9.1.5 Time Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
9.1.6 Bit-Manipulation Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
9.1.7 Getting Type Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
9.1.8 String-Translation Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
9.2 User-Defined Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
9.2.1 Function Definition Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
9.2.2 Function Definition Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
9.2.3 Calling User-Defined Functions . . . . . . . . . . . . . . . . . . . . . . . . . . 218
9.2.3.1 Writing a Function Call . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
9.2.3.2 Controlling Variable Scope . . . . . . . . . . . . . . . . . . . . . . . . . . 218
9.2.3.3 Passing Function Arguments by Value Or by Reference . . 221
9.2.3.4 Other Points About Calling Functions . . . . . . . . . . . . . . 222
9.2.4 The return Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
9.2.5 Functions and Their Effects on Variable Typing . . . . . . . . . . 224
9.3 Indirect Function Calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
9.4 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

Part II: Problem Solving with awk


viii GAWK: Effective AWK Programming

10 A Library of awk Functions . . . . . . . . . . . . . . . . . 233


10.1 Naming Library Function Global Variables . . . . . . . . . . . . . . . . . . 234
10.2 General Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
10.2.1 Converting Strings to Numbers . . . . . . . . . . . . . . . . . . . . . . . . . 235
10.2.2 Assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
10.2.3 Rounding Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
10.2.4 The Cliff Random Number Generator . . . . . . . . . . . . . . . . . . . 239
10.2.5 Translating Between Characters and Numbers . . . . . . . . . . 239
10.2.6 Merging an Array into a String . . . . . . . . . . . . . . . . . . . . . . . . . 241
10.2.7 Managing the Time of Day . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
10.2.8 Reading a Whole File at Once . . . . . . . . . . . . . . . . . . . . . . . . . . 243
10.2.9 Quoting Strings to Pass to the Shell . . . . . . . . . . . . . . . . . . . . 244
10.2.10 Checking Whether A Value Is Numeric . . . . . . . . . . . . . . . . 245
10.3 Data file Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
10.3.1 Noting Data file Boundaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
10.3.2 Rereading the Current File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
10.3.3 Checking for Readable Data files. . . . . . . . . . . . . . . . . . . . . . . . 248
10.3.4 Checking for Zero-Length Files . . . . . . . . . . . . . . . . . . . . . . . . . 249
10.3.5 Treating Assignments as File names . . . . . . . . . . . . . . . . . . . . 250
10.4 Processing Command-Line Options . . . . . . . . . . . . . . . . . . . . . . . . . . 250
10.5 Reading the User Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
10.6 Reading the Group Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
10.7 Traversing Arrays of Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
10.8 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
10.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267

11 Practical awk Programs. . . . . . . . . . . . . . . . . . . . . . 269


11.1 Running the Example Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
11.2 Reinventing Wheels for Fun and Profit . . . . . . . . . . . . . . . . . . . . . . 269
11.2.1 Cutting Out Fields and Columns . . . . . . . . . . . . . . . . . . . . . . . 269
11.2.2 Searching for Regular Expressions in Files . . . . . . . . . . . . . . 274
11.2.3 Printing Out User Information. . . . . . . . . . . . . . . . . . . . . . . . . . 278
11.2.4 Splitting a Large File into Pieces . . . . . . . . . . . . . . . . . . . . . . . 283
11.2.5 Duplicating Output into Multiple Files . . . . . . . . . . . . . . . . . 288
11.2.6 Printing Nonduplicated Lines of Text . . . . . . . . . . . . . . . . . . . 290
11.2.7 Counting Things . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
11.2.7.1 Modern Character Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
11.2.7.2 A Brief Introduction To Extensions . . . . . . . . . . . . . . . . 294
11.2.7.3 Code for wc.awk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
11.3 A Grab Bag of awk Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
11.3.1 Finding Duplicated Words in a Document . . . . . . . . . . . . . . 297
11.3.2 An Alarm Clock Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
11.3.3 Transliterating Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
11.3.4 Printing Mailing Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
11.3.5 Generating Word-Usage Counts. . . . . . . . . . . . . . . . . . . . . . . . . 304
11.3.6 Removing Duplicates from Unsorted Text . . . . . . . . . . . . . . . 306
11.3.7 Extracting Programs from Texinfo Source Files . . . . . . . . . 307
11.3.8 A Simple Stream Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
ix

11.3.9 An Easy Way to Use Library Functions . . . . . . . . . . . . . . . . . 312


11.3.10 Finding Anagrams from a Dictionary . . . . . . . . . . . . . . . . . . 318
11.3.11 And Now for Something Completely Different . . . . . . . . . . 320
11.4 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
11.5 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321

Part III: Moving Beyond Standard awk with gawk

12 Advanced Features of gawk . . . . . . . . . . . . . . . . . . 325


12.1 Allowing Nondecimal Input Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
12.2 Controlling Array Traversal and Array Sorting . . . . . . . . . . . . . . . 326
12.2.1 Controlling Array Traversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
12.2.2 Sorting Array Values and Indices with gawk . . . . . . . . . . . . . 330
12.3 Two-Way Communications with Another Process . . . . . . . . . . . . 332
12.4 Using gawk for Network Programming . . . . . . . . . . . . . . . . . . . . . . . 336
12.5 Profiling Your awk Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
12.6 Builtin Features versus Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
12.7 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342

13 Internationalization with gawk . . . . . . . . . . . . . . 343


13.1 Internationalization and Localization . . . . . . . . . . . . . . . . . . . . . . . . 343
13.2 GNU gettext. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
13.3 Internationalizing awk Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
13.4 Translating awk Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
13.4.1 Extracting Marked Strings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
13.4.2 Rearranging printf Arguments . . . . . . . . . . . . . . . . . . . . . . . . 348
13.4.3 awk Portability Issues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
13.5 A Simple Internationalization Example . . . . . . . . . . . . . . . . . . . . . . 350
13.6 gawk Can Speak Your Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
13.7 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352

14 Debugging awk Programs. . . . . . . . . . . . . . . . . . . . 353


14.1 Introduction to the gawk Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . 353
14.1.1 Debugging in General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
14.1.2 Debugging Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
14.1.3 awk Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
14.2 Sample gawk Debugging Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
14.2.1 How to Start the Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
14.2.2 Finding the Bug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
14.3 Main Debugger Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
14.3.1 Control of Breakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
14.3.2 Control of Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
14.3.3 Viewing and Changing Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
14.3.4 Working with the Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
14.3.5 Obtaining Information About the
Program and the Debugger State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Exploring the Variety of Random
Documents with Different Content
The Project Gutenberg eBook of Hottentotit:
Koulumuistelmia
This ebook is for the use of anyone anywhere in the United States
and most other parts of the world at no cost and with almost no
restrictions whatsoever. You may copy it, give it away or re-use it
under the terms of the Project Gutenberg License included with this
ebook or online at www.gutenberg.org. If you are not located in the
United States, you will have to check the laws of the country where
you are located before using this eBook.

Title: Hottentotit: Koulumuistelmia

Author: Jalmari Kara

Release date: October 3, 2017 [eBook #55677]

Language: Finnish

Credits: Produced by Tapio Riikonen

*** START OF THE PROJECT GUTENBERG EBOOK HOTTENTOTIT:


KOULUMUISTELMIA ***
Produced by Tapio Riikonen

HOTTENTOTIT
Koulumuistelmia

Kirj.

JALMARI KARA
Helsingissä, Kustannusosakeyhtiö Otava, 1915.
SISÄLLYS:

Esipuhe.
Huviretkellä.
Hottentotit.
Törkeä kepponen.
Kelkkamäessä.
Joululoman alkaessa.
Filosoofin syntymäpäivä.
Monte Carlossa.
Martti Ranta.
Sairaustodistus.
Ylioppilaskirjoitukset.
Ratkaisevat tunnit.
Kevättutkinto.
ESIPUHE.

Rakas Niina serkku.

Uskotko vielä ennustajia? Muistatko, että muuan "päänkoettelija",


sormeiltuaan kalloani, väitti minusta tulevan kirjailijan. Tiedät, että
olin silloin seitsemännellä luokalla, että olin korviani myöten
rakastunut sinuun ja että erosin koulusta. Mutta et tiedä, että
seuraavan kesän vietin yksinäisessä kalastajamökissä hautoen suuria
tuumia. Minun oli hirveän ikävä, varsinkin sinua, mutta purin
hammasta ja sanoin itselleni, että taiteilijan täytyi osata kärsiä.
Syystalvella sitten kirjoittelin tätä romaania, maalla asuen, ja
ajattelin: "Keväällä julkaisen teokseni, minusta tulee kuuluisuus,
sitten menen Niinan kanssa naimisiin." — Mutta voi! Kustantajat
pudistivat minulle päätään, hymyilivät ystävällisesti ja antoivat
paperini takaisin. He puhuivat jotakin kompositsioonin löyhyydestä,
väittivät, että kirjani eri kertomukset ovat irrallaan kuin vesirinkilät
nauhassa; joku mielikseni kehaisi paria yksityiskohtaa. Silloin luulin,
että kompositsiooni tarkottaa yksinomaan sävellystä, ja vaikka tunsin
katkeruutta, en kuitenkaan masentunut, sillä uskoin olevani
profeetta, jota ei kotinurkissa ymmärretty.
Mutta samana keväänä sain paljoa ankaramman kolauksen,
kolauksen, joka palautti minut järkiini: sinä menit kihloihin.

Nyt on vuosi kulunut. Minä olen privatistina suorittanut


ylioppilastutkinnon, ja sinä — vietät häitä. Rakas serkku. Häälahjaksi
lähetän sinulle nämä paperit. Ehkä joskus, kun miehesi on sinulle
paha, löydät lohdutusta näistä muistelmista, joiden henkilöt sinä
osittain tunnet.

Parhainta hääonnea toivottaen

Jali.
HUVIRETKELLA.

Lyseon alkajaispäivästä oli kulunut toista viikkoa.

Sunnuntaiaamuna, kello kymmenen tienoissa, kihisi laiturilla


koulupoikia kuin muurahaisia, ja pieni höyrylaiva puhkui
lähtövalmiina. Oltiin menossa yhteiselle huviretkelle Kajasniemeen.
Luokat olivat jo ryhmittyneet, mutta levottomuus vallitsi varsinkin
opettajiston keskuudessa: seitsemäs luokka oli yksimielisesti jäänyt
pois.

Luokan esimies, rehtori, lihavahko, heikkosilmäinen herra, seisoi


hajamielisen näköisenä, korkea otsa rypyssä. Vihattu maisteri
Sundberg, matematiikan opettaja, pitkä miehen kuikelo, hääräili
hänen vieressään, kuluneilla kasvoillaan vahingoniloinen hymy, ja
alkoi puhua laulavalla äänellään:

— Kas siinä näet! Eivät taas tule. Ne ovat koko hirtehisiä, olenhan
sen aina sanonut. Pari tuntia istuntoa koko luokalle!

— Älähän nyt. Emmehän me tiedä heidän perussyitäänkään, koetti


rehtori vastata.
Sundbergin vahingonilo oli helposti ymmärrettävissä. Viime
lukuvuoden oli hän ollut poissaolevien esimiehenä, mutta oli nyt
päässyt pälkäästä rehtorin asettuessa hänen tilalleen. Rehtorin
holhokit olivat nimittäin keväällä suorittaneet ylioppilastutkintonsa,
joten oikeastaan oli ensi luokan vuoro joutua hänen haltuunsa.
Nykyisen seitsemännen luokan pojat olivat kuitenkin siinä määrin
kiusanneet vihattua esimiestään, että tämä oli pannut parhaansa
päästäkseen heistä eroon. Opettajakunnassa oli syntynyt kiihkeä
väittely. Ja kun rehtori oli puoltanut oppilaita, oli Sundberg muitta
mutkitta ehdottanut vaihtokauppaa ja saanut hyvänahkaisen rehtorin
siihen suostumaan. Nyt hän tietenkin tahtoi ilkkua.

Tuli kiire laivalle. Opettajien rouvat, jotka myöskin olivat tulleet


mukaan, kuiskuttelivat jotakin rouva Lagukselle, väliaikaiselle
laulunopettajattarelle. Tuotapikaa kokosi tämä kuoron kannelle, ja
kun laiva hiljaa irtausi laiturista, kajahti riemukas laulu ilmoille.

Oli ihana ilma. Taivas oli sees, ja lauha tuuli puhalsi unisesti.
Kahdeksannen luokan pojat makasivat pelastusveneitten peltisillä
suojuskansilla auringonpaisteessa ja olivat "pollea". Joku heistä piti
runollista esitelmää etääntyvästä rannasta, aaltojen liplatuksesta
laivan kylkeä vasten ja veden sinisistä värivivahduksista kaukaisten
saarten välillä. — Pieni laiva kulki hiljaa, sillä kun oli suuri proomu
perässään.

Kun tultiin Kivisaaren kohdalle, niin pensaitten takaa porhalsi


moottorivene huimaa vauhtia. Ja kas! Siellähän seisoivat
seitsemännen luokan yksitoista poikaa, kaikki rivissä. Heillä oli
kullakin vaaleankellertävä kangashattu, johon harmaa sulka oli
kiinnitetty, polvihousut ja punainen, yli olan kulkeva, vyötäisillä
rusettiin solmittu nauha. He laskivat aivan lähelle laivaa, paljastivat
päänsä ja hurrasivat kolmasti. Sitten he pyyhälsivät laivan edelle.
Hottentotit!

Kaikki oli Einar Tengströmin hommaa. Hän se oli isältään,


insinööriltä, saanut moottoriveneen käytettäväkseen ja hoiteli nyt
konetta tärkeän näköisenä. Hänen vieressään istui Vilho Paalanen —
Filosoofi —, joka onnettoman rakkautensa tuskassa oli syventynyt
Schopenhauerin teoksiin ja muisti ulkoa suunnattoman määrän
tämän nerokkaan miehen lauseita. Luokan kaunein ja lahjakkain
poika Arvi Sahra — Runoilija — tuijotti miettiväisenä ulapalle. Pekka
Aro — Pelle — heittäytyi veneen pohjalle pitkäkseen salatakseen
paperossinsa, ja Eino Harjanne — Pankkiiri — Monte Carlon kookas
isäntä, istui ainaisessa kumartuneessa asennossaan.

— Ei meille vihaisia olla, sanoi Filosoofi. — Huomasitteko, kuinka


kirkkain kasvoin rehtori vastasi tervehdykseemme?

— Mutta näittekös Suden naamataulua? (Sundbergia sanottiin


Sudeksi.) Se oli vaaksan verran venynyt. Varmasti siellä on ollut
meistä kysymys, huudahti Antti Jäntti, postimerkkien kaupustelija.

Runoilija hyppäsi laudalle seisomaan. Hän alkoi puhua.

— Pojat! Meillä on nyt uusi esimies, ja esimies, jota emme


kehenkään vaihtaisi. Meillä on huono maine. Susi oli sietämätön, se
on totta, mutta mekin olimme ilkeitä. Eikös päätetäkin nyt olla
miehiä? Näytämme, että osaamme olla ihmisiksi, jos meitä
ymmärretään ja kohdellaan arvokkaasti. Ei niin, että heittäisimme
pois hurjan koulupoikamaisuuden ja rupeaisimme mamman
lellilapsiksi. Sitä en tarkota. Iloisia olemme kuten ennenkin,
kujeilemme ja vehkeilemme, mutta ilkeys pois. Koetamme olla
esimiehellemme kunniaksi. Tiedättekö, pojat, minä ehdotan, että
pidämme rehtorille puheen, selitämme. Se lähentää ja lujittaa.

— Hyvä, hyvä! Sen teemme, kuului yhteen ääneen.

— Minä mielelläni kerron hänelle, kuinka ilkeitä te olette, sanoi


Pelle veneen pohjalta, puhaltaen sankan savupilven suustaan.

— Suus kiinni sinä, kivahti Runoilija. — Ehdotan, että Filosoofi


valittaisiin puhujaksi.

— Kannatetaan!

— Siis… saamari! kirkaisi Runoilija äkkiä, hypäten penkiltä veneen


pohjalle. Pelle oli saanut käsiinsä purtilon ja kaatanut sillä vettä
hänen kenkäänsä.

— Sen veden minä vielä juotan sinulle, juupeli!

— Vahingossa meni, selitti Pelle nolostuneen ja viattoman


näköisenä.

Kajasniemi oli noin pari kilometriä pitkä, kapea maakaistale. Se


päättyi jyrkkään kallioon, joka päältä oli tasainen kuin tanssilava ja
jonka juurella syvä vesi lainehti.

Kun laiva laski huviretkeläiset maihin, olivat seitsemännen luokan


pojat vastassa rannalla. He olivat jo ennättäneet valita kauneimman
paikan alueekseen. Kahvipannu porisi tulella, ja kupit olivat
järjestyksessä nurmikolle levitetyllä pöytäliinalla.

Kuului sataääninen hurraahuuto. Kukin luokka, esimies keskellään,


riensi kiireimmän kaupalla pesäpaikkaa etsimään. Hottentotit veivät
riemumarssissa rehtorin leiriinsä.

— En tiedä, teittekö oikein kauniisti erotessanne joukosta, sanoi


rehtori istuuduttuaan.

Syntyi vaitiolo; pojat katsoivat toisiinsa.

— Kaikki syy on Harjanteen, hän kun kehuu olevansa niin suuri,


ettei
"Pote" olisi jaksanut häntä kantaa, tokaisi Pelle vihdoin.

— Ei suinkaan rehtori ole meihin vakavasti tyytymätön? Ei meillä


mitään tarkotuksia ollut, kiiruhti Runoilija kysymään.

— En minä sitä epäillytkään.

— Saahan rehtori kahvia ennemmin kuin kukaan muu opettajista,


intoili
Pelle.

— Aropas nyt selittää, naurahti rehtori.

Oli jälleen pitkän aikaa hiljaista. Omituinen painostus pyrki


kahlehtimaan kielet. Kahvipannu vain porisi ja kuohui yli. Pojat
vilkuilivat tuontuostakin jännittyneinä Filosoofiin.

Vihdoin Filosoofi nousi; hän oli hieman kalpea aiheettomasta


liikutuksesta.

— Me emme tiedä, mikä on syynä siihen, että meillä nyt on kunnia


sulkea rehtori esimiehenämme piiriimme, mutta me pyydämme
esiintuoda vilpittömän ilomme sen johdosta. Me tiedämme, että
opettajakunnalla on meistä huonot käsitykset. Emme tahdo emmekä
voikaan itseämme puolustaa, mutta me pyytäisimme rehtoria
unohtamaan kaiken, mikä on mennyttä. Me niin toivoisimme, että
rehtori uskoisi meistä hyvääkin. Kenties se vaikuttaisi meihin niin,
että esimiehemme joskus olisi tyytyväinen luokkaansa.

Rehtori oli noussut seisomaan, hänen äänensä sävy oli hiukan


muuttunut, kun hän vastasi:

— Hyvä on, pojat… Kaunis alku. Koetetaanpa saada loppu vielä


kauniimmaksi.

Seitsemäs luokka oli aikoja sitten juonut kahvinsa, ja rehtori oli


ennättänyt kertoa monta huvittavaa seikkailua omalta kouluajaltaan,
kun airut saapui ilmottamaan juoksukilpailujen alkavan.

Oteltiin kahden kilometrin murtomaamatkalla. Kukin luokka sai


valita kolme edustajaa, ja näiden yhteisen pistemäärän mukaan
ratkaistiin voitto. Palkintona oli hopeamalja; kolmelle parhaalle
annettiin sitäpaitsi opettajakunnan lahjottamia kirjoja.

Sahra — Runoilija, Aro — Pelle ja Martti Ranta, ylen hiljainen


poika, jolla ei ollut mitään lisänimeä, edustivat seitsemättä luokkaa.
He pukeusivat kiiruusti urheilutamineihinsa ja riensivät tasaisen
kallion laelle, mikä oli sekä lähtö- että paluupaikka.

Ainoastaan neljä ylintä luokkaa kilpaili. Matka oli mitattu ja


käännöspaikalle oli asetettu vartiomiehet, yksi kultakin luokalta,
Satainen oppilasjoukko liikehti levottomasti; pikkupojat pitivät
kauheata meteliä lähtökohdalla, toiset huusivat, toiset viskelivät
hattujaan ilmaan, jotkut kiipeilivät puihin paremmin nähdäkseen.
Jo asettuivat urheilijat riviin. Syntyi täydellinen hiljaisuus. Vihdoin
pamahti laukaus, ja pojat pyrähtivät juoksuun kuin pyyparvi.

Yleensä ennustettiin kahdeksannen luokan voittavan, heillähän oli


kuuluisa, kepeäjalkainen Pörppä, jolle ei kukaan vetänyt vertoja.
Jotkut yltiöpäät uskalsivat väittää Pellen tulevan ensimäiseksi.
Odotettiin jännittyneinä, puhuttiin matalalla äänellä, tiheään
sulloutunut joukko näytti ikäänkuin aaltoilevan. Muutamat olivat
lähteneet kilpailijoiden perään, tie kun koukerteli ja puut peittivät
näköalan.

Kului kuusi minuuttia. Jännitys kasvoi, äänet vaimenivat kokonaan.


Ja yhtäkkiä kajahti kymmenistä kurkuista:

— Pörppä! Pörppä tulee! Hurraa! — Runoilija! Hurraa!

Tienpolvekkeeseen oli todellakin ilmestynyt pitkä


kahdeksasluokkalainen, ja aivan hänen kintereillään porhalsi
Runoilija. Mutta jälellä oli vielä noin sata metriä jyrkkää ylämaata.
Kumpaakin juoksijaa kiihotettiin:

— Pinnistä, Pörppä, Runoilija ajaa ohi.

— Paina, Runoilija! Sivuuta vaikka terveys menisi!

— Pelle! Rannan Martti! Pietikäinen! kirkui joukko.

Pörppä läähätti, puoliavoin suu vaahdossa, pää taipuneena pahasti


taaksepäin. Runoilija oli kalpea kuin vaate, huulet tiukasti yhdessä,
leuka painettuna rintaa vasten kuin pahasisuisen hevosen.
Auttamattomasti vei kahdeksasluokkalainen voiton, ollen lopussa
lähes kymmenen metriä edellä. Kolmantena tuli Pelle, joka juoksi
kuin leikitellen, kauniisti ja kevyesti, kasvoilla lapsellinen ilme. Häntä
seurasi Rannan Martti hammasta purren, kulmat rypyssä. Aivan
lopussa muuan kuudesluokkalainen hänet kuitenkin sivuutti. Sitten
tulivat miltei yhtaikaa molemmat jälelläolevat kahdeksasluokkalaiset
ja neljännen luokan pieni menijä.

Vastoin oletuksia oli seitsemäs luokka voittanut. Rehtori lausui


muutaman sanan urheilijoitten kunniaksi ja ehdotti voittajille
hurraahuudon. Joukko hajaantui ryhmiin innokkaasti väitellen, iloiten
ja napisten.

Kilpailijat olivat miltei kaikki heittäytyneet kalliolle pitkäkseen,


levähtääkseen päiväpaisteessa. Runoilija loikoi kyynärpäähänsä
nojaten aivan jyrkänteen reunalla, itsekään huomaamatta, että vaara
oli lähellä. Hän tarkasteli rouva Lagusta, joka istui kanervikossa
posket punottavina, syvänsiniset silmät kirkkaina, runsas, vaalea
tukka tuulessa liehuen.

Aivanhan hän on kuin koulutyttö, varsinkin opettajien rouviin


verraten, ajatteli Runoilija. Mutta mitä! Häneenhän nuo kauniit silmät
olivat tähdätyt, siitä ei epäilystä. Runoilijan sydän sykähti oudosti;
hätäisesti hän käänsi katseensa muuanne.

— Sahra, tehän putoatte, siirtykää toki, huudahti maisteri Björk,


saksan ja ranskan kielten opettaja, tummaverinen, hieno mies, joka
aina teititteli.

Runoilija siirtihe laiskasti, vilkaisten välinpitämättömästi alas


syvyyteen… Mutta jälleen tuijottivat häneen laulunopettajattaren
kirkkaat silmät. Ja jälleen sykähti hänen sydämensä ja sekavuus
valtasi hänen ajatuksensa.
— Niin, ei pidä etsiä kuolemaa, jos aikoo runoilijaksi, kimitti
maisteri Sundberg. — Kalliohan on lähes parikymmentä metriä
korkea. Entäpä jos olisi pudonnut. Olisipa se ollut kyytiä. Jaa, Sahra,
minkä loppunopeuden olisi saanut?

Runoilija tuskin kuulikaan Suden kysymystä. Omituisen hurmion


vallassa hän katseli rouva Lagusta ja tunsi jonkinlaista mielipahaa,
kun tämä käänsi silmänsä muuanne.

— Minkä loppunopeuden ruumis olisi saanut? toisti Sundberg.

Jälleen katse kirkkaista silmistä; Runoilija oli kuin lumottu.

— Eikö Sahra voi sanoa, minkä loppunopeuden vapaasti putoava


kappale saavuttaa kahdenkymmenen metrin matkalla? kimitti Susi
vimmastuneena toisen kylmyydestä.

Rouva Laguksen kulmien väliin ilmaantui terävä ryppy, otsalla


näytti varjo vaeltavan, ja silmät väistyivät. Vasta silloin Runoilija
ikäänkuin heräsi ja tunsi punastuvansa. Häntä hävetti. Hän oli
tuijottanut opettajaa kasvoihin, ehkäpä julkeasti, ja ollut
epäkohtelias toiselle opettajalle, joka halusi keskustella…
Kummallinen kipu viilsi nuorukaisen sydäntä. Veri humisi, aivot
synnyttivät sekavia, ristiriitaisia ajatuksia; häntä ahdisti, hänen täytyi
tehdä jotakin. Ja yhtäkkiä hän kimmahti seisomaan ja heittäytyi
päistikkaa kalliolta veteen.

Kuului huudahduksia. Kaikki syöksyivät jyrkänteen reunalle.

Runoilija viivytteli tahallaan kauan aikaa veden alla. Heti


noustuaan pinnalle hän huusi iloisesti:

— Oivallisella loppunopeudella, maisteri!


— Sekös valehtelee! sanoi Pelle, valmiina hyppyyn.

— Minä kiellän ketään enää hyppäämästä, kuului rehtorin tyyni,


mutta luja ääni.

Pelle käänsi epäröiden päätään vähän sivulle; hän kohtasi


Filosoofin varottavan katseen ja peräytyi.

Filosoofi tuli hänen luokseen.

— Hyvä on, Pelle, että tottelit. Sinä olet aina niin jumalaton.
Pelkäsin, että suututtaisit esimiehemme heti alussa.

— Viis minä rehtorista! En vaan uskaltanut; se on vietävän korkea


kallio, vastasi Pelle, vaikka tiesikin, ettei Filosoofi häntä uskonut.

Filosoofi oli hetken vaiti. Sitten hän sanoi:

— Runoilija on jo rannassa. Minä riennän häntä tervehtimään.

Runoilijan pukeutuessa kysyi Filosoofi:

— Mitä varten sinä oikeastaan hyppäsit?

— Mitäkö varten? Sudelle kiusaksi tietenkin. Hän ahdisteli minua


kysymyksillään.

Syntyi hiljaisuus.

— On se niinkin, sanoi Filosoofi verkalleen. — Mutta muistatko,


mitä Arsène Lupin vastasi Ganimardille, kun tämä ylpeili hänen
vangitsemisestaan?

— No?
— "Nainen katsoi minuun."

Runoilija kumartui nopeasti solmimaan kenkänsä nauhoja.


HOTTENTOTIT.

Eino Harjanne, Monte Carlon kunnioitettava isäntä, jota sanottiin


Pankkiiriksi, astui juhlallisesti kamariinsa, istuutui tuolille, otti
käteensä sanomalehden ja alkoi silmäillä uutisia kaivellen tikulla
hampaitaan. Hän oli vastikään palannut koulusta, syönyt emännän
puolella päivällisensä ja kiiruhti nyt lukemaan lehteä, ennenkuin
pojat kerkiäisivät tulla, sillä tänä iltana oli Monte Carlossa sovittu
vietettäväksi täysi-istunto.

Hänen kamarinsa, Monte Carlo, oli matala, neliön muotoinen


huone ja niin pieni, ettei kookas isäntä sopinut siellä suoraksi kuin
nurkasta nurkkaan. Kapean, hieman viistoon lasehtineen ikkunan
ääressä oli pöytäpahanen, jonka toiselle puolen vaivoin mahtui suuri,
punaiseksi maalattu arkku, toiselle sängyn pää; sänky oli päivisin
puukannella peitetty ja sai tehdä sohvan virkaa. Seinällä riippui pieni
kirjahylly, ja matalan oven vieressä, nurkassa, oli valtava uuni. Kas
siinä Monte Carlon muhkea sisustus.

Se mökki, jonka kolmesta huoneesta yksi oli Monte Carlo, sijaitsi


vähän matkaa kaupungin ulkopuolella, ja sinne johtava tie oli
syksyisin perin rapakoinen. Mökin omisti muuan vanha itsellismuori,
miltei kuuro akka, joka Harjanteelle oli kaukaista sukua, jokin
naapurin kummin kaima. Akka oli hiukan viinaanmenevä ja ymmärsi
koulupoikia erinomaisesti. Joko he melusivat tai tappelivat, niin ei
hän siitä välittänyt, eikä se häntä, kuuroa, häirinnyt. Mutta olipa
muuan arka seikka, josta hän tulistui kuin pippuri: Kun Monte
Carloon väentungoksen takia pyrki tulemaan huono ilma, olisivat
pojat sangen mielellään avanneet oven eteiseen, sillä minkäänlaista
venttiiliä ei ollut olemassa. Mutta muorin omassa ovessa oli lasiruutu
ja jos hän sen läpi näki poikien laskevan lämmintä hukkaan, niin
pyrynä hän syöksähti pelipankkiin, ajoi joka ikisen mukulan pellolle
ja jallitti isäntää tukasta kuin pikkupoikaa. Ei siis jäänyt muu
neuvoksi kuin uunin kautta puhdistaa ilmaa. Mutta sekin oli sangen
vaaranalaista hommaa, sillä muori saattoi minä hetkenä tahansa
pistää päänsä ovesta, ja auta armias, jos pelti oli auki. — Muussa
suhteessa hän olikin pojille kultaa kalliimpi, sillä eipä hän kertoillut
maailmalle heidän kepposiaan eikä milloinkaan olisi edes opettajille
kavaltanut heitä.

Pankkiiri itse oli tavattoman pitkä, leveähartiainen nuorukainen,


jonka pellavatukka oli aina huolellisesti jakaukselle kammattu ja
kasvot täynnä näppylöitä. Kuten yleensäkin nopeasti kasvaneilla
pojilla, oli hänelläkin veltto ryhti. Sitäpaitsi hän tuntui häpeävän
pituuttaan ja käveli senvuoksi tavallista kumarammassa. Hän oli
vanhempi tovereitaan, seurasi tarkasti sanomalehtiä ja oli luokalla
ainoa mies, joka harrasti politiikkaa. Hän jutteli taitavasti ja
harvakseen kuin maan ukot ja poltti piippua.

Muori toi sylyksellisen puita ja ryhtyi tulta tekemään.

— Suotta poltatte. Eihän siellä ole kylmä ulkonakaan, murahti


Pankkiiri lehtensä takaa, pölläyttäen valtavan savupilven piipustaan;
hän oli huolissaan illan puolesta.
— Ei se lämmin luita riko. Ilmankin aina kitiset niistä hampaistasi,
sanoi akka hengästyneenä, rapistellessaan poroja esiliinaltaan.

— Laittaisitte ennen sisäikkunat paikoilleen. Yön mittaan tuulee


korvani huurteeseen.

— Vai vielä! Ilmankin ovia ja peltejä aukoilette. Jos vaan vähän


puhaltaakin, ainahan siitä raittiista ilmasta saarnaatte…

Harjanne syventyi lehteensä, kuuntelematta sen pitemmälle. Muori


teki tulen ja poistui.

Ovelle koputettiin.

— Entrez, monsieur! huusi isäntä.

Rannan Martti ja Jokinen saapuivat. Heti heidän jälessään tulivat


Puhakka ja Seppänen, ja muutaman minuutin kuluttua Ström,
kaunis, mustasilmäinen poika, joka oli puotineitosten ystävä ja jakeli
koko luokalle näiltä saamiaan karamelleja.

Äänettömänä, juhlallisesti, nostamatta edes katsettaan


sanomalehdestä, viittasi isäntä vieraansa istumaan ja jatkoi
lukemistaan. Pojat alkoivat keskustella, ensin arasti, kuiskaillen,
sitten yhä äänekkäämmin.

Pankkiiri kohotti silmänsä ja sanoi hillitysti, kasvoillaan tyynen


ylemmyyden ilme:

— Nöksit!

Heti syntyi täydellinen hiljaisuus. Tiedettiin vanhastaan, ettei


isäntää saanut häiritä hänen lukiessaan. Hän oli luokan valtiomies,
vaati ja sai kunnioitusta osakseen.

Pankkiiri sytytti rauhallisesti piippunsa, vilkaisi vielä kerran


varottavasti tovereihinsa ja käänsi lehteä.

Filosoofi, Runoilija ja Tengström — Tenu, luokan matemaatikko —


saapuivat yhdessä. Jonkun ajan kuluttua syöksyi Pelle sisään
huohottaen, silmät tuikeina.

— Jukulauta, pojat, tappelu tulee tänä iltana! huudahti hän.

— Näitkö tinureita? (Katupoikia sanottiin tinasotamiehiksi eli


tinureiksi.)

— Läpsän minä vaan tapasin… Tulee Ropakkosillalla vastaani ja


kehtaakin ryökäle sanoa: "Väistäs Ville pirua!" "Väistä sinä, kun
vastaankin tulet", tokaisee tämä. Ja konsa tämä huomaa sanasodan
olevan syttymässä ja tappelun sitä seuraamassa, niin tainauttaapa
nyrkillänsä Läpsää muotoon. Äijä vaipuu vähän äkkiä sillalta ojaan,
kura vaan tirskahtelee. Tämä lykkimään.

— Älä helkkarissa. Tietysti se kokoaa sakkinsa ja asettuu


väijyksiin.
Arvaavathan ne, että täällä sitä ollaan.

— Sittenpähän nähdään, mutta nyt se asia silleen. Eihän meistä


kukaan pelkää. Emme kai me tinurien takia iltaamme pilaa, sanoi
Filosoofi.

Monte Carlo oli kuin sullottu poikia täyteen. Isäntä pani lehden
hyllylle. — Antti Jäntti saapui vasta.
— Kas, merkkikauppias! Missä sinä olet viipynyt? Paljonko olet
tänään alaluokilta nylkenyt? huudettiin.

— Mikset istu? kysyi isäntä tyynenä ja vakavana. Jäntillä oli täysi


työ tuppautua ovensuuhun seisomaankin.

Pankkiiri nousi ja komensi:

— Eteiseen joka mies!

Kun huone oli tyhjentynyt, siirsi hän pöydän keskilattialle, otti


sängystä kannen ja laski sen toisen pään arkun varaan, toisen
sängyn laidalle. Sitten hän kohensi tulta ja kutsui toverinsa sisään.

Pojat sulloutuivat vierettäin sänkyyn, kannelle, arkulle; nipin napin


tila riitti. Isäntä sai pitää Monte Carlon ainoan tuolin, sen vaati vanha
tapa. Povitaskuista vedettiin punssipuolikkaita, joita joskus,
juhlahetkiksi, hankittiin, ja joka miehellä oli lasi mukanaan. Pankkiiri
täytti ne juhlallisesti ja nousi seisomaan.

— Toverit! Niin totta kuin ei meissä ole yhtään raitista, niin totta ei
meistä saa tulla ainoatakaan juoppoa. Suurina juhlahetkinä me
tahdomme irtautua arkipäiväisyydestä, sillä mikään inhimillinen ei
meille saa olla vierasta. Mutta me emme koskaan alennu minkään
himon orjiksi! Mikään ei saa tulla meille tavaksi! Olen puhunut.

Suuresta, 250 kappaletta sisältävästä laatikosta isäntä tarjosi


kullekin paperossin ja sytytti sen. Sitten hän nosti ylös pitkän
käsivartensa. Syntyi hiljaisuus, kaikki tarttuivat laseihinsa. Käsi antoi
merkin.

Hottentotti oli kyllä viisas miesi,


joten otti pikku tuikun murheeseen.
Hottentotti kyllä tiesi minkä siesi,
joten otti kaksi parhaakseen.
Bottenfokki!
Hottentotti
ryypyn otti.
Bottenfokki!
Hottentotti otti parhaakseen.

Laulun kestäessä heilutti kukin lasiaan tahdissa, pitäen paperossia


toisessa kädessään. Sitten otettiin yhtaikaa pohjaan.

— Muistakin panna pelti kiinni, kuului muorin ääni oven takaa.

— Tulkaahan vähän sisälle, huusi Pankkiiri ja kaatoi punssia lasiin.

— Ähä, vai jo taas! Iltaa, iltaa, toivotti akka.

— Kas tässä, sanoi Harjanne ojentaen lasin.

— Hprrh! Ähhäh!… Tuntuu täällä sentään lämmintä olevan, puheli


muori pyyhkien kämmenselällä irvistelevää suutaan. Hän meni.

Pankkiiri kohotti kätensä.

— Silentium!… Kertokaa juttunne!

Monte Carlon vanhoihin perinnäistapoihin kuului, että "tunnelmaa


odotellessa" kertoiltiin koulupoikien kepposista. Tällä kertaa ei
kukaan tahtonut alottaa, vaan kaikki katselivat toisiaan silmiin.
Vihdoin Puhakka nousi.

— Kahdeksasluokkalaiset tekivät tänään Sudelle seuraavaa: Heillä


on ensinnäkin suuri, kaksiosainen mustataulu, jota he sanovat
giljotiiniksi. Vastapäätä on kolmas luokka, ja jos joku pikkupoika
uskaltaa heille irvistellä, raijaavat he kauluksesta ilkimyksen taulun
luo, kohottavat taulunpuoliskoa, pistävät pään rakoon, giljotiiniin,
antavat lopiskoita, kiduttavat hetken ja päästävät pois. — Mutta
kahdeksasluokkalaiset ovat ollakseen suuria herroja eivätkä
mielellään menisi ulos välitunniksi. Pari poikaa nousee tavallisesti
taulun taakse piiloon siksi aikaa, että valvova opettaja on ennättänyt
tarkastaa, onko luokka tyhjä. Susi oli kerran äkännyt erään varpaat,
kun taulu oli sattumalta jäänyt hieman raolleen, ja senjälkeen hän on
visusti käynyt katsomassa, onko ketään kätkössä. Tänään oli taas
Suden päivystysvuoro. Pojat pistivät kalossit giljotiiniin siten, että
käret jäivät näkyviin, avasivat akkunan ja menivät ulos
kuuntelemaan. Susi tulee, huomaa kalossit. "Välitunniksi on mentävä
ulos", kimittää hän. Kalossit eivät liikahda. "Jänis! Luulee olevansa
piilossa, kun pää on pensaassa", ärjyy Susi mennen taulun taakse
katsomaan. Voitte kuvitella, minkä näköiseksi hänen naamansa
venyi. Ulkoa kuuluu kauhea naurunrähäkkä.

— Veljeni kertoi seuraavan jutun neljännen luokan Viitasesta, alotti


Jäntti. — Oli uskontotunti. Viitanen leikitteli veitsellään. "Mitä
Viitasella on siellä?" kysyy opettaja. "Veitsi." "No mitä sillä veitsellä
nyt, keskellä uskontotuntia?" "Meinasin terottaa kynääni", vastaa
poika hitaasti. "No mitä sillä kynällä sitten?" "Olisin merkinnyt läksyn
tunnin lopussa", kuuluu tyyni vastaus.

Kukaan ei enää alottanut uutta.

— Sinun lukkotemppusi, Pelle, oli miltei kaikista paras, sanoi


Runoilija.

— Niin, pojat. Koettakaapas etsiä suurempaa lukkoa koko


kaupungista, ylpeili Pelle.
Asian laita oli sellainen, että Pelle oli aamulla tuonut hirveän
suuren, ruosteisen lukon kouluun. Matematiikan tunnin alussa hän
oli pistänyt sen Rannan Martin napinläpeen ja painanut kiinni. Martin
oli täytynyt istua mokoma koriste rinnassa, ja Susi oli raivostuneena
kysynyt, mitä se merkitsi. Silloin Pelle oli vaatimattomasti selittänyt
löytäneensä lukon, pistäneensä sen leikillään Rannan napinläpeen,
jolloin se vahingossa oli loksahtanut kiinni; avainta kun ei ollut, ei
sitä oltu saatu pois. —

Syntyi hiljaisuus. Poikien posket alkoivat punertua, ja silmiin


ilmaantui kevytmielinen loiste. Mutta mieliala oli vielä pingottunut ja
jäykkä. Tupakansauhu kiirieli mahtavana pilvenä katonrajassa, ja
uuni hehkui lämpöä. Odotettiin merkkiä isännältä…

Jo kohosi Pankkiirin käsi.

— Takit! sanoi hän.

Käsi teki liikkeen.

Hottentotti oli viisas poika kyllä,


joten otti pikku tuikun lämmökseen.
Hottentotti: häll' ei takkiakaan yllä,
joten otti kaksi parhaakseen.
Bottenfokki!
Hottentotti
ryypyn otti.
Bottenfokki!
Hottentotti otti parhaakseen!

Kun laulettiin neljättä säettä, riuhtaisi kukin takin päältään.


Lopussa tyhjennettiin lasit yhtaikaa.
Syntyi hirveä meteli. Sitten otettiin kortit esille ja ruvettiin
pelaamaan tulitikuilla nakkia kahdessa ryhmässä. Kuului sekavaa
sorinaa, äänekkäitä huudahduksia ja pelilauseita: "Tämän kautta."
"Näillä minä tinaan, sanoi peltiseppä." "Haistapas tota, sano
Junkkarin vaar-vainoo kittiä."…

Aika kului. Huoneessa oli kova kuumuus. Hiki helmeili poikien


punaisilla otsilla, ja tupakansauhua oli niin sankasti, että pelaajat
näyttivät haamuilta.

Vihdoin Pankkiiri täytti lähtömaljat. Laulu kajahti nyt toisella


voimalla kuin alussa. Pojat nousivat, varustausivat tappeluun ja
lähtivät.

Lokakuun ilta oli tyyni ja pimeä.

Hottentotit vaelsivat Monte Carlosta jännittynein mielin, vaieten ja


hyvässä järjestyksessä. Ropakkosillan luona yllätti heidät erään vajan
takaa tuleva kivisade.

— Tinasoturit piiloutuvat! Hehän sulaisivat miehen katseestakin,


huusi
Runoilija.

— Vaksinaamat! Vaksinaamat! kuului vajan takaa.

— Tulkaas tänne, tinurit! Me annamme lihanne kedon pedoille ja


taivaan linnuille, pilkkasi Pelle.

— Vaksinaamat, riuhrot, potaattikuopanvorot, piirikunnan-


häpäisijät!

— Tinureilla on hameet päällä, siksi he piilevät!

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy