這是 的單頁快速參考備忘單,其中涵蓋了常用的 awk
表達式和命令。
該程序可(ke)用于選擇文件中的(de)特(te)定(ding)記錄并對(dui)其執行操作
$ 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
# 倒(dao)數第二個字段
awk -F: '{print $(NF-1)}' /etc/passwd
# 自(zi)定義(yi)字(zi)符(fu)串
awk -F: '{print $1 "=" $6}' /etc/passwd
查看: Awk 變量
awk 'BEGIN {print "hello world"}' # 打印(yin) "hello world"
awk -F: '{print $1}' /etc/passwd # -F: 指定(ding)字段分隔符
# /pattern/ 僅對匹(pi)配的模(mo)式執行操作
awk -F: '/root/ {print $1}' /etc/passwd
# BEGIN 塊在(zai)開始時執(zhi)行一次(ci)
awk -F: 'BEGIN { print "uid"} { print $1 }' /etc/passwd
# END 塊在最后(hou)執行一次
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 | 記錄總數(N umber of R ecords) |
NF | N個字段(N number of F ields) |
OFS | O utput F ield S eparator輸出字段分隔符 (default " ") |
FS | input F ield S eparator 輸入字段分隔符 (default " ") |
ORS | O utput R ecord S eparator 輸出記錄分隔符 (default "\n") |
RS | input R ecord S eparator 輸入記錄分隔符 (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
輸出字段分(fen)隔符(fu)為逗(dou)號(hao)
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 | 文件記錄數(F ile N umber of R ecords) |
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
}
# 腳本執行從這里開始(shi)
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