1 AWK コマンド
pattern {
action }
pattern
パターン マッチングを示し、action
操作を示します。どちらもオプションであり、中括弧で区別されます。
{action}
複数のファイルを後で追加することも、以下を使用することもできます-f
。
awk 'program' input files
awk -f progfile optional list of input files
ビルドデータ:
$ touch emp.data
$ vi emp.data
$ cat emp.data
Beth 4.00 0
Dan 3.75 0
Kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
2 フィールドの抽出
awk は、フィールドから始めて$
フィールドを抽出し、次に行全体を抽出します。1
0
{
print $1, $3 }
{
print $O }
{
print }
3 フィールド数を計算する
NF: フィールドの数。$NF
最後のフィールドを示します。
$ awk ' {print NF, $1, $NF}' emp.data
3 Beth 0
3 Dan 0
...
4 読み取った行数をカウントする
NR:これまでに読み込んだ行数をカウントします
$ awk ' {print NR, $0}' emp.data
1 Beth 4.00 0
2 Dan 3.75 0
...
5 印刷フィールドにテキストを追加します
$ awk '{print "line number:",NR, $0}' emp.data
line number: 1 Beth 4.00 0
line number: 2 Dan 3.75 0
...
6%
印刷によるさまざまなフォーマット
$ awk '{printf("total pay for %s is $%.2f\n", $1, $2 * $3)}' emp.data
total pay for Beth is $0.00
total pay for Dan is $0.00
...
# -8表示8个字符并向左对齐
$ awk '{ printf("%-8s $%6.2f\n", $1, $2 * $3) }' emp.data
Beth $ 0.00
Dan $ 0.00
...
7人のオペレーター
$ awk '$3>0 {print $1, $2*$3}' emp.data
Kathy 40
Mark 100
...
$ awk '$2 >=5 || $3 >= 20 {print $0}' emp.data
Mark 5.00 20
Mary 5.50 22
$ awk '$1=="Susie" {print $0}' emp.data
Susie 4.25 18
$ awk '!($2<5 && $3<20) {print $0}' emp.data
Mark 5.00 20
Mary 5.50 22
8 始まりと終わり
特別なパターンBEGIN
は、最初の入力ファイルの最初の行が読み取られる前、およびEND
最後のファイルの最後の行が処理された後に一致します。
# print "", 打印空白行
$ awk 'BEGIN { print "NAME RATE HOURS";print ""}{print}' emp.data
NAME RATE HOURS
Beth 4.00 0
Dan 3.75 0
...
$ awk '{pay=pay+$2*$3}
END {print NR, "employees"
print "total pay is ", pay
print "average pay is", pay/NR}' emp.data
6 employees
total pay is 337.5
average pay is 56.25
9文字処理
# 像处理数字一样处理文本
$ awk '$2>maxrate {maxrate=$2;maxemp=$1}
END {print "highest hourly rate:",maxrate,"for",maxemp}' emp.data
highest hourly rate: 5.50 for Mary
# 字符串连接
$ awk '{names=names $1 " "} END {print names}' emp.data
Beth Dan Kathy Mark Mary Susie
# 打印最后一行
$ awk '{last =$0} END {print last}' emp.data
Susie 4.25 18
10の内蔵関数
$ awk '{print $1, length($1)}' emp.data
Beth 4
Dan 3
...
$ awk '{nc=nc+length($0)+1
nw=nw+NF}
END {print NR , "lines,",nw,"words,",nc,"characters"}' emp.data
6 lines, 18 words, 77 characters
11 制御フロー
$ awk '$2>6 {n=n+1;pay=pay+$1*$3}
END {if (n>0)
print n, "employees, total pay is",pay
else
print "no employees are paid more than $6/hour"
}' emp.data
no employees are paid more than $6/hour
$ awk '{i=1;while(i <=2){print $1;i=i+1}}' emp.data
$ awk '{for (i=1;i<=3;i++) printf $2}' emp.data
12 個の処理アレイ
line[NR]=$0
、各行をline
配列に割り当てます。
~$ awk '{line[NR]=$0} END {i=NR;while (i>0){print line[i];i--}}' emp.data
Susie 4.25 18
Mary 5.50 22
...
13 ワンライナー