è¿æ¯ GNU awk çå页快éåèå¤å¿åï¼å
¶ä¸æ¶µçäºå¸¸ç¨ç awk 表达å¼åå½ä»¤ã
该ç¨åºå¯ç¨äºéæ©æä»¶ä¸çç¹å®è®°å½å¹¶å¯¹å ¶æ§è¡æä½
$ awk -F: '{print $1, $NF}' /etc/passwd
| - | - | - |
|---|---|---|
-F: | åå·ä½ä¸ºåé符 | |
{...} | awk ç¨åº | |
print | æå°å½åè®°å½ | |
$1 | 第ä¸ä¸ªå段 | |
$NF | æåä¸ä¸ªå段 | |
/etc/passwd | è¾å ¥æ°æ®æä»¶ |
BEGIN {<åå§å>}
<pattern 1> {<计åå¨ä½>}
<pattern 2> {<计åå¨ä½>}
...
END {< æåçå¨ä½ >}
awk '
BEGIN { print "\n>>>Start" }
!/(login|shutdown)/ { print NR, $0 }
END { print "<<<END\n" }
' /etc/passwd
$1 $2/$(NF-1) $3/$NF
â¼ â¼ â¼
ââââââââ¬âââââââââââââââ¬ââââââââ
$0/NR â¶ â ID â WEBSITE â URI â
ââââââââ¼âââââââââââââââ¼ââââââââ¤
$0/NR â¶ â 1 â baidu.com â awk â
ââââââââ¼âââââââââââââââ¼ââââââââ¤
$0/NR â¶ â 2 â google.com â 25 â
ââââââââ´âââââââââââââââ´ââââââââ
# 第ä¸ä¸ªåæåä¸ä¸ªå段
awk -F: '{print $1,$NF}' /etc/passwd
# 带è¡å·
awk -F: '{print NR, $0}' /etc/passwd
# åæ°ç¬¬äºä¸ªå段
awk -F: '{print $(NF-1)}' /etc/passwd
# èªå®ä¹å符串
awk -F: '{print $1 "=" $6}' /etc/passwd
æ¥ç: Awk åé
awk 'BEGIN {print "hello world"}' # æå° "hello world"
awk -F: '{print $1}' /etc/passwd # -F: æå®å段åé符
# /pattern/ ä»
对å¹é
çæ¨¡å¼æ§è¡æä½
awk -F: '/root/ {print $1}' /etc/passwd
# BEGIN åå¨å¼å§æ¶æ§è¡ä¸æ¬¡
awk -F: 'BEGIN { print "uid"} { print $1 }' /etc/passwd
# END å卿忧è¡ä¸æ¬¡
awk -F: '{print $1} END { print "-done-"}' /etc/passwd
awk -F: '$3>30 {print $1}' /etc/passwd
æ¥ç: Conditions æ¡ä»¶
awk 'BEGIN{
while (a++ < 1000)
s=s " ";
print s
}'
æ¥ç: Loops
awk 'BEGIN {
fruits["mango"] = "yellow";
fruits["orange"] = "orange"
for(fruit in fruits) {
print fruit " çé¢è²æ¯ " fruits[fruit]
}
}'
æ¥ç: Awk æ°ç»
# => 5
awk 'BEGIN{print length("hello")}'
# => HELLO
awk 'BEGIN{print toupper("hello")}'
# => hel
awk 'BEGIN{print substr("hello", 1, 3)}'
æ¥ç: Functions
| :- | :- |
|---|---|
$0 | å ¨çº¿ |
$1, $2...$NF | 第ä¸ä¸ªï¼ç¬¬äºä¸ªâ¦â¦æåä¸ä¸ªå段 |
NR | è®°å½æ»æ°(Number of Records) |
NF | Nä¸ªåæ®µ(Nnumber of Fields) |
OFS | Output Field Separatorè¾åºå段åé符 (default " ") |
FS | input Field Separator è¾å ¥å段åé符 (default " ") |
ORS | Output Record Separator è¾åºè®°å½åé符 (default "\n") |
RS | input Record Separator è¾å ¥è®°å½åé符 (default "\n") |
FILENAME | æä»¶å |
| :- | :- |
|---|---|
$1 == "root" | 第ä¸ä¸ªå段çäºæ ¹ |
{print $(NF-1)} | åæ°ç¬¬äºä¸ªå段 |
NR!=1{print $0} | ä»ç¬¬ 2 æ¡è®°å½å¼å§ |
NR > 3 | ä»ç¬¬ 4 æ¡è®°å½å¼å§ |
NR == 1 | ç¬¬ä¸æ¬¡è®°å½ |
END{print NR} | æ»è®°å½ |
BEGIN{print OFMT} | è¾åºæ ¼å¼ |
{print NR, $0} | è¡å· |
{print NR " " $0} | è¡å·(é项å¡) |
{$1 = NR; print} | ç¨è¡å·æ¿æ¢ç¬¬ä¸ä¸ªå段 |
$NF > 4 | æåä¸ä¸ªå段 > 4 |
NR % 2 == 0 | çè³è®°å½ |
NR==10, NR==20 | è®°å½ 10 å° 20 |
BEGIN{print ARGC} | æ» arguments |
ORS=NR%5?",":"\n" | è¿æ¥è®°å½ |
æå°æ»ååå¹³åå¼
awk -F: '{sum += $3}
END { print sum, sum/NR }
' /etc/passwd
æå°åæ°
awk 'BEGIN {
for (i = 1; i < ARGC; i++)
print ARGV[i] }' a b c
è¾åºå段åé符为éå·
awk 'BEGIN { FS=":";OFS=","}
{print $1,$2,$3,$4}' /etc/passwd
å¹é ä½ç½®
awk 'BEGIN {
if (match("One Two Three", "Tw"))
print RSTART }'
å¹é æ¶é¿
awk 'BEGIN {
if (match("One Two Three", "re"))
print RLENGTH }'
| :- | :- |
|---|---|
ENVIRON | ç¯å¢åé |
IGNORECASE | 忽ç¥å¤§å°å |
CONVFMT | è½¬æ¢æ ¼å¼ |
ERRNO | ç³»ç»é误 |
FIELDWIDTHS | åºå®å®½åº¦å段 |
| :- | :- |
|---|---|
ARGC | æ°åæåæ° |
ARGV | åæ°æ°ç» |
FNR | æä»¶è®°å½æ°(File Number of Records) |
OFMT | æ°åæ ¼å¼ (default "%.6g") |
RSTART | å符串ä¸çä½ç½® |
RLENGTH | æ¯èµæ¶é¿ |
SUBSEP | å¤ç»´æ°ç»åé符 (default "\034") |
ARGIND | åæ°ç´¢å¼ |
awk -v var1="Hello" -v var2="Wold" '
END {print var1, var2}
' </dev/null
awk -v varName="$PWD" '
END {print varName}' </dev/null
| :- | :- |
|---|---|
{print $1} | 第ä¸ä¸ªå段 |
$2 == "foo" | çäº |
$2 != "foo" | ä¸çäº |
"foo" in array | 卿°ç»ä¸ |
| :- | :- |
|---|---|
/regex/ | è¡å¹é |
!/regex/ | è¡ä¸å¹é |
$1 ~ /regex/ | åæ®µå¹é |
$1 !~ /regex/ | åæ®µä¸å¹é |
| :- | :- |
|---|---|
($2 <= 4 || $3 < 20) | æè |
($1 == 4 && $3 < 20) | å |
+-*/%++--+=-=*=/=%===!=<><=>=awk 'BEGIN {
if ("foo" ~ "^fo+$")
print "Fooey!";
}'
awk 'BEGIN {
if ("boo" !~ "^fo+$")
print "Boo!";
}'
awk 'BEGIN {
assoc["foo"] = "bar";
assoc["bar"] = "baz";
if ("foo" in assoc)
print "Fooey!";
}'
| 彿° | æè¿° |
|---|---|
index(s,t) | å符串 s ä¸åºç°å符串 t çä½ç½®ï¼å¦ææªæ¾å°å为 0 |
length(s) | å符串 s çé¿åº¦(å¦ææ²¡æ argï¼å为 $0) |
rand | 0 å° 1 ä¹é´çéæºæ° |
substr(s,index,len) | è¿åä»ç´¢å¼å¼å§ç s ç len-char åå符串(ä» 1 å¼å§è®¡æ°) |
srand | 为 rand 设置ç§åå¹¶è¿åä¹åçç§å |
int(x) | å° x æªæä¸ºæ´æ°å¼ |
split(s,a,fs) | å°å符串 s æå为æ°ç» a ç± fs æåï¼è¿å a çé¿åº¦ |
match(s,r) | å符串 s ä¸åºç°æ£åè¡¨è¾¾å¼ r çä½ç½®ï¼å¦ææªæ¾å°ï¼å为 0 |
sub(r,t,s) | å° t æ¿æ¢ä¸ºå符串 s ä¸ç¬¬ä¸æ¬¡åºç°çæ£åè¡¨è¾¾å¼ r(妿æªç»åº sï¼åæ¿æ¢ä¸º $0) |
gsub(r,t,s) | ç¨ t æ¿æ¢å符串 s 䏿æåºç°çæ£åè¡¨è¾¾å¼ r |
system(cmd) | æ§è¡cmdå¹¶è¿åéåºç¶æ |
tolower(s) | å符串 s 转å°å |
toupper(s) | å符串 s 转大å |
getline | å° $0 设置为å½åè¾å
¥æä»¶ä¸çä¸ä¸ä¸ªè¾å
¥è®°å½ |
awk '
# è¿åæå°æ°é
function find_min(num1, num2){
if (num1 < num2)
return num1
return num2
}
# è¿åæå¤§æ°é
function find_max(num1, num2){
if (num1 > num2)
return num1
return num2
}
# 主åè½
function main(num1, num2){
result = find_min(num1, num2)
print "Minimum =", result
result = find_max(num1, num2)
print "Maximum =", result
}
# èæ¬æ§è¡ä»è¿éå¼å§
BEGIN {
main(10, 60)
}
'
awk 'BEGIN {
arr[0] = "foo";
arr[1] = "bar";
print(arr[0]); # => foo
delete arr[0];
print(arr[0]); # => ""
}'
awk 'BEGIN {
assoc["foo"] = "bar";
assoc["bar"] = "baz";
print("baz" in assoc); # => 0
print("foo" in assoc); # => 1
}'
awk 'BEGIN {
split("foo:bar:baz", arr, ":");
for (key in arr)
print arr[key];
}'
awk 'BEGIN {
arr[0] = 3
arr[1] = 2
arr[2] = 4
n = asort(arr)
for (i = 1; i <= n ; i++)
print(arr[i])
}'
awk 'BEGIN {
multidim[0,0] = "foo";
multidim[0,1] = "bar";
multidim[1,0] = "baz";
multidim[1,1] = "boo";
}'
awk 'BEGIN {
array[1,2]=3;
array[2,3]=5;
for (comb in array) {
split(comb,sep,SUBSEP);
print sep[1], sep[2],
array[sep[1],sep[2]]
}
}'
awk -v count=2 'BEGIN {
if (count == 1)
print "Yes";
else
print "Huh?";
}'
awk -v count=2 'BEGIN {
print (count==1) ? "Yes" : "Huh?";
}'
awk 'BEGIN {
assoc["foo"] = "bar";
assoc["bar"] = "baz";
if ("foo" in assoc)
print "Fooey!";
}'
awk 'BEGIN {
assoc["foo"] = "bar";
assoc["bar"] = "baz";
if ("Huh" in assoc == 0 )
print "Huh!";
}'
awk -F: '{
switch (NR * 2 + 1) {
case 3:
case "11":
print NR - 1
break
case /2[[:digit:]]+/:
print NR
default:
print NR + 1
case -1:
print NR * -1
}
}' /etc/passwd
awk 'BEGIN {
for (i = 0; i < 10; i++)
print "i=" i;
}'
awk 'BEGIN {
for (i = 1; i <= 100; i *= 2)
print i
}'
awk 'BEGIN {
assoc["key1"] = "val1"
assoc["key2"] = "val2"
for (key in assoc)
print assoc[key];
}'
awk 'BEGIN {
for (argnum in ARGV)
print ARGV[argnum];
}' a b c
awk -F: '{ x[NR] = $0 }
END {
for (i = NR; i > 0; i--)
print x[i]
}
' /etc/passwd
awk -F: '{
for (i = NF; i > 0; i--)
printf("%s ",$i);
print ""
}' /etc/passwd
awk -F: '{
s=0;
for (i = 1; i <= NF; i++)
s += $i;
print s
}' /etc/passwd
awk -F: '
{for (i = 1; i <= NF; i++)
s += $i;
};
END{print s}
' /etc/passwd
awk 'BEGIN {
while (a < 10) {
print "- " " concatenation: " a
a++;
}
}'
awk '{
i = 1
do {
print $0
i++
} while (i <= 5)
}' /etc/passwd
awk 'BEGIN {
break_num = 5
for (i = 0; i < 10; i++) {
print i
if (i == break_num)
break
}
}'
awk 'BEGIN {
for (x = 0; x <= 10; x++) {
if (x == 5 || x == 6)
continue
printf "%d ", x
}
print ""
}'
awk 'BEGIN{printf "|%10s|\n", "hello"}'
# | hello|
awk 'BEGIN{printf "|%-10s|\n", "hello"}'
# |hello |
| ç¹å¾ç¬¦ | æè¿° |
|---|---|
c | ASCII å符 |
d | åè¿å¶æ´æ° |
e, E, f | æµ®ç¹æ ¼å¼ |
o | æ 符å·å «è¿å¶å¼ |
s | ç»ç»³ |
% | æåç¾åæ¯ |
awk -F: '{
printf "%-10s %s\n", $1, $(NF-1)
}' /etc/passwd | head -n 3
è¾åº
root /root
bin /bin
daemon /sbin
awk -F: 'BEGIN {
printf "%-10s %s\n", "User", "Home"
printf "%-10s %s\n", "----","----"}
{ printf "%-10s %s\n", $1, $(NF-1) }
' /etc/passwd | head -n 5
è¾åº
User Home
---- ----
root /root
bin /bin
daemon /sbin
\^$.[]|()*+?| :- | :- |
|---|---|
\b | éæ ¼ |
\f | æ¢é¡µ |
\n | æ¢è¡(æ¢è¡) |
\r | å车 |
\t | æ°´å¹³éé¡¹å¡ |
\v | åç´éé¡¹å¡ |
$ cat demo.awk
#!/usr/bin/awk -f
BEGIN { x = 23 }
{ x += 2 }
END { print x }
$ awk -f demo.awk /etc/passwd
69