AWK字符串处理的例子

awk 'BEGIN {start_action} {action} END {stop_action}' filename

####示例文件
$ cat test.txt
-rw-r--r-- 1 center center  0 Dec  8 21:39 p1
-rw-r--r-- 1 center center 17 Dec  8 21:15 t1
-rw-r--r-- 1 center center 26 Dec  8 21:38 t2
-rw-r--r-- 1 center center 25 Dec  8 21:38 t3
-rw-r--r-- 1 center center 43 Dec  8 21:39 t4
-rw-r--r-- 1 center center 48 Dec  8 21:39 t5
####打印文件的第一列
$ awk '{print $1}' test.txt
-rw-r--r--
-rw-r--r--
-rw-r--r--
-rw-r--r--
-rw-r--r--
-rw-r--r--
####打印第4,5列
$ awk '{print $4,$5}' test.txt
center 0
center 17
center 26
center 25
center 43
center 48
$
$ awk 'BEGIN {sum=0} {sum=sum+$5} END {print sum}' test.txt
159
$
$ cat sum_column
#!/usr/bin/awk -f
BEGIN {sum=0}
{sum=sum+$5}
END {print sum}
$

$ awk -f sum_column test.txt
159
$

$ awk '{ if($9 == "t4") print $0;}' test.txt
-rw-r--r-- 1 center center 43 Dec  8 21:39 t4
$

$ awk 'BEGIN { for(i=1;i<=5;i++) print "square of", i, "is",i*i; }'
square of 1 is 1
square of 2 is 4
square of 3 is 9
square of 4 is 16
square of 5 is 25
$

####使用不同的field separator
$ awk 'BEGIN {FS=":"} {print $2}' test.txt
39 p1
15 t1
38 t2
38 t3
39 t4
39 t5
$
####使用不同的field separator
$ awk -F: '{print $2}' test.txt
39 p1
15 t1
38 t2
38 t3
39 t4
39 t5
$

####OFS - 输出列分割符
$ awk 'BEGIN {OFS=":"} {print $4,$5}' test.txt
center:0
center:17
center:26
center:25
center:43
center:48


$ awk 'BEGIN {OFS=":"} {print $4$5}' test.txt
center0
center17
center26
center25
center43
center48
$

####一行的列数
####NF - Number of fileds variable:
####输出每行的列数
$ awk '{print NF}' test.txt
9
9
9
9
9
9
$
####显示行号
####NR - number of records variable:
####The NR can be used to know the line number or count of lines in a file.
$ awk '{print NR}' test.txt
1
2
3
4
5
6
$
####This will display the total number of lines in the file.
$ awk 'END {print NR}' test.txt
6


####AWK中的一些字符串函数
index(string,search)
length(string)
split(string,array,separator)
substr(string,position)
substr(string,position,max)
tolower(string)
toupper(string)

####split举例
$ awk '{ split($2,arr,","); if(arr[3] == "UNIX") print $0}' file.txt
1 U,N,UNIX,000
3 I,M,UNIX,222
$

$ cat file.txt
1 A
2 B
3 C
4 D
5 E
6 F

####要在每两行后面插入一行 9 Z
$ awk '{ if(NR%2 == 0) { print $0"\n9 Z"; } else { print $0 } }' file.txt
1 A
2 B
9 Z
3 C
4 D
9 Z
5 E
6 F
9 Z
$



$ cat file.txt
AAA 1
BBB 2
CCC 3
AAA 4
AAA 5
BBB 6
CCC 7
AAA 8
BBB 9
AAA 0
$

####要把第4个出现的AAA变成ZZZ
$ awk 'BEGIN {count=0} { if($1 == "AAA") { count++ } if(count == 4) { sub("AAA","ZZZ",$1) } } { print $0 }' file.txt
AAA 1
BBB 2
CCC 3
AAA 4
AAA 5
BBB 6
CCC 7
ZZZ 8
BBB 9
AAA 0
$
$ awk 'BEGIN {count=0} { if($1 == "AAA") { count++ } if(count == 4) { sub("AAA","ZZZ",$1) } print $0 }' file.txt'
AAA 1
BBB 2
CCC 3
AAA 4
AAA 5
BBB 6
CCC 7
ZZZ 8
BBB 9
AAA 0
$

$ cat file.txt
A 10
B 39
C 22
D 44
E 75
F 89
G 67
$

####获取第二列,奇数行的和,偶数行的和
$ awk '{ if(NR%2 == 1) { sum_e = sum_e + $2 } else { sum_o = sum_o + $2 } } END { print sum_e,sum_o }' file.txt
174 172
$

####Fibonacci series using awk command
$ awk ' BEGIN{ for(i=0;i<=10;i++) { if (i <=1 ) { x=0; y=1; print i; } else { z=x+y; print z; x=y; y=z; } } }'
0
1
1
2
3
5
8
13
21
34
55
$
$ cat file.txt
0012345
05678
01010
00001
$
####去掉开头的0
$ awk '{print $1 + 0}' file.txt
12345
5678
1010
1
$

$ awk '{printf "%d\n",$0}' file.txt
12345
5678
1010
1
$
$ cat test.txt
0001|20081223efskjfdj|EREADFASDLKJCV
0002|20081208djfksdaa|JDKFJALSDJFsddf
0003|20081208efskjfdj|EREADFASDLKJCV
0004|20081211djfksdaa1234|JDKFJALSDJFsddf
$
####把每行第二列的数字去掉
$ awk -F '|' 'BEGIN{ OFS="|" } {sub(/[0-9]+/,"",$2);print $0}' test.txt
0001|efskjfdj|EREADFASDLKJCV
0002|djfksdaa|JDKFJALSDJFsddf
0003|efskjfdj|EREADFASDLKJCV
0004|djfksdaa1234|JDKFJALSDJFsddf
$
$ awk -F '|' -v OFS='|' '{sub(/[0-9]+/,"",$2);print $0}' test.txt
0001|efskjfdj|EREADFASDLKJCV
0002|djfksdaa|JDKFJALSDJFsddf
0003|efskjfdj|EREADFASDLKJCV
0004|djfksdaa1234|JDKFJALSDJFsddf
$

awk的sub函数用法:
sub函数匹配指定域/记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。
如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。格式如下:
sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)
实例:
$ awk '{ sub(/test/, "mytest"); print }' testfile
$ awk '{ sub(/test/, "mytest", $1); print }' testfile
第一个例子在整个记录中匹配,替换只发生在每行第一次匹配发生的时候。
第二个例子在整个记录的第一个域中进行匹配,替换只发生在每行第一次匹配发生的时候。
如要在整个文件中进行匹配需要用到gsub
gsub函数作用如sub,但它在整个文档中进行匹配。格式如下:
gsub (regular expression, substitution string)
gsub (regular expression, substitution string, target string)
实例:
$ awk '{ gsub(/test/, "mytest"); print }' testfile
$ awk '{ gsub(/test/, "mytest", $1); print }' testfile
第一个例子在整个文档中匹配test,匹配的都被替换成mytest。
第二个例子在整个文档的第一个域中匹配,所有匹配的都被替换成mytest。
另外, 只有当记录中的域有改变的时候 ,指定OFS变量才有用, 如果记录中的域无变化, 指定OFS产生不了实际效果。
awk -F'|' -v OFS='|' '{ gsub(/[0-9]/, "", $3); print $0; }' data.txt   
将把第三个域中所有数字都去掉。
awk -F'|' -v OFS='|' '{ gsub(/[/x30-/x39]/, "", $3); print $0; }' data.txt
另外,对于数字的匹配,可以使用十六进制。

请使用浏览器的分享功能分享到微信等