You are on page 1of 67

Scripts /)

Cyril Huang

uŒÌã
cyril@gyoza.homeip.net

June 14, 2002


Contents

1 GŽ 5

2 $Bourne shell 7
2.1 + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1 shellÎ#‚ . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.2 ƕshell scriptsubshell . . . . . . . . . . . . . . . . . . 9
2.2 ŽóÐóÿà;¶® . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.1 Žó¸à . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.2 Srquote . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.3 Àrݎó゠. . . . . . . . . . . . . . . . . . . . . . 11
2.2.4 •(Žó . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.5 ×°/Žó . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3 Ðó9jÿà; . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3.1 ÿà;P . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4 ¥Š²I/˜úƒ . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4.1 /˜úƒ . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4.2 ²Iúƒ . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.4.3 Žó. . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.5 File descriptorI/O0' . . . . . . . . . . . . . . . . . . . . . . . 22
2.6 ø×?Žf . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.6.1 ?Žf . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.6.2 if f¾\ . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.6.3 for loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.6.4 while loop . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.6.5 case switch . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.7 
Portable Shell remote shell . . . . . . . . . . . . . . . . . . . . . 28
2.8 ”+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3 Regular Express 31
3.1 + 
-RE glob . . . . . . . . .
. . . . . . . . . . . . . . . . . . . 31
3.2 C- § . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . 32
3.2.1 ÃÍC-î . . . . . .
. . . . . . . . . . . . . . . . . . . 32
3.2.2 C- § ÀrPšî . . . . . . . . . . . . . . . . .
- 33
3.3 C™ § !Àrî
- . . .
. . . . . . . . . . . . . . . . . . . 33

3
CONTENTS CONTENTS

3.4 Pšë(address) . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.5 greedyÝregular express . . . . . . . . . . . . . . . . . . . . . . . 34

4 sed 35
4.1 + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2 Ð)fÝ addressing . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3 pattern/hold space, regex9 f script j . . . . . . . . . . . . . 36
4.4 sed command úƒ . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.4.1 Ãͼƒ . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.4.2 pattern/hold space Ý § . . . . . . . . . . . . . . . . . . 39
4.4.3 
×M . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

5 awk 45
5.1 + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2 scriptÁ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.3 Žóû› § . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.3.1 /Žó . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.3.2 awkŽó Žó shell . . . . . . . . . . . . . . . . . . . . . 49
5.3.3 p  ÐóArray split . . . . . . . . . . . . . . . . . . . . 50
5.4 ÃÍ×+° . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.4.1 ó.ìÕÐ . . . . . . . . . . . . . . . . . . . . . . . 51
5.4.2 if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.4.3 for loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.4.4 while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.5 function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.6 ̀Ðó . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.6.1 C™ § ‚ð -match . . . . . . . . . . . . . . . . . . . . 54
5.6.2 íáíŒ § print(f) . . . . . . . . . . . . . . . . . . . . . 55
5.6.3 Bó rand() . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.6.4 Ù system() . . . . . . . . . . . . . . . . . . . . . . . . . 56

6 perl 57
6.1 ÃÍ+°£]lV . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.1.1 Žó . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6.1.2 f× . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.2 ?powerÝregular expression . . . . . . . . . . . . . . . . . . . . . 58
6.3 ðàÐó . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.4 Ù § . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.4.1 process . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.4.2 jn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.4.3 system call . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.5 module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

uŒ`Äò·®
CONTENTS CONTENTS 5

C+°f´
Žó
7 Bourne shell, perl 59

p
7.1 . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

fB–
7.2 Hash . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

ff´ . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.3 . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

]º×
7.3.1 61

]º . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.4 . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
7.4.1 while 62

—P
7.4.2 for loop
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

ۊ
7.5 . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.6 . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

uŒ`Äò·®
CONTENTS CONTENTS

uŒ`Äò·®
Chapter 1


Í@ΜbàÃÍÝ Ìœ9¯Í@ê µŠXÝ xŠ
3† •( îÝ ‚v|IYP¶® lPݶ®…
scripts scripts

«  %®ç°%® ‡‡KŠàÕscripts
” ” configuration

#‹ô|à ¶Í ÷ X| ÎtÃ͐GÍ@Xt


Makefile package System Admin

Š¶ÙõTàPݕ º/lVÝ Õθàé\Ýt{(&Ý


perl scripts server scripts
script

scriptÍ@×ߌÿºàÕAŒ ®î^broutineÝ ® #‚


I5ÝßÝé\…ºàÕ»AÑ;×SZaTïi% xŠÎ9° ®
Îðð3†ÿœ×ÍgeneralÝ!J »A&àscriptÞ?ÿÕÝ£]
¿àgnuplot®x-y`a% ×ߺ- „‚9‚jìàExceli΍Ž
®ÞÎ×ߝ×O…« ©†€Í¿g9˯à€¬«¬ô^ð9K
` ¬ÎAŒðð®? §œ9g`×ßôºœàº/(macro)
Ñword, excel macro 9Í@µÎ×Ëscript
scriptsmŠ_ËX||œ"ݶŒ¼Ñ; C/C++mŠ§ºB7
›Ý®Þ scriptsµ BASIC+ŽÝ¥3ßv¤ÝŽóµ?C/C++µ
3£\.£]3 B7›É¼Éœ à+µÎÝ¥3CPU/ݺՎ› - reg-
isters9Ít&µ Î&Í5·ÚxŒ¼Ý»A˜œ/׊ºÃ
J̬^b9°ÃÍ Ìô•µÕºJÌ£̧ø†Œ¼
Ý?? N×·Kµäì«×·Ýèºinterface¼¸àQ¡èºî׷ݸ
àï interfaceN×·N×·KbÝX|Einstein1ݵÎIYbôÝ
Ò«Ä t&§ßÝÃ100Ob×ÍßÏ X|scripts3†Ñ;õ
×°routine jobbœ">ÝÄP
Again! AŒ¯Ýé\ÁΜ?9\b݋—¯º:ÿÆÿœp
ô0ՏŠÝ£G»A.profile .bashrc9Ëj( 9Λ
ºÝ.ïÝÄAŒ¯Š9×FÝÌFT9S ZaE¯bX
QÃ

7
CHAPTER 1. GŽ

uŒ`Äò·®
Chapter 2

$Bourne shell
2.1 +
2.1.1 shell Î#‚
shellÎ×Í#å¸àïúƒ¡šO®¼ÙƕÝ×ÍTàPbߺ
.shell ii‘3kernel²«Q¡3‘×·AP&f´Q!9Ëi°¦ E
y&¼1shellô©Î¨²×ËapplicationP‚Í@¸«gimp, netscape
‡‡Î×ø݋—©Îºlogin§Œ¼X|€Î|ðÝ×ËTà
P àC program¼9ø|Q¯ÝŠ•(Žó

9
2.1. + CHAPTER 2. $BOURNE SHELL


bash -
ls

USER 0x000 USER 0x000


exec - subshell
exec bash
USER 0x000
exec
KERNEL exec KERNEL

4GB 4GB
KERNEL

4GB-
cp
USER 0x000

-
rm
0x000 KERNEL
USER
4GB

- ENVIRONMENT
VARIABLES
KERNEL

4GB

uŒ`Äò·®
CHAPTER 2. $BOURNE SHELL 2.1. + 11

¶×wshellÍ@&ðŽxŠÎRÕuserÆÝúƒ¡àforkþŒ¨
×process Bœunix likeÎ9ß9 ÝQ¡3Š9Íchild processàexecœÆ
•9Í ²IP»Als, rm...‡‡X|shell/Iݺ®ÃÎ9øÝ
1. shellPל"8ÇK
2. ƌprompt‡¸àïíáúƒ
3. RÕ¸àïíá
4. fork()×ͱprocess
5. exec()úƒ
6. ƕ9Íúƒê/Õshell
39\
º:Õunix likeÝƕ×ÍPK΢ãexec9Ísystem call¼Æ•
Ý 9ή¼Ù躸àïPƕPÝ^×system callÎuserP
«kernel Ú;Ý°×Ѽ
3|GMS DOS`‚×^¡ºœÆ•command.com9wPµÎshell
€µºþŒ
C:\>

‡¸àïíáúƒ9ÍC:µÎèîÐr(prompt)bourne shell;ðpromptÎ$
©Ä9Ídos shell8 Ý-X| `b͜b(Ý4DOS9Íshell|
゠€(4DOS9ÍshellÍ@Jݜ9unixîshellÝ©P Q«ËÝunix
shellÎ f) AŒ
©Îà€¶×¶×°icon¡¼ÝMS-Windows`
‚XÝ`‚Ý command line shellµ%;Ý+«›ã‚ÝÄƕ¨×
ÍPÝ^×Î× øΊexec()
unix like ÝÙÝúƒø—PÝshellÃÍîtÝƕ²IúƒxŠ€|
”ŠÕ”×°C™¼Æ•9°C™scriptÝ? Ν|'×°•( .9Í
²Iúƒ/)R¼W× ® »A3Windowsì&Æôº'TMPDIR9
øÝê¼Õ£Íêœb°windowsP º.ƕÝ×°õ`jnw3
9…unix likeÝshell scripts+°|bif, while, for loop‡‡¤g×°²I
úƒ| ½•(!`b!Ý' ¸ÿ×°^ð ®î?ÿTT
Wf€Ýdos shell? ú
sed, awk....9°²I Ìò‚òBÕÎýãÝunixÙÄnÝú ƒ
̵ winzipŽWNÍwindowsKº„Ý Ìœ9 ÌÕÎWZÝ
/ BÃshell programming ÌÝ
2.1.2 ƕshell scriptsubshell
ËË]°
• ’R±shellƕshell scripts

uŒ`Äò·®
2.1. + CHAPTER 2. $BOURNE SHELL
3êGshellƕshell scripts

’R¨×Íshell¼Æ•Ýscripts3scriptsjtG«GŠ
#! /bin/sh

Ï×Ë]°Î3shell script ZCjG¼Œshell scriptsŠ\ÝP3£(ôµÎ


&ÆÝshell)Q¡.ZCjÝƕJ§Æï×ƕÆ•j]PƕTï
§ ×Íshell¼ŠÕZCjtest.sh
$ test.sh
$ /bin/sh test.sh
$ ( . test.sh; )
$ exec test.sh

ÏÞË]°Îàúƒ”.”Tïsourceƕ
$ . test.sh
$ source test.sh
$ { test.sh; }
$ eval ’. test.sh’

-½3y×°'©b39ÍshellìÝÕó‚’R¨×ÍshellµÎ¨×Í
8Ýt& ôµÎàÏ×Ë]°Æ•ÝscriptŽóÝ'ºÅ(
Õæ¼ÝshellŽó 9Í8 ¥Šksh^bsource9ÍúƒX|t?Š
àsource Àr( )îà¨×ÍsubshellÀr{ }îàêGshell»A
$ ( VAR=’testvar’; )
$ echo $VAR

$ { VAR=’testvar’; }
$ echo $VAR
testvar

©b{ }/ÝVARÝÂ'Íà . Ý]°ŠœT Š3script…«


à
$ . test.sh arg1 arg2

. arg1 arg2ºµYñ§9ÍscriptÝarg1 arg2¼à . Ý]Pt?Ίƕ


Ýscript©Î×$script libraryñ¢ó ¨²AŒ . test.shƕtest.shÒ
`ñ§. test.shÝshellô«½Ò
uŒ`Äò·®
CHAPTER 2. $BOURNE SHELL 2.2. Ž ó Ð óÿ à ; ¶ ® 13

2.2 Ž ó Ð óÿ à ; ¶ ®
2.2.1 Žó¸à
›ŽóÂà
var="value"
var=’value’
var=‘command‘

Š.ÂJŒ¼ŠÍþÐr$
$ var="I am a gyoza"
$ echo $var
I am a gyoza
$ var=‘ls *‘
$ echo ${var}

$ var=’$var’
$ echo $var
$var

|ŒÝÎè}Îb-½ÝbSrÝ!®àš?ì:
2.2.2 Srquote
"8îÝdouble quote, single quote, backquoteŠz½
• backquote ‘command‘ 9ÍÎúƒã‚‡y $(command) X|ðð
:Õvar=‘commandTïvar=$(command) µÎ.commandƕ”Œ'
›var
• single quote 3’ ’/ÝZC;;1¹æø†‚ðb°1ºÐr3ŽS
r /1º©„ŒL
• double quote 3” ”/ÝZC$ ‘ ”ëˌLº‚ð͸Ý1¹æø
• escape char 3\ ¡ÝŽ×C-ô|1¹æø

2.2.3 Àrݎóã‚
îÀr{}ÎparameterÝ]° ${var}Îf´?ݶ°AŒ^bŠÍ€
C™|à$varµ? Tè}Îb-Ý€ ̀P¶®9è×Í
Kè×}Îb-Ý ̀Žó×°à°
• ${var:-value} AŒvarbÂÝ£‚µàæÍÝÂQàvalueÝÂ
• ${var:+value} AŒvarbµàvalueÝÂ

uŒ`Äò·®
2.2. ŽóÐóÿà;¶® CHAPTER 2. $BOURNE SHELL
• ${var:?message} varb£‚µàæÍÝÂQµŒmessage ÂÕÇ
K¬v®Œ
• ${var:%pattern} AŒpatternvar¡«ÝI Ù)F/yì^b Ù)
I › var
• ${var:#pattern} AŒpatternvarG«ÝI Ù)F/yì^b Ù)
I › var
• ${var/pattern/substitute} AŒvarbpatternÙ)µ‚ðWsubstitute
š:×Í»
# remote shell $RSH º‡y /usr/bin/rsh AŒRSH ^b›Â
RSH=${RSH:-/usr/bin/rsh}

9Ë]Pà3bPÝoptionœ?à
|ì«9͗P »
# :+

AŒF¢ó›€J ŽW"-o ¢ó"^b¢óJVAR^bÂ


#

ÎÏ×ÍF
¼Ý¢ó AŒbÂVARµà"-o $1"
# VAR
# $1
func()
{
VAR=${1:+" -o $1"}
}

9˝|à3[ãC™ÝØI
»A TïbÝúƒã/ݔŒ??ΖE­5(
# :%

¬&Æ©Št¡«Ý£Íjn(`|à9ͼ[ã
# find

ÄFÙÝ ^b% # pattern match9©b3


#

b t?Šà;àsedf´1 ×F
# bourne shell
# ksh bash

PRIV_HOST=fermion-priv
PUB_HOST=${PRIV_HOST:%-priv}

º‡y
echo $PUB_HOST
(PUB_HOST fermion)

# ‚ðôÎ 3±ÝKorn shellBourne Again Shellîb

BLOCK_DEVICE=/dev/vx/dsk/oracledg/vol_0
RAW_DEVICE=${BLOCK_DEVICE/dsk/rdsk}

2.2.4 •(Žó
û;ݎó AŒBourne shell, korn shellìà
$ export var

uŒ`Äò·®
CHAPTER 2. $BOURNE SHELL 2.2. Ž ó Ð óÿ à ; ¶ ® 15

c shell, turbo c shell à


$ setenv var

J9͎óµŽW×͕(Žó3C…«Ý
main(int argc, char **argv, char **envp)

&Ɲ|3shell…'•(Žó‚9ÍÂÎNÍã9Íshell forkŒÝP
BãenvpK:ÿÕÝ9Íargv, envp¼ÝK3virtual memoryÝì«stack ?
îÝ š:k®”àOpen Source toolss8›” X|shellôÄ
Î×Í”User spaceÝC program”•(Žóž3C image user spacetì«
ô|getenv9Ílibrary function callJÕ X|× 'Žó^b'
•(Žó^bð°.Â×å͸ÝP 9\Š¥ŒÝÎæÍÝBourne
shellÝexport^bYî

$ export var=value

ݶ°X|:Õ×°shell scripts ÝportableRŒKà


$ var=value
$ export var

2.2.5 ×°/Žó
• $? G×ÍúƒÆ•Ýstatus 0î^®Þ3P'Œ…0
îFALSEôîNo ERRORX|PÝexit returnŠ §?
• $# îF›shellÝargumentsó

• $0 9Íshellúƒ(C

• $1 $2 $3 ... functionF
¼Ý¢óarguments

• $@ îfunction F
¼ÝXbargumentsº‡y ”$1” ”$2” ”$3”

• $* îfunction F
¼ÝXbargumentsº‡y”$1 $2 $3”

• $$ îêGÝprocess ID

9\$@ $*Î×ø݊Tsingle guote, double quoteÝ×ø $?à3?Ž


fݾÎtðàÝ
shell×ôº'×°/•(Žó9°•(Žóºb×°PŠ›º
¼\ã »AmailPàÝMAILb¼€úƒX3¨´êÝPATH‡
‡ 9°Î¶bash, ksh, cshÝC׶3CP/Ý :•(Žóàenv9
Íúƒ:Žóàsetúƒµ:ÿÕ×ø”Œ
uŒ`Äò·®
2.3. Ðó9jÿà; CHAPTER 2. $BOURNE SHELL
2.3 Ð ó 9 j ÿ à ;
ÐóÝLœà#µÎ
func()
{
cmd
cmd
...
}

FÂôÎ×øݼ§$1 $2 ...$@ ‡à°Î×øÝ ñ§`µÎ


func arg1 arg2 ...

Š¥ŒÝΎóÎ^b C×øÝblocal variable;;ÎglobalÝ Ž


ÝperlôÎ9ø
2.3.1 ÿà;P
functionÎtŽÝmodulized¶®¼µÎ9Íÿàj Wshell libj à
Ý9ÍjݮޫCÎ×øݵΎó§ø3×ÍjLÝQ¡¯½Ýj
¢ï ;ðexport W×͕(ŽóTïàeval9Í/IúƒÆ•×ÍÍshell
script¸ÿ 9ŽóÎK:ÿÕÝ

2.4 ¥Š ² I  / ˜ ú ƒ
&ÆðàÝls, cp, sh....‡‡9°KÎ×͝ƕj8Ey×ͲIÆ•
j shellb×°/˜Ýúƒž3shell…«9°Îbuilt-inÝ/IúƒÎ 
àC¶ shell9wP`µ¶3…«Ý cd, export9µÎ
bashÍ@bœ9|GݲIúƒ€K‘â
¼®W/IúƒÝ»Aecho,
getopts Ä ÝP÷P&ÆÎ.€ÆÌ ²Iúƒ9°/˜ú
ƒ|àenable, disable3bash/ã*ĽÝsh, kshT&µ^bÝŠ
T
2.4.1 /˜úƒ
f´¥Švp×FÝ/˜úƒb
• : ƒ¼ƒ#‚K®‡yCPU/ÝNOP¼ƒ

• eval I5༮ËgŽóð

• exec ƕØËúƒ¬vð*êGshell(æÍÝƕºð*shell)

uŒ`Äò·®
CHAPTER 2. $BOURNE SHELL 2.4. ¥Š ² I  / ˜ ú ƒ 17

• read ÿÕ¸àïstandard in("8)íá


• set shellÝÞÞ'»Adebug shell scripts

• test shell scriptsÝ×+°/Ý?Žf

• trap #ÕØËGrÝ §

• shift argumentsÝ §

: magic numbers Û Š
:Ά¢¯Ý3UnixيƕPºœlãjnGÝC™§ magic
numberž€ÝBourne ShellÝƕmagic numberÎ : ‚Î #! X|:Õ9Ë
|:Ýshell scriptµŠ¤QR¯!`:ôbßJ¼®ÛŠà ‚à#Ý
9°€êYÝshell scriptKΜ•Ý
eval ñ ^ C -
eval|J¼Æ•×ÍúƒĀtðàÝÎJ¼®ËgŽó݂ð xŠ
ÎNgƕ×Íshell úƒ€ºevaluate×g:Õb$9͋—ݵ.Âð×
g.Žóð* Q¡ƕ×Å9Ëdouble scanÝ]°E×°Žó‚ðœb
à . evalΒR¨×Íshell¼Æ•‚Î3ͼ9Íshell/9evaluate×
g X|‚𔌝|1ºì¼ »AAŒ&ƊËg‚ð
count=1
var1=I
var2=am
var3=a
var4=gyoza
while [ $count -lt 5 ]; do
eval "echo \$var$count"
let ’count=count + 1’
done

|×àŽ;1. 2. 3 ....Š®ß×ͱŽóvar1 var2 var3....Q¡E var1


ãÂÍ. Ï×ÍvarºÕX|àescapeC-\ Q¡ÏÞ
count

gºÕ`ŠÕ £AŒŠëg|îŽó‚ð3ו/ŠX÷? :Ï


var2

evalxŠà¼evaluateƕ×Íshell scriptj| C×ø¶Wœ9Ý ÿ


àshell script3!×ÍshellìrunJŽó3hshell/;;b[
$ eval ". foo.sh"

ÄAŒŽóH9(CºÆÚ
uŒ`Äò·®
2.4. ¥Š²I/˜úƒ CHAPTER 2. $BOURNE SHELL
exec
º. êG Ý JÍ J*ðW¡«ÝúƒÍ@9µÎà
9Í Hð*•݌LÎ×øÝ tð:ÕÎ3 /.xinitrc9
exec ” ” shell process

Í Hð*W »A exec twm X|AŒ¯3shell


exec() system call

ƕ
scripts window manager

exec cmd

‚cmd9ÍúƒD3µº/Õloginœ. JÍshellðÕcmd¬Q^
bcmd9Íƕj X|ƕPÝ]°ËËÎ×øÝ
$ exec cmd
$ cmd

w3scriptsÝƕ Qô×ø Äexec3scriptb¨×Í8 ¥ŠÝàHµ


Ϋfile descriptorÝ=” 9͇쫼D¡
read
$ read input
read from standard input
$ echo $input
read from standard input

Jº‚39\‡"8íáíáC™ŽW$input9͎óÝÂ
set
set ÎJ¼'9ÍshellÝƕ•(Ýf´¥ŠÝscriptºàÕÝÃ
• set -- Ñð:Õ-¡«Îoption¨3Îoption ‚Î×Íúƒ¢ó
A-1 -2 ...
• set -a 9\|¡ŽóŠ›ŽW•(Žó
• set -f ŠŠÕj(Ý©„C-»Awildcard *ŠÕ Xb݌¤Ý
• set -x debug shell scripts
׊àexitÒshell,ͼ¶Ctrl-D(eof)ô|
• set -o ignoreeof
• set -o noclobber n*I/O0'ãoverwritejn
• set -o notify shell”@` ×background jobÝstatus
• set -o noglob n*wildcardC-ŠÕ A * ? [ ]
• set +o .-oÝD'E®

uŒ`Äò·®
CHAPTER 2. $BOURNE SHELL 2.4. ¥Š ² I  / ˜ ú ƒ 19

n*-v -x –ëËó4
• set -
set -- Tïset - ððà3shell scripts…« set -o ΜðàÝ»Aset -o
vi'shellÝE®]Pàvi]° ã/îÍúƒµÎ¶ESC¶kC set -o
emacsµÎàemacsÝ]°

test
test Î×+°Ý?Žf9Í3ì«D¡
trap
RÕØÍsignal`shell†ÝET
;P
ÍsignoÎ
$ trap "command" signo

cyril@grill:~$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO

»A
30) SIGPWR 31) SIGSYS

$ trap "" 2
$ trap "rm $TMPFILE" EXIT 1 2 15

AŒ””ÝcommandJîshell §9Ísignal 2rµÎINT;ðµÎ¶ÝCtrl-


CÆ\shell scriptÝƕ15µÎ TERM(processkillÝ):p×FÝ»
trap_init()
{
trap ’ scriptcleanup
[ "$SCRIPT_DISP" = ABORT ] && exit 100
[ "$SCRIPT_DISP" = PASSED ]; exit $?’ EXIT
if [ -z "$__TC_INTERACTIVE" ]
then
for sig in HUP INT TERM; do
trap " trap - HUP INT TERM;
echo ’Signaled - cleanup after script ...’ >&2;
scriptcleanup $sig; kill -$sig $$; exit 101" $sig
done
fi
trap : PIPE

uŒ`Äò·®
2.4. ¥Š²I/˜úƒ CHAPTER 2. $BOURNE SHELL
}

9Í»ÝG«AŒ8ÕEXIT9ÍsignalµÆ•scriptcleanÕexit $?Ýcode
µÎŽquote/݋— AŒ$ TC INTERACTIVEÎèC™µÆ•ì«
Ýsignal § t¡AŒÎSIGPIPE(13r)µ†¢¯(Ar:)
shift

Îà¼.
¼ÝargumentsÉ×͛É shift n Én͛É shift|J¼
àøÄ10Í|îÝargrments. $1 ... $9©b9͂ ¼:×ÍshellÝqueue
shift

listÝappend

# list_append list_name item ... - append items to a list


list_append()
{
_list_a_name=$1; shift
eval "set -- \${$_list_a_name} \$*"
eval "$_list_a_name=\$*"
}

2.4.2 ²Iúƒ
b°²IúƒðàÕ
• basename J*—j(Ý §

• echo ŒmessageÝ]°

• find 0jn

• getopts §F
¼Ýarguments«CÐP0Ýgetopt()œ

• xargs pipe`ÝúƒÆ•¢óargumentsÝ §

¨²sed awkºbÝ+Û
basename

RŒj(—j( Ì
$ basename foo.c .c

J—j( .c º„*
uŒ`Äò·®
CHAPTER 2. $BOURNE SHELL 2.4. ¥Š ² I  / ˜ ú ƒ 21

echo
ÎŒ‹—ÕÇKÝWð(ôbprint, printf|à) 9\ŠýÝÎsh,
/ÝechobashÝ×øX|'b°×ø
echo
ksh
Šð•(newline)
ŠÕescapeC-\c‡y-nà°
echo -n "messages"

echo -e "\t messages" tab3messagesG


echo -e "messages\c"

FÙsh, kshÎ^b-n -eó4Ýà#àechoµ?


Šð•(newline)
ŠÕescapeC-\c Šð•(newline)
echo "messages"

echo "\t messages" tab3messagesG


echo "messages\c"

getopt
getoptsÍ@Îksh, bashÝ/IúƒgetoptÎËݲIúƒ 9œ C…
Ýgetopt()š:Í»
while getopts :dvt:n: c
do
case $c in
d)
DEBUG=yes
;;
t)
TYPE=$OPTARG
;;
n)
NUMBER=$OPTARG
;;
v)
VERBOSE=’yes’
;;
esac
done

ÍAr:Î19Í¢ó׊b«½Ý¢óÂ^bAr dvî¡«^
bñ½¢ ó »Atð:Õ-vÎ1Pƕ`Îverbose modeµÎ9ø
$OPTARGµÎ«3¡«Ý ¢ógetoptsŠ›Q& §?¬v×Í×ÍÝó

$OPTARG¼€ôb$OPTIND«C libraryÝజ
find
´0jnàÝPúƒ
uŒ`Äò·®
2.4. ¥Š²I/˜úƒ CHAPTER 2. $BOURNE SHELL

0
find . -name "regex"

0
find / -type d directory

0
f plain file

0
l symbolic link

0
p named pipe file

0
b block device
c char device
find . -perm 755
find / -user cyril
gzip ‘find . \! -name ’*.gz’ -print‘

bÝshellŠ\ . !b©½ŒL»Abashîã/|GÝú
ƒ
not !

find -name -type -o -name

3scriptœ9`ÎKÎñ^C-®Þð:Õ\`KŠÕ9Îñ^C-
3script ()ôb©½ŒLî’R¨×Ísubshell¼Æ•X|$Õ()`ôŠà
ñ^C-Tï)sed awk×R¸à`ôÎ×øݼ§
xargs
xargs ༠§×°íŒ”ŒŠ¼ ¨×ÍíáÝarguments$ÕÝ®Þ »A
# find /usr/include/ -name "*.h" | xargs -n 2 diff

-n2μbËË W팎WdiffÝargumnets
# find /usr/include/ -name "*.h" | xargs grep ’#ifdef’

Ñð/ÎíŒÝ×rZ8ݔŒbàxargs`Î×Í×Í;›¡«Ýúƒ
# find /usr/include/ -name "*.h" | xargs -i cp {} ~/include/

-i  { }|.findÝíŒÝN×Í WcpÝÏ×Íargument /.µ| WÏ


ÞÍargument Í@find…«b-exec9Íó4¡«ô|à{ }î×Í×Í
;›¡«P‚Î ×rZ0Ý;›¡«P
# find /usr/include/ -name "*.h" -exec cp {} ~/include/

2.4.3 Žó.
xŠÎJ¼®counterÝbœ9Ë]°ì«+ÛëË bashbÍ/˜
Ýlet »A
uŒ`Äò·®
CHAPTER 2. $BOURNE SHELL 2.4. ¥Š ² I  / ˜ ú ƒ 23

let ’x = x + 1’
let ’x = x * 1’

¥Œ!!9\‡rŸ\ÝxãÂ`àþÐr‚v3Žquote/ô|bè
} kshôb/˜ÝÄ9ÎNËshellKbÝ f´1 Ýportable®°
Îàexpr9ͲIúƒ š:»
if [ "$KSH" ]
then
eval ’
add()
{
result=$((${1} + ${2}))
}
sub()
{
result=$(($1 - $2))
}
mul()
{
result=$(($1 * $2))
}
div()
{
result=$(($1 / $2))
}
inc()
{
eval "$1=\$((\${$1} + ${2:-1}))"
}
dec()
{
eval "$1=\$((\${$1} - ${2:-1}))"
}

else
add()
{
result=‘expr $1 + $2‘
}
mul()
{
result=‘expr $1 * $2‘
}
div()
{

uŒ`Äò·®
2.5. FILE DESCRIPTOR I/O  0' CHAPTER 2. $BOURNE SHELL
result=‘expr $1 / $2‘
}
sub()
{
result=‘expr $1 - $2‘
}
inc()
{
eval "$1=\‘expr \${$1} + ${2:-1}\‘"
}
dec()
{
eval "$1=\‘expr \${$1} - ${2:-1}\‘"
}

9î«LÝ×°—P|3script…«×ø ñ§×úƒñ§
Î×Ísubshellƕ1+1¬vF/”Œì«»¯&R&Ýbasic
P
$((1+1))

i=0
while [ $((i=$i+1)) -lt 10 ]; do echo $i; done

Ä$(( ))9«${VAR%value}×ø©bksh bashbt?Šà3mŠ portable


ÝshellPî —PÝposition parameters $1, $2 ....«¿ðscriptPæJ
×ø
AŒŠ?9Ýó.»AóFݺÕTïsin log‡Ðó¸à µàbcõawkÏ
kshbashKYîtypesetÄFÙÝsh¬Yîbashbdeclare9Í/I
úƒ 9ËÍKÎJ¼L9͎óÎ#‚P²Ýœ C݅×Ä
Ýportableà µŠàÎàtÃÍÝshµ?AŒË݊¶ÿœÓ
µàperlÏAŒ&ðÝ ¯µàCC
$ typeset -i int_var
$ declare -r constant

'WJóAŒ›C™Jint varݺÎ0AŒà-r JconstantÝÂ


¨3R;Ý
int var

2.5 File descriptor I/O0'


×ÍPtÃÍݺŠ›@ëÍjE®`8ET݂rµÎfile descrip-
tor Í@ôµÎ®¼ÙNgŠÕÝfile descriptorÎper processÝ
• 0 standard input ;ðµÎ"8

uŒ`Äò·®
CHAPTER 2. $BOURNE SHELL
2.5. I/O0'
FILE DESCRIPTOR 25

• 1 standard output;ðµÎÇK buffer I/O


• 2 standard error ;ðµÎÇK
&Ɲ|àI/O0'
$ cat file1 > file2
$ dirs 2>&1 > /dev/null

ƕdirs`X®ßÝstandard erroróÕstandard outÕAü/dev/nullœ µ


Î#‚ô:Õ exec tðà3file descriptorÝnÐ9…
$ exec 3> $LOGFILE
$ exec 3>> $LOGFILE
$ exec 2>&-
$ exec < infile

Í&ŒL5½ ×Í3rfile descriptor8Ey$LOGFILE.standard


errn* .êGshellÝstandard inputŽWinfile
$ cat something >&3
$ read <3

¨3 9Í µ8Ey ÝX|cat somethingÝ/ºÕ


œ ¥Œ 0'ÐrÝè}
3 file descriptor LOGFILE
LOGFILE file descriptor 1,2,3

×°¥ŠÝI/O0':
¥±0'¬v.jnéè(&ËÎ?:-))
.”Œ0'¬vappendÕjn¡
>

¥±0'standard input
>>

.standard outó›file descriptor n


<

file descriptor nJ‹—›standard in


>&n
<&n

<<text .stanadard in0'àÕ\Õtext c


>&- close standard out

Š¥ŒÝÎb°¡«©#jnbÝ#file descriptorb #file descrip-


tor`bè} Š›ftpÝscripts3œ\œ\|G
.ÝftpìÎ
b(ÝXçì Ā©º3– wêÝDãX|&Ƶ§é\3
–`cron jobŠ›Q&Æftpbb
#!/bin/ksh
# A script to automate FTP transfer

HOST=ftp
USER=user

uŒ`Äò·®
2.6. ø×?Žf CHAPTER 2. $BOURNE SHELL
PASSWORD=password
FILENAME_PATTERN=remote_files
REMOTE_DIR=/usr/doc
LOCAL_DIR=/usr/local
# -i = non-interactive, -n = disable auto-login

ftp -i -n <<HERE
open $HOST
user $USER $PASSWORD
cd $REMOTE_DIR
lcd $LOCAL_DIR
mget $FILENAME_PATTERN
close
bye
HERE

¥Œ<<Ýà°ftpÝinputº×à\ÕHERE copen, user, cd, mget K


ÎftpÝúƒÄô|. 9°ftpúƒ¶W×ÍjnQ¡ftp < jnô
•
2.6 ø×?Žf
2.6.1 ?Žf
3Bourne shellÝ/Iúƒ…«b?ŽfÝ+°test›if whileà

test condition

[ condition ]

ÝautoconfŠƒprogrammerf´‡Kàtest àÀrconditionÝ
]°ÀrÝచ¥Œè} »A
jn?Žf
jnÎÍ×jnÎ̀©„jn[
jnD3[
test -f /etc/file

êD3[
[ -e file ]

jny0[
[ -d /etc/ ]

jn\[
[ -s file ]
[ -r file ]

C™?Žf
stringb‹—µ/true
stringb‹—(non-zero)/true
[ "$string" ]

string^‹—(zero)/true
[ -n "$string" ]

s1 ‡y s2`/true
[ -z "$string" ]
[ "$s1" = "$s2" ]

uŒ`Äò·®
CHAPTER 2. $BOURNE SHELL 2.6. ø×?Žf 27

[ "$s1" != "$s2" ] s1 ‡y s2`/true


óÂf Tb9Í-‰
8‡ num2 true
‡ num2 true
[ $num1 -eq $num2 ] num1

y num2 true
[ $num1 -ne $num2 ]

y‡ynum2 true
[ $num1 -lt $num2 ]
[ $num1 -ge $num2 ]

9¥f
[ ! -f "testfile" -o ! -r "testfile" ]


[ test condition -o test condition ]


! not


-a and
-o or

;ðf´ðàÝêbportableݵÎî«×°à° YÌî¼1àÀrconditionf
´?:œ9ß ÝautoconfÝ+°portableRŒ ¼àtestݶ°?ŽÝ
”Œ Qw3$?0îW ̀Âî´?
3shell scriptôb:Õbßà
if [ "x$VAR" = "xvalue" ]; then .....

¼®$VARÎÍÎèÝ?ŽLͯAŒ?ŽÎÍ èC™ ?ŽÎ£Í


Š†%‚9øµº®Ëg?Ž¼à9ø®f´Bz
¨²9«perlC™óÂ?Ž|ƒ€«perlâ?8D‚vperl^b9-
perl+°
if ($str1 eq $str2)
if ($num1 == $num2)

t¡bÍf´º×RŒshell perl cÝ-²¼(߀ÝBœ&Î9ø


B |perl ÃãeqÎCX|G¡Îstring==ÎÐrX|G¡Înumber
bourne shellÎMhâ?xÅeqŠÍ-Ðr==ŠK×Í=)

C+°
if (!strcmp(string1, string2))
if (num1 == num2)

2.6.2 if f ¾ \
if test;then cmd1; elif test; cmd2; else cmd3 fi

uŒ`Äò·®
2.6. ø×?Žf CHAPTER 2. $BOURNE SHELL
if test
then
cmd1
...
elif test
cmd2
...
else
cmd3
...
fi

!ø¥Œ¶Wו`Ý5r›HLÍ3¶Makefile`ºàÕ ¨²€Ýelse
ifÎelif «CÝelse if×ø‰

¨²bˍŽÝifà°
[ "$VERBOSE" ] && echo ’everything’ && îF/true`ƕ&&¡
«›®
|| îF/false`ƕ||¡
«›®
[ "$VERBOSE" ] || echo ’nothing’

9\bFŠ¥Œ
AŒÎèC™F/false 9Í@œ
[ "$var" ]

[ -n "$var" ]

;ðÀr…«Î9°¾\Ý]P¬Í@Ng€AŒ:Õbúƒ‚ðÝP
 ºœÆ•×gúƒ ¬ÎBœ€ÎC|3if while…«Æ•P
(expression)/return €X/¼ÝÎúƒÝstandard outX|
|Ž½!`ƕúƒ Q¡Š¾\ƕWÍ¼Xì×M§‚®
ÄbÝúƒWÝº3standard out Œ×ÀC™&Ɲ|¿à9øݕ
¼ ®¾\»A
[ "$(find . -name gyoza.txt)" ] && echo "I Find It !!!"

à$(cmd) ‡yà‘cmd‘AŒ0ÕݺŒ9Íjn¼X|ÔSr…«” ”b
 Àr
µ/trueCAŒ^bÔSr AŒ©b×ÍC™Jº WC™ÕG true
X|
uŒ`Äò·®
CHAPTER 2. $BOURNE SHELL 2.6. ø×?Žf 29

$ [ 1 ]
$ echo $?
0
$ [ 0 ]
$ echo $?
0

AŒbËÍ|îJshell.findóŒ¼ÝC™ê WúƒœÆ•€µs
ß ý0Ý
2.6.3 for loop
for var in $list; do cmd1; cmd2; done

for var in $somelist


do
cmd1
cmd2
done

¥Œ¶Wו`Ý5r›HLÍ3¶Makefile`ºàÕ listÎshell…ðàÝ
×Ë]°µ©Îœ9Ž›àè}Ttab5Ý£]µÎ »A
ME="I am a gyoza"

µÎ×Ílist(bashÝman pageàlistî×Àcommnands .wordî9…


Ý bÝhTïksh, shÝman pageê×ø X|&œ‡KœL9°
ME

(Þb`ÎÊ¡9°^bŒL RÕkey pointf´¥Š)for B–|×g.×


list

Í-ô;›G«Ývar
for ELEMENT in $ME
do
echo $ELEMENT
done

µºŒ¨
I
am
a
gyoza

¥ŒþÐr'Žó¸àŽóÝ-²
uŒ`Äò·®

2.7. PORTABLE SHELL REMOTE SHELL
CHAPTER 2. $BOURNE SHELL
2.6.4 while loop
while test ; do cmd1; cmd2; done

while test
do
cmd1
cmd2
done

!ø¥Œ¶Wו`Ý5r›HLÍ3¶Makefile`ºàÕ
2.6.5 case switch
case $var in *)cmd1; cmd2 ;; xx?)cmd3; cmd4 ;; esac

case $string in
*) cmd1; cmd2
;;
xx?)
cmd3
cmd4
;;
esac
case $answer in
[Yy])
echo ’yes’
;;
[Nn])
echo ’no’
;;
esac

Ýà° CÝÎJóÝcase switch‚Ν|bC™Ý‰ Í


Ð)ÝC™fàglobbingÝ]PôµÎwildcard *, ?, [ ] bÝhî
case switch

¶regular expressÎý0Ý¥Œàו¶ŒÝ]°
2.7 Portable Shell remote shell
remote shellƕÎËÝ.GÐÝstandard out =Պ Ýstandard out X|€
 ×telnetP
Í@AŒ ®•(@©3bashî£ôàÊ×°¬¿¬Ý Ä
AŒ®development`ŠÊÕportableݶ®TŒàtæÝshµ?
uŒ`Äò·®
CHAPTER 2. $BOURNE SHELL 2.8. ”+ 31

2.8 ”+
×ýãàshellÎBourne Shell¡¼;¨ŒKorn Shellœ9€×ÄÝ / 
f´‡Kàkorn shell¶scripts¨²bBSDÝC shell c shellôCW×ô±
LÍ3œ9system admin¡¼tcsh
œ9ýÝ©F Bourne Again
Shell.bÝ^Ý©FZZÚÚw3×R´GNU/Linux± ODׂÝ
/œ9‡KbashĊ¥ŒportableÝshell scripts¶® sh, ksh bashÎ
!×HÝ9¿Í+°f´# tcsh cshΨ×H -œ9×
1¼sys admin‡Kàc shellFÙÝprogrammeràshÝ´9

uŒ`Äò·®
2.8. ”+ CHAPTER 2. $BOURNE SHELL

uŒ`Äò·®
Chapter 3

Regular Express

3.1 +-REglob
regular expressÎ×Ëî]°à×°©„ÝC-¼î×°é\…Ý©„Œ
L¬v† ´0Ý×ËøPfE (pattern match) 3MS dos/windows
ôb8 ÝC-»A * ‚XbCX|¯àdel *.* µ|B *Xbjn*
µ§wildcardC-Ä93shellÝ §©Î§†globbing ¬Îregular
expressÍ@9 QÎUnix.œÝUNIXîÝregular express?ú‚
vÊàyœ9Unix 8›…« grep, sed, awk, vi, emacs perl...‡‡
|1regular expressµÎ¸àUNIXÝ·~ Ċ¼.unixš.DOS£
general‹—›Ý
CP…« §regular expressAŒÎPOSIXÝÙJà regcomp() regexec()
System VÝbregcmp(), regex()BSDÙbre_comp(), re_exec()

3shellÝpattern match§globbingshellÎ-ÿregular expressÝ ;ðà


y­5(Ý ? * [] ÝfEETàfnmatch()¼ § Ä9Ί—Ý¥
F©Î|¡
$àC¶P`|Õà#‚function call
;ðœ9¸àregular expressÝ`¡ºà×E//ôœ
/reg express/

¼î0Õ){reg expressfÝC™perl…«1Í@Î
m//
s///

îmatchsÎsubstitudeÄm|6¯¶µŽW//Ý ;ðà°
Îm//úƒ s///úƒúƒð:ÕÝb
m

• p -> print ;ðôà¶

33
3.2. C- § CHAPTER 3. REGULAR EXPRESS

• d -> delete9;ðΫ3múƒ¡ Ð)ݵB*


• c -> confirm ;ðà3súƒ ˜®ÎÎˊã‚
• g -> global ;;ð . matchÕ`/©bÏ×ÍÐ)Ýb[
• i -> ignore Ѷ
Äô× grepúƒµ^bàÔSrµ|Ý anyway,©Îœ9K
Î9øî
3.2 C- §
3.2.1 ÃÍC-î
C-µÎŽ××ÍzZCÒÝ §¼ÍÃÍÝC-
• . ‚Œ”×Í”C-tÝð•newlineC-Äawk|matchð•Bœ
• ? ‚”G«”C-Œ¨0gT1g
• + ‚”G«”C-Œ¨1g|î 1 2 3 4 ... Œ¨return false
• * ‚”G«”C-Œ¨0g|î 0 1 2 3 ...
9\.ïf´ðÙÝý0Î3shellìÝwildcard * ÝêY| ©Š›Í*
µ‚XbC-Í@Î ? + * KŠG«¤g . ¼¸à‚ŒC-
• ^ ‚•´
• $ ‚•
• \ ñ^C-(escape)㏩C-݈LàÝ
9\f´Š¥ŒÝÎC3•´RÝ^• Ý$3•Ýcase5ò!
Ýregular expressTbÝPº.9ëË W!Ýregular express 9º
×ø‰Äbݺ
• /^#/ b#3וÝÏ×C-` µ/TRUE
• /^bag/ bag3•´Ý•
• /bag$/ bag” ݕ
• /bag/ bag3 ݕ ÄbÝP §^b9‚} sed
• /b.g/ îbag beg bugK•
• /b\.g/ îb.g
• /^..g/ bag beg bug xxgKÐ) ¬×ŠëÍCÒ
• /^.*g/ b¢C-ÝQ¡bÍgÝK|/true

uŒ`Äò·®
CHAPTER 3. REGULAR EXPRESS 3.3. C™ § -  ! À r  î 35

• /beg*/ be, beg, begg, beggg, .......


• /beg+/ beg, begg, beggg, begggg, ......
• / */ èçC-ô•
3.2.2 C- § - ÀrPšî
• [ ] []/Ý×”Ž×C-”Ð)µ/TRUE
• [^ ] []ÝD[Œ â[]/Ý׎×C- /true X|9\^3[]/
b!݌L
• [1-10] -r3[]/|î×ðPšàÆÕWTi X|AŒŠ
î-rÄ6w3Ï×Tt¡C-
• w{n,m} =C-Œ¨î°
fà /.../?à «L T XÝtableÝజ îb”=”Ð) wC-
Œ¨”=” ngÕmgE
A

Kº/TRUE
• 0{3,} 0‹KŒ¨3g -> /xxxx000xxxxxx/

3C™ì{} ()ÎîËÝ9°C-Ý [ ]ºregular express W×Ë


ºÕX|ŠÝàñ^C- ŽW\{ \} \( \)
3.3 C™ § -  ! À r  î
×°C™Ý §î
• ( ) Group operator
• (str1|str2|str3) str1 Tï Tï
 Î Ý ©b×°8›AegrepbYîX
str2 str3

|3à8›Ý `Ä6ἀ §Ý æ


() | extend regular expression
regex regex
• & î0ÕÝC™
• \1 \2 \3 ... ‚s///G«àÀr\(\)ÀR¼ÝC™ 9;ðôÎ0
ÕÝC™Ä&©b×Í à \1 \2 \3 |bœ9Í
\1 Ï×ÍÀr/C™
\2 ÏÞÍÀr/C™
;ð\1 \2 \3Îà¼EmatchÕÝC™Š §`àÝ
Yes õ yes
8086 80286 Tï80386
/[Yy]es/

C-|b9øÝ=î°
/80[23]?86/
/[A-Za-z0-9]/

î0ŠŒ¨ëg|î
/compan(y|ies)/ company companies
/0\{3,\}/

uŒ`Äò·®
3.4. Pšë(ADDRESS) CHAPTER 3. REGULAR EXPRESS

ÞæÍݕîÀr
.ËÍC™EŸ ¥Œ\1 \2Ýà°
s/.*/(&)/ ( )

Í 9°ðà3‚ð(substitue)
s/\(str1\) \(str2\)/\2 \1/

¥ŒÀr3G«b!ŒLX|Ä6à\¼escape
& \1 \2 \3 ...

3.4 Pšë(address)
3sed, vi‡editor…&Ɲ|¼Š §Ý•Pš 9˼Š §Ýf•
TØðrangeô§address(ë) LÍÎðúƒœðà
range(addressing)s///

3ÏוÕÏë• „*J•
sed
$ sed ’1,3d’ file

.JSZaÝxxðWyy
vi
:%s/xx/yy/g
ðàÝPšÐr
• , •ó§× 1,5 îÏוÕÏ"•
• 0 tîו

• . êG•
• $ t¡×• 5,$ îÏ"•Õt¡×• .,$êG•Õt¡×•
• % JSZaô‡y1,$
• x-n x?îón• .,.+10 îêG•ÕêG•è•
• x+n x?ìón•

3.5 greedy Ýregular express


XÛgreedyÎ1AŒ×•…«Ð)regular expressionݵbœ9ôµÎ !
`bœ9patternKÐ)`;ðºœ1TÝÐ)tÝ£ÍpatternÄ ¬
Î&ƊÝLÍ3HTMLÝtag §î»Aà/t.*t/œ0 <tt>this is a tag</tt>3
!ו… b<tt>ôb<txxxxxxxxxxt>greedyÝ §©bperlbf´ŽÝ]
°9Þ3perl…«—Õ

uŒ`Äò·®
Chapter 4

sed

4.1 +
Î×ËStream EDitorôµÎ;›¸×™£]ø«úƒW_ìݛ®
9œÊ)Š›;Ýscripts®¼
sed

file -> stream -> sed -> stream -> file

ãy¸Ä6bÍin §¡bÍoutX|!`;Íjn Ä6 §


jn¡XŒW±j(.jl*.±j;(Wj ê. €/íŒ
Îstandard outX|ð:ÕÝ]°Î
$ sed ’sed_syntax’ old_file > new_file
$ mv new_file old_file

Äsed;ðÎà¼EC™Ý §•îÎ ×editor¼modifyjnÝ ‚


vBœÎוו §ÝX|èç, tab, ð•9°C-œ¥Š
sedÝ×PÎ

sed [address],[address][!]command[args] file

Íaddress,commandàŽSr’xxx ’‘œ addressµÎî«regular expressÝ


‹—ðàÝúƒbd(delete), s///(‚ð) ×°Ž»
.jnyesðWno
.^bsaveC¿Ý•„*
$ sed ’s/yes/no/g’ file

.#¡«Ýۊ„*
$ sed ’/save/!d’ file
$ sed -e ’s/\(.*\)\(#.*\)/\1/’ xxx.sh

Í-eÎðàÝ×Íoption;ðÎà3ËÍ|îÝó4` Íãy( )b
©½ŒLX|mŠDEaescape×ì
37
4.2. Ð)fÝADDRESSING CHAPTER 4. SED

4.2 Ð)fÝaddressing
addressÎsed…Ý©„à+à¼'Ð)fݕ|-E¸Æ•_ìú
ƒ Ð)fÝf¼]°b1. range(Pš) 2.regular express
sedÝaddresstÝGregular expression+ÛÝ 1,3 . $ %9Ëî°² 
|à#à /regex/0Պݕ
0ÕÏޕ„*
0Õdelete9ÍC„*J•
$ sed ’2d’ file

bREC¿Ý•Õjn ;;„*
$ sed ’/delete/d’ file

„*èç•
$ sed ’/RE/,$d’ file

$ sed ’/START/,/END/!s/xx/yy/g’ file > file1 .xxðWyy


$ sed ’/^$/d’ file

4.3 pattern/hold space, 9regexfscriptj


AŒbËÍf||-e
$ sed -e xxxx -e xxxx file

»AÞۊ•ŽWèç•Q¡B*Xbèç•
$ sed -e ’s/\(.*\)\(#.*\)/\1/’ -e /^$/d file xxx.sh

sedÍ@NgK.וwÕpattern spaceQ¡E€E® ƕ”Œw


Õpattern space9Í2]AŒb -e µ#½Epattern spaceݕ†scriptÝ
ƕX|?¿ÍfÎb5Ý †ו¡¼×ÅX|t;àÝ×
PTŒÎ
[address],[address]{
command[args]
command[args]
...
}


[address],[address]{command[args];command[args];...;command[args];}

Nוcommand8 ybÍ-eÝ®àº.”ŒwÕ×Ípattern space |


¶W×Ísed script fileQ¡à-f ƕ
$ sed -f script_file file

TïNÍcommandÝt¡«ŠwÍ5r; ¨²sedbÍhold spaceÎÍõD


‹—Ýbuffersedb°úƒ|¿à hold spacepattern spaceœ vi…«
Ýyy dd wÕ×Í:ŒÝ bufferàpúƒ.¸§Œ¼
uŒ`Äò·®
CHAPTER 4. SED 4.4. SED COMMAND úƒ 39

4.4 sed command úƒ


command b25Íf´ðàÝ
4.4.1 Ãͼƒ
µÎ.9¿Í_ìúƒ.?¦
• Append a\ 0Õaddress¡appendXba\ ¡«XbC™
• Change c\ ;Ž×ðZC
• Delete d B*regex0ÕÝC™£×•BœÎJ•B*‰
• Insert i\ 0Õaddress¡3G«insertC™
• Substitution s/// ‚ðÎtðàÝ
• Translate y/// |×ÍC-×ÍC-®!݂ð
a\ úƒi\úƒ¥Œa\ i\ KŠð•ŠáÝZCAŒŠ
ÝZC bð•Šà\ 9ÍÐrîð•AŒŠáÝZCb\ |
à\\¼escape*\Ä9\bœÝ®Þ ôµÎAŒZC…«!`b\ ’§
‚ð ãyshellݎSr ’ ^ð°^*9Í©ÿ¨¶scriptjŠXš:
»
Ïו
cyril@gyoza:~$ cat last

t¡×•
ZŽŽ:
cyril@gyoza:~$ sed ’a\
>

Ïו
> ’ last

ZŽŽ:
t¡×•
ZŽŽ:
ZŽŽ: ¬vƌð°øÄו::†¢ §` øÄו`
cyril@gyoza:~$ sed ’$a\

º§‚ø §9øÝ®Þ
>
> sed
> ’ last
sed: -e expression #1, char 93: Unterminated ‘s’ command

ZŽŽ: ¬vƌð°øÄו::†¢ §` øÄו`\


cyril@gyoza:~$ sed ’$a\

º§‚ø §9øÝ®Þ
>
> sed

Ïו
> ’ last

uŒ`Äò·®
4.4. SED COMMAND úƒ CHAPTER 4. SED

t¡×•
ZŽŽ: ¬vƌð°øÄו::†¢ §` øÄו`
sedº§‚ø §9øÝ®Þ

¬“½˜»P­×ð
cyril@gyoza:~$ cat address.txt

r
270
<Michele’s Address>

¬“½–n­
<Cyril’s Address>

×ð10r
<Nick’s Address>

cyril@gyoza:~$ cat insert.sed


/<Cyril’s Address>/i\
100 Gyoza Blvd\
San Jose, CA

¬“½˜»P­×ð
cyril@gyoza:~$ sed -f inser.sed address.txt

r
270
<Michele’s Address>
100 Gyoza Blvd
San Jose, CA

¬“½–n­
<Cyril’s Address>

×ð10r
<Nick’s Address>

9Íúƒ«a\ i\ œ ©b×FŠ¥Œ µÎAŒŠ;ŽÝZC


¬œ9•J adressÎÍrange 1,109ø`XbÝrange•Kº´¬v©
c\ change

bו;ŽÝ
Ïו
cyril@gyoza:~$ cat last

Ïޕ
first line

t¡×•
second line
last line

cyril@gyoza:~$ cat change.sed

Ïו«ÏޕK„*Ý
1,2c\

Ïו«ÏޕK„*Ý
cyril@gyoza:~$ sed -f change.sed last

t¡×• last line


uŒ`Äò·®
CHAPTER 4. SED 4.4. SED COMMAND úƒ 41

¶Ž¶
.ÏוÕÏè•Ý¶Ž¶
$ sed ’1,10y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/’ lower.txt

‚ðÝúƒbœ¥ŠÝÏÞ· §AŒ3ו/ÝC™Ù)Š‚ðÝbœ
9 Í£‚/ºàÏ×ÍÙ)Ýð*AŒð*©ݵ3¡«îŠ
Ý Ï¿ÍIð*àg9Íflag
Ïו
cyril@gyoza:~$ cat last

Ïޕ
first line

t¡×•
second line
last line

Ïו
cyril@gyoza:~$ sed ’s/first/line/1’ last

Ïޕ
line line

t¡×•
second line
last line

Ïו
cyril@gyoza:~$ sed ’s/first/line/2’ last

Ïޕ
first line

t¡×•
second line
last line

Ïו
cyril@gyoza:~$ cat lines

Ïޕ
first line

œ9•
second line

t¡×•
multiple line line
last line

Ïו
cyril@gyoza:~$ sed ’s/line/row/2’ lines

Ïޕ
first line

œ9•
second line

t¡×•
multiple line row
last line

Ïו
cyril@gyoza:~$ sed ’s/line/row/g’ lines

Ïޕ
first row

œ9•
second row

t¡×•
multiple row row
last row

4.4.2 pattern/hold space Ý §


݋—Î#‚
• l list pattern space

• h .hold space…Ý‹—z*.pattern space݋—copy›hold space

uŒ`Äò·®
4.4. SED COMMAND úƒ CHAPTER 4. SED

• H .pattern space݋—3hold space‹—¡«


• g .pattern space…Ý‹—z*.hold space‹—J/›pattern space
• G .hold space݋—3pattern space‹—¡«
• p Œpattern space݋—
• x øð(exchange)pattern spacehold space

l«pÝ-½3E&ASCIIÝ §

Ïו
cyril@gyoza:~$ cat last

Ïޕ
first line

t¡×•
second line
last line

Ïו
cyril@gyoza:~$ sed ’1,2p’ last

Ïו
first line

Ïޕ
first line

Ïޕ
second line

t¡×•
second line
last line

cyril@gyoza:~$ sed ’1,2l’ last

Ïו
\262\304\244@\246\346 first line$
first line

Ïޕ
\262\304\244G\246\346 second line$

t¡×•
second line
last line
9\|Epattern spaceb?Ý݊Ïו
Õpattern space :Õp.Ï×
•Œ#½pattern spaceŽWoutputX|sedê. €×Å#½Ïޕ

¼Ý3pattern space…:Õp.ÏޕŒ !§êbËÍÏޕ


ŒÏë•ãyp^®àà#Îpattern space XÕoutput:×Í»('
Œ¼Ý)
cyril@gyoza:~$ cat command.txt
This describes the Linux ls command.
This describes the Linux cp command.

cyril@gyoza:~$ cat command.sed


/Linux/{
h
s/.* Linux \(.*\) .*/\1:/
p
x
}

uŒ`Äò·®
CHAPTER 4. SED 4.4. SED COMMAND úƒ 43

cyril@gyoza:~$ sed -f command.sed command.txt


ls:
This describes the Linux ls command.
cp:
This describes the Linux cp command.

Tï¶Wו
cyril@gyoza:~$ sed ’/Linux/{h;s/.* Linux \(.*\) .*/\1:/;p;x;}’ command.txt

9\:Ï×Íh.Ïו.
hold spaceÄBœpattern space1b æÍÏ
וݭQ¡‚ð*ŽWls:¨3pattern space©bls: Q¡pŒls:t
¡.hold space«ls:øðX|t¡pattern space/ µÎæÍ݋—sed
WoutputXŒcpÎ!øݼ§
X|^%‚©ÎËÍ¿:ÕÝspace3£\ð¼ðœ./39Ë
Í 2]33copy/pasteµ?ÝAŒ!viÝßTŒœ|›º
4.4.3 
×M
9• §]º
3æÍÝh, H, g, G, x…«K©bEŽ×• §AŒpattern matchŠ¬•
`µRDŒ„ì«Ýúƒà¼ §Ë•|îÝpattern matchCpattern
space, hold spaceÝ §

• n .pattern space‹—XŒ\áìוX|ìוŽWpattern space


݋—
• N \áìו«êGpattern spaceÝ ‹—=R¼Ž×•¬Î…«b
Íembeddedð•Ðr|à \n¼îBœ©b9`|à\n¼
î
• D „*ÕÏ×embedded newlineI N)à‰ AŒD3t9ìÆ
•ÝJpattern space‹—1ºì¼ ]ºÕscriptcм×g
• P printÕbembedded newlineÝו1ºXbpattern space‹— A
ŒP3t9ìƕÝJpattern space‹—1ºì¼ ]ºÕscriptc
м×g
Join˕

/join/ {
N
s/\n/ /g
}

.9•è畄*Wוèç
uŒ`Äò·®
4.4. SED COMMAND úƒ CHAPTER 4. SED

/^$/ {
N
/^\n$/D
}

š:0Õè畡.ìו
¼AŒ©bוèçèç• ì×
•¿Wו1º3pattern spaceÄ9`ìÍúƒ /^\n$/D^®àpattern
spaceIXŒ AŒb˕èçX|Delete*Ïוèçyìוèç
1ºì¼ 9`. Dú¨b®àÝX|¬XŒpattern space݋— µ
/^$/×àºbוè畺ì¼9\DPKb]ºÝ®à |J¼
®¥Ý §
flow control branch
9Î༻ÉúƒÆ•Ýµ Îc…Ýif else, while9°×úƒ 9Š¤g:×R
àã:'×ÍlabelQ¡àb label®Õ9Í2]ƕ
• : label, 'label
• b label branch ðÕlabel2]ƕAŒ^blabelµ;;ƕ à#®
Õscript O
• t label AŒ×͂ðWtest ?ŽfWñ¡®Õlabel X|Ä6
s///úƒ×Ràsúƒ×3túƒG
91A:»
$ cat join.txt
join

3 +ŽDEa‚C™Ý; \
second line

9ו«îוÎ=3×sÝ
C

$ sed ’{
:a
N
s/\\\n//
t a}’ join.txt
join

3 +ŽDEa‚C™Ý; 9ו«îוÎ=3×sÝ
second line
C

9j §
• r \jn ÞjnappendÕêGpattern space
• w ¶jn Þpattern space݋—¶ŒÕ×Íjn

uŒ`Äò·®
CHAPTER 4. SED úƒ
4.4. SED COMMAND 45

$ cat insert.sed
/<Cyril’s Address>/i\
100 Gyoza Blvd\
San Jose, CA

Ïו
$ cat lines

Ïޕ
first line

œ9•
second line

t¡×•
multiple line line
last line

Ïו
$ sed ’/first/r insert.sed’ lines
first line
/<Cyril’s Address>/i\
100 Gyoza Blvd\

Ïޕ
San Jose, CA

œ9•
second line

t¡×•
multiple line line
last lin

Ïו
$ sed ’/first/w firstline.txt’ lines

Ïޕ
first line

œ9•
second line

t¡×•
multiple line line
last line

Ïו
$ cat firstline.txt
first line

̀
• = Œ•r
• q Òsed

Ïו
$ cat lines

Ïޕ
first line

œ9•
second line

t¡×•
multiple line line
last line

$ sed -e ’/first/=’ -e ’/second/q’ lines

Ïו
1

Ïޕ
first line
second line

uŒ`Äò·®
4.4. SED COMMAND úƒ CHAPTER 4. SED

bœ9Ý»š:http://www.student.northpark.edu/pemente/sed/sedfaq.html

uŒ`Äò·®
Chapter 5

awk

5.1 +
ÝÌFÎawkfsed?àÝ2]8Eysed×•×•Ý §awkèºÝ ×
•/Iû›tŠÝ §b?powerfulÝ CP+°]º× § ;P
field

|Î
awk ’script’ var=value files
awk -f scriptfile var=value files

ÍvarΊÝawkŽóvalueΛÝÂ9|༫shellŽóÚ;
¨² sedÝregular expressKJו•¼®/Ýíá†fE9øœ^
b ÄPawk.&àawkÝ×͎ó¼®regular expressÝíáfE.h û
›ô |DêÝJ¼fExŠÎàfEÕÐ ¼«×Íregular expressfE
var ~ /re/
var !~ /re/

9øµœ]-Ý‚v9fEô!øºF/true, false| W×Ícondition


tÝû› §|²awkb?9?àÝfunction|ñ§¨²ôbÝif,while,
forŠfunctionÝæ9°fsed«shell)¿ÝæêîÝ&9ôÎÞ
¼ perlÝÃ͐ÝÁ
5.2 script Á
×Íscriptã condition{procedure},condition{procedure},.....àW «sedœ
0Õ%‚f(patternI )†%‚›®(procedureI ) b×°/IÝ
Žó|Q&Æ'×°fcondition|Îpattern regular expressTØ
ÍÐ)f9͚:ìºÕÐrfEÕÐ ÍbËÍ¥Š Ý/
47
5.3. Žóû› § CHAPTER 5. AWK

condition, BEGIN«END×Íscript;ðÎ9ø
BEGIN {xxx} /re/{xxx} END{xxx}

׶P׊binit;װµ ßbŒßO`^âC×ø
P”@ôŠb §Ÿ¡Ýroutine¼ §awk® ×ÍPlVÝscript+
Ž èºÝ×ÍgeneralÝ”@Ý §
ÕÕb¿Íèç•
$ awk ’BEGIN{x=0} /^$/{x++} END{print x}’ scripts.tex

×'x=0¡BEGIN¡Ýµ3ƕQ¡N\ו
¼AŒÎèç
•µ x++t¡\Õj Œx
ŠBœ3î«Ý»…awkݎó«cÎ×øÝôµÎ^bþÐrÝ9
\«shell perl‡scriptf´×ø
5.3 Ž ó û › §
…«œ¥ŠÝËÍL
awk

• record µÎווݣ]

• field ;ðãspaceTïtab"âÝ£]ûµÎfield

š:»¬¥Œshell command lineݎSrÔSr


$ cat /etc/mnttab
/proc /proc proc dev=31c0000 1022606134
fd /dev/fd fd rw,suid,dev=32c0000 1022606198
mnttab /etc/mnttab mntfs dev=3380000 1022606209
swap /var/run tmpfs dev=1 1022606209
swap /tmp tmpfs dev=2 1022606211

$ awk ’/swap/{print $2}’ /etc/mnttab


/var/run
/tmp

$ awk ’{print "Hello World"}’ /etc/mnttab


Hello World
Hello World
Hello World
Hello World
Hello World

×Þû› ÎtabÞëû› Îèç


uŒ`Äò·®
CHAPTER 5. AWK 5.3. Ž ó û › § 49

$ cat datafile
99 98 3.5
300 298 4.9
498 493 5.9
699 698 7.6
900 748 9.0
1200 703 9.6
1500 651 10.4
1698 627 10.8

Bœ 9øÎ inputËÍû›íŒ output ×Íû›


$ awk ’{print $1 $2}’ datafile
9998
300298
498493
699698
900748
1200703
1500651
1698627

9øÎinputËÍû›íŒoutputËÍû›
àprintíŒû›ã<r , 5
$ awk ’{print $1,$2}’ datafile
99 98
300 298
498 493
699 698
900 748
1200 703
1500 651
1698 627

9øÎinputËÍû›íŒoutput×Íû›
$ awk ’{print $1 "," $2}’ datafile
99,98
300,298
498,493
699,698
900,748
1200,703
1500,651
1698,627

ôµÎ1print $1$2 ‡yprint $1 $2


uŒ`Äò·®
5.3. Žóû› § CHAPTER 5. AWK

5.3.1 /Žó
tÝ C+°ÝŠŽóx,y,z....awkb×°/ݎó( û›îÝ/
Žó
ARGC : number of arguments on command line
ARGV : array containing the command line arguments

J•record
ARGIND :

ÏnÍû›(field)
$0 :
$1....$n :

×Íassociate arrayâbIݕ(Žó
t¡systemŒýÝerror numberš:/usr/include/errno.h
ENVIRON :
ERRNO :

FILENAME : current filename


FIELDWIDTHS : list of field widths

/ÎèçT
/Îèç
FS : field separator tab

/Î
OFS : output field seperator

/Î
RS : record separator newline
ORS : output record seperator newline
NF : number of field
NR : number of record

ÍFS, OFS, RS, ORS, NF, NRÎðàÕݚ:»


$ cat /etc/passwd
list:x:38:38:SmartList:/var/list:/bin/sh
irc:x:39:39:ircd:/var:/bin/sh
nobody:x:65534:65534:nobody:/home:/bin/sh
cyril:x:1000:1000:Cyril Huang,,,:/home/cyril:/bin/bash

$ awk ’{FS=":"; print $7}’ /etc/passwd


/bin/sh
/bin/sh
/bin/sh
/bin/bash

$ awk ’{FS=":"; OFS=","; print $1,$6,$7}’ /etc/passwd


list,/var/list,/bin/sh
irc,/var,/bin/sh
nobody,/home,/bin/sh
cyril,/home/cyril,/bin/bash

uŒ`Äò·®
CHAPTER 5. AWK 5.3. Ž ó û › § 51

|J¼®conditionà
ô|J¼®conditionà¤gŽóregular express matchÕ
NF NR

Ð~
$1 $2....

$ cat datafile
# This is the data file from experiment
99 98 3.5
300 298 4.9
498 493 5.9
# Failed data
122 123
699 698 7.6
900 748 9.0
1200 703 9.6
1500 651 10.4
1698 627 10.8

$ awk ’NF == 3 && $1 ~ /[0-9]+/{print $3,$1,$2}’ datafile


3.5 99 98
4.9 300 298
5.9 498 493
7.6 699 698
9.0 900 748
9.6 1200 703
10.4 1500 651
10.8 1698 627

5.3.2 awk ŽóshellŽó


awk  sedKÎQÃshell programmingÝ? Ì.hŠ«shellŽóÚ; ;
PÝ var=valuevarµÎawkŽóvalueµÎshellŽóÝÂ
# fs_mounted $dev $mnt_pt $fs_type
# This is shell script version of fs_mounted, check if the file system is
# mounted.
fs_mounted()
{
_BINGO=
[ $# -eq 3 ] || return $ERRNO_EINVAL
_BINGO="‘$AWK ’{if (\$1 == _DEVICE && \$2 == _MNT_PT && \$3 == _FS_TYPE) print \$1}’ _DEV
[ "$_BINGO" ] || return -1
return 0;
}

uŒ`Äò·®
5.3. Žóû› § CHAPTER 5. AWK

shell scriptÝƕshell commandÝawkEy×°1ºC- §«sed×ø Š


TF 9Í»…«¥Œ$1 $2 $33AWK ’ ’ŽSr…«ÝÎawkÝ$1$2$3
3 ²« DEVICE=$1...ÎshellÝ $1 $2 $3 DEVICE MNT PT ‡ÎawkÝ Ž
óX|awkÝ$1 $2 $3b\9Íescape3G«ôµÎ1shell  §¸Æ¬.
9°X›awk §
5.3.3 pArraysplitÐó
XbawkÝarrayKÎassociate array,ôµÎhashôµÎñb(CidÝp
9Í(CidµÎhashÝkey×&Æà1, 2 ,3 ...¼ ®pÝidÛý3
awk…«.&&Æà(̼ id index¼¨´pÄawkœÏ€AŒ:Õ
Îó ClÝindexô| 3C…«àÝ×ø
¥Œ!parray[1]Îarray[0]«c×ø &Ɲ|¼
x[1], x[2]...Ýpï1,2,3 ...45 ¬associate arrayÝ4Î&
Ɲ|×Ý¥Œassociate arrayÝ¥ýŠà SrÀR¼š:for loopÝà
°
|àsplit(string, array, [sep])¼ÿÕ×Ípsep^b›µàFSÝ †
9ÍstringÝû›5â×Íû›µÎ×Íp-ô
$ cat split.awk
#! /bin/awk
BEGIN{FS=":"}
/cyril/{
print $0
split($0, afield)
for (i = 0; i < NF; ++i) {
print i","afield[i]
}

delete afield[2]

for (i = 0; i <= NF; ++i) {


print i","afield[i]
}
}

$ awk -f split.awk /etc/passwd


lcyril:x:100:1::/export/lcyril:/usr/bin/bash
0,
1,lcyril
2,x
3,100
4,1
5,

uŒ`Äò·®
CHAPTER 5. AWK 5.4. ÃÍ×+° 53

6,/export/lcyril
7,/usr/bin/bash
0,
1,lcyril
2,
3,100
4,1
5,
6,/export/lcyril
7,/usr/bin/bash

5.4 ÃÍ×+°
tÝû›ÝŽó©à°²awkfsedúÝ3y?#P+ŽÝ×]
° awkÝ+°œ c1@3awkˍŽÝbcÝÁœ|µºÝ Q
ô|. awk.c
5.4.1 ó.ìÕÐ
C Ý×ó.
+ - * / % ++ -- ^ **( 9Îfortranݼó)
C Ý×¼
= += -= *= /= %= ^= **=

C Ýאì
Ý AŒcondWñ/result1Q/result2)
! == < > <= >= != && ||
?: (c cond ? result1 : result2

ݐìÕЅ«bÍf´©½ÝµÎpattern matchÕÐ ~, !~  Þ
¼ œbàÝv«ÕÐ~=xŠÎregular express;ðmatchÝΠו•®
condition

/ÝfEAŒŠEØÍ©Žó†re match`µŠàÕ9ÍÕ Ð
perl

AŒxÎÍZ°óC
if (x ~ /^[0-9]+/) {
x += y
}

uŒ`Äò·®
5.4. ÃÍ×+° CHAPTER 5. AWK

5.4.2 if
^%‚ÝRµÎc‚
if (condition) {
} else if (condition) {
} else {
}

¥Œelse if«c+°×ø
5.4.3 for loop
9\ÝforbËÍÎcbourne shellÝá)perlôÎ×øÄperlàÝ c
shellÝ+°

for (i = 0; i < 10; i++) {


}
for x in xarray {
}

š:»
$ cat gyoza.awk
#! /bin/awk heehee
BEGIN {
x[1]="I"
x[2]="am"
x[3]="a"
x[4]="gyoza"
y["I"]="I"
y["am"]="am"
y["a"]="a"
y["gyoza"]="gyoza"
for (i = 1; i < 5; i++) {
print x[i]
}
for item in x {
print item, x[item]
}
for item in y {
print item, y[item]
}
}

uŒ`Äò·®
CHAPTER 5. AWK 5.5. FUNCTION 55

¡«Ý gyoza.awk ^bঠ&©Îþ9ÍBEGIN‚


$ awk -f gyoza.awk gyoza.awk
I
am
a
gyoza
2 am
3 a
4 gyoza
1 I
gyoza gyoza
am am
I I
a a

5.4.4 while
^%‚ÝRµÎc‚
while (condition) {
statment
}

do {
statment
} while (condition)

for loopwhile loopK«c×ø|àbreakÒcontinue†9loopðÕì


Í loop
5.5 function
«cH×øÝ9Î×Ëscriptà#‚typeŠ…×ô^b%‚ pass by
value, pass by addressŽóÎglobalÝ

# ;P
function fun(arg1, arg2) {
arg1 = arg2
xxxx
}

4Ý»
$ cat sort.awk

uŒ`Äò·®
5.6. ̀Ðó CHAPTER 5. AWK

# sorting function
function sort(Array, elements, temp, i,j)
for (i = 2; i<= elements; ++i) {
for(j = i; array[j - 1] > array[j]; --j) {
temp = array[j]
array[j] = array[j - 1]
array[j - 1] = temp
}
}
return

וו¼
}
# main routine,
{
for (i = 2; i <= NF; ++i) {
grades[i - 1] = $i
}
sort(grades, NF-1)
printf("%s: ", $1)
for (j = 1; j <= NF - 1; ++j) {
printf("%d ", grades[j])
}
printf("\n")
}

——
$ cat grade.txt

YY
100 60 75 23
100 98 99 89

——
$ awk -f sort.awk grade.txt

YY
: 23 60 75 100
: 89 98 99 100

5.6 ̀Ðó
5.6.1 C™ §-match‚ð
C™î § sedbs///9˂ðÿàî×°/˜Ðó
• F/Ð)regexÝ3stringݛH
match(string, regex)
• F/C™: F/3ÏmÍC-?¡ónÍC-ÝC™n^›µÕ9
substr(string, m, [,n])
‚ð: ‚ðÝ¿ÍÐóbÝF/œ©½
uŒ`Äò·®
CHAPTER 5. AWK 5.6. ̀Ðó 57

• . string2 …«Ð) regexÝÏ×ÍC™ðWstring1WF/1


sub(regex, string1, string2)
• .string2…«Ð)regexÝC™globallyÝI‚ðWstring1 ‡ysedÝs///g
F/Jóî‚ðóê
gsub(regex, string1, string2)
• F/×ÍC™ string2…«Ð)regexÝÏnÍC™ðWstring1 ‡ysedÝs///nth match
¬Îstring2^b;Ž
gensub(regex, string1, nth match, string2)
string2 ^›;;Î$0nth match|àgTGîglobally(I)š:»
$ cat match.awk
#! /bin/awk
BEGIN{FS=":"}
/cyril/{
print $0
print match($0, /cyril/)
print substr($0, match($0, /cyril/), length("cyril"))
print gensub(/cyril/, "mark", 2)
print $0
sub(/^.*cyril/, "mark")
print $0
}

$ awk -f match.awk /etc/passwd


lcyril:x:100:1::/export/lcyril:/usr/bin/bash
2
cyril
lcyril:x:100:1::/export/lmark:/usr/bin/bash
lcyril:x:100:1::/export/lcyril:/usr/bin/bash
mark:/usr/bin/bash

9Í»àÝlength()9ÍÐóregexàSrbstringÝ2]Šà double
quoteÀR¼àgensubº;Žstring2Ý ‚vš:ÏëÍprint $09\
ÎbgreedyÝ[T3X|©yì¡«×^
5.6.2 íáíŒ §print(f )
íŒî¼1print̍ŽÝà°Äb??Ýformat팵 c…Ýprintf
Tïfortran×ø
printf()

à°«cÐó×ø
{printf("The sum on line %s is %d.\n", NR, $1+$2)}

uŒ`Äò·®
5.6. ̀Ðó CHAPTER 5. AWK

î×ÍC™
î×ÍJó
%s

î×ÍnÍJómÍóݘFó
%d
%n.mf

5.6.3 Bórand()
®ß+y0 Õ 1 ÝBó
BEGIN {
srand(systime())
random_num = rand()
print random_num
}

F/1970, 1, 1Õ¨3ÝJó srand()®ß×ÍÌaÝBóp|º


¸à
systime()
rand()

5.6.4 Ùsystem()
9͜ UnixÝsystem()9ÍÐó
BEGIN {if (system("ls -l")) != 0) {
print "command failed"
}
}

Í€Ý ó.Ð󇇵|+ÛÝ

uŒ`Äò·®
Chapter 6

perl

8Eysed, awk, shell script‡ Ì Larry WallÆÿŠs€×˝|ã


‚ ×°ÓÚÓâscript½;àlÝscript ÌfRXbÝscriptŠpower
§Rregular expressô?]-ŠXÝ×°AgreedyÝ®Þperlt¡« sys-
tem callÝ=”jn,processsocket program‡Ý §¯€ŽWœúÝ
script+Ž

perl«Í€Ñshell, TCL/expect...‡script+ŽÍ@ÎàC¶Œ¼Ý N
×ËscriptÍ@KÎ×ÍƕP©Ä9ÍƕPUÿ×°/+°
ºœŠÕ9°!JQ¡»ð9°scriptŽó×]º‡‡ŽWŠ ÝcŽó«
]º  Q¦!Í@t¡ÎKÎassemblyݎó«]º¼Æ•µ«shell,
awk× ø

6.1 ÃÍ+°£]lV
6.1.1 Žó
Ñ'ãÂKŠÍþÐr
59
6.2. ?POWERÝREGULAR EXPRESSION CHAPTER 6. PERL

6.1.2 f×
6.2 ?powerÝregular expression
6.3 ðàÐó
6.4 Ù §
6.4.1 process
6.4.2 jn
6.4.3 system call

6.5 module

uŒ`Äò·®
Chapter 7

Bourne shell, perl  C+ ° f


´
9ÍÍ@Î&OSÝb`BœàÝC, shell perlÎ&ðàÕÝ Ì
¨3E93Ë Ì+°†Íf´
7.1 Žó
LŽó
shell
var=

perl
$var =

C
int var =
char var =

Makefile
var =
var :=

¸àŽó
shell
$var
${var}

awk
var

61
7.2. pHASH  +°f´
CHAPTER 7. BOURNE SHELL, PERL C

perl
$var

C
var

Makefile
${var} or $(var)
Š¥ŒÝÎ
• shellÝL$ ¬Šá¼ŽóÂ`׊$ perlµf´×l ÑA¢
µÎ$Ðr CµÎK
• shell݇rG¡bèç
var= var = Î×øÝ perlCµ^b§×MakefileÎL¸à
«shell ×ø¬Î‡rG¡|bèçX|b°Ëš4B×ì
7.2 pHash
shell
array="e1 e2 e3"
perl
@array = {e1, e2 ,e2};
%hash = {key1 => val1,
key2 => val2,
key3 => val3};
C
int array[] = {1, 2, 3};
shell ݙl£]§list…«-ôàspace5tðàݝ)
for var in $array
do
cmd1
done
array Ý-ôµÎàspace5Ý£] perlb͜ Ýforeach
foreach $var (@array) {
xxx
}
Í@9ÎC shellݶ° C^b 9ø×Í×͊›;arrayÝ-ô›ŽóÝ^
×
uŒ`Äò·®
 +°f´
CHAPTER 7. BOURNE SHELL, PERL C 7.3. fB– 63

7.3 fB–
shell
if test; then
dosomething
elif test; then
doother
else
allright
fi
perl
if (c) {
do_something;

} elsif () {
do_other;
} else {
allright;
}
C
if (c) {
do_something;
} else if () {
do_other;
} else {
allright;
}
9\Š¥ŒÝÎshellmŠÀrelse ifݶ°ëÍ×øfP¶°
shell^b׊à()‘œfP©ŠtestÎØ͝ƕÝB–µ?

7.3.1 ff´
shell

óÂ
[ "str1" = "str2" ]

[ num1 -ne num2 ]


perl

óÂ
if ($str1 ne $str2)

if ($num1 == $num2)

uŒ`Äò·®
7.4. ]º×  +°f´
CHAPTER 7. BOURNE SHELL, PERL C

C

óÂ
if (strcmp(str1, str2))

if (num1 == num2)
Š¥ŒóÂf´C™f´C™ §ìf´ ã9\&Ɲ|:ŒÍ
@perlÎ&ðbÄPúÝ
7.4 ]º  ×
7.4.1 while ]º
shell
while test
do
cmd
done
perl «cÎ×øÝtݎóà°×ø
while (condition) {
statment1;
}

unless (condition) {
statment1;
}
C
while (condition) {
statment1;
}

do {
statment1;
} while (condition)

7.4.2 for loop


Ý Î C…Ýfor loop
Bourne shell for
for var in "element1 element2 element3..."
do
echo $var
done

uŒ`Äò·®
CHAPTER 7. BOURNE SHELL, PERL C  +°f´ 7.5. —P 65

perl bËËforÝà°
for ($i = 0; $i < 10; $i++) {
statement
}
foreach $var (@array) {
statement;
}

C Ýà°
for (i = 0, init = 1; i < 10; i++) {
statement;
}

7.5 —P
shell

func1()
{
arg1=$1
arg2=$2
}

awk

function func1(arg1, arg2)


{
xxx
}

perl

sub func1(arg1, arg2)


{
xxx
}

int func1(int arg1, char *arg2)


{
xxx
}

uŒ`Äò·®
7.6. ۊ  +°f´
CHAPTER 7. BOURNE SHELL, PERL C

7.6 ۊ
shell
# comment
perl
# comment
C
/* comment */

uŒ`Äò·®
Bibliography

[1] Linux In a Nutshell, Ellen Siever, O’Reilly & Associates, ISBN 0596000251
[2] Sek & Awk, Dale Dougherty, et al, O’Reilly & Associates, ISBN 1565922255

[3] Perl Cookbook, Tom Christiansen, Nathan Torkington O’Reilly & Asso-
ciate, ISBN 1565922433
[4] The C Programming Language, Brian W. Kernighan, Dennis M. Ritchie,
Prentice Hall, ISBN 0131103628

67

You might also like