分类: LINUX
2009-11-04 16:10:31
awk實例(基礎)
print
printf 函數控制輸出格式
date|awk '{print "Month:" $2 "\nYear:" ,$6}'
printf("The number of arguments,ARGC=%d\n",ARGC)
printf 用括號,混合轉換字符一起輸出,要不然使用如下格式
printf %-10s\t%.2f\t%20s\n,$1,$2,$3
[haibin.xie@test ~]$ echo "linux"|awk '{printf "|%-15s|\n",$1}'
|linux |
[haibin.xie@test ~]$ echo "linux"|awk '{printf "|%15s|\n",$1}'
| linux|
[root@test awk]# awk '{printf "The name is: %-15s ID is %8d\n",$1,$3}' employees
The name is: Tom ID is 4424
The name is: Marry ID is 5346
The name is: Sally ID is 1654
The name is: Billy ID is 1683
轉換字符
c 字符
s 字符串
d 十進制數
ld 長十進制數
u 無正負的十進制數
lu 長的無正負之分的十進制數
x 十六進制數
lx 長十六進制數
o 八進制數
lo 長八進制數
e 用科學記數法記錄的浮點數
f 浮點數
g 使用e或者f函數處理過的浮點數,占用最少的空間
輸出小數點后几位用浮點數,如后兩位 %.2f
print 函數可以設置 OFMT 變量,以控制數字的小數位,如:OFMT="%.2f"
====================================================================
[root@test awk]# awk '{print NR,$1,$2,$5, NF}' employees
1 Tom Jones 543354 5
2 Marry Adams 28765 5
3 Sally Chang 65000 5
4 Billy Black 336500 5
[root@test awk]# awk -F '[:\t]' '/Tom Jones/{print $1,$2,$5}' employees2
Tom Jones 4424 543354
可以指定多個分隔符,分隔符都會同時起作用。。
[root@test awk]# awk -F: '/Tom Jones/{print $0}' employees2
Tom Jones:4424:5/12/66: 543354
[root@test awk]# awk '/^[A-Z][a-z]+/' employees2
Tom Jones:4424:5/12/66: 543354
Mary Adams:5346:11/4/63:28765
Sally Chang:1654:7/22/54:650000
Billy Black:1683:9/23/44 336500
[root@test awk]# awk '$1 ~ /[Bb]ill/' employees
Billy Black 1683 9/23/44 336500
[root@test awk]# awk '$1 !~ /[Bb]ill/' employees
Tom Jones 4424 5/12/66 543354
Marry Adams 5346 11/4/63 28765
Sally Chang 1654 7/22/54 65000
[root@test awk]# awk '$5 ~ /[7-9]+/' employees
Marry Adams 5346 11/4/63 28765
一個或多個7-9之間的數
[root@test awk]# awk '$2 !~ /C/{print $1,$2}' employees
Tom Jones
Marry Adams
Billy Black
第二個域不包含字母C就打印域1,2
關系運算符
< x
== x==y
!= x!=y
>= x>=y
> x>y
~ x~/y/
!~ x!~/y/
awk '$3 * $4 > 500' filename
數學運算符
+ x+y
- x-y
* x*y
/ x/y 除
% x%y 取余
^ x^y 乘方
邏輯運算符
&& 邏輯和(AND)
|| 邏輯或(OR)
! 邏輯非(NOT)
awk '$2 > 5 && $2 <= 15' filename
awk '!($2 < 100 && $3 < 20}' filename 如果兩個條件均為真,則對結果求反
awk '/Tom/,/Suzanne/' file 范圍模板,打印兩個匹配間的行,如果最后一個未找到,則打印到文件的末尾
[root@test awk]# awk '{print ($7 > 28 ? "high "$7:"low "$7)}' grade.txt
high 44
low 26
low 28
low 26
low 28
符合條件時打印?后的字符串否則打印冒號后面的字符串
awk '$3 == "Chris" {$3 = "Christian"; print}' datafile
awk '/Derek/{$8 += 12; print $8}' datafile
awk '{$7 %= 3;print $7}' datafile